From c316601dfa22f5ea58da2bff4d38fdb920acee97 Mon Sep 17 00:00:00 2001 From: robin-swift Date: Tue, 19 Jul 2022 20:01:23 +0100 Subject: [PATCH 1/8] hugo website translation --- .gitignore | 6 - .hugo_build.lock | 0 Makefile | 35 +- about.xml | 30 - api/2.0/index.html | 37 - bugs.xml | 57 - changelog.xml | 30 - config.toml | 129 ++ content/_index.md | 21 + {api => content/api}/2.0/libtest/test.txt | 0 {style => content}/default.css | 6 +- .../gimpcon}/2000/people-small.jpg | Bin .../gimpcon/2003/_index.md | 12 +- .../gimpcon/2003/gimpcon2003-mins-1.md | 9 +- .../gimpcon/2003/gimpcon2003-mins-2.md | 9 +- .../gimpcon/2003/gimpcon2003-mins-3.md | 9 +- .../gimpcon/2003/gimpcon2003-mins.md | 13 +- .../gimpcon}/2003/people-small.png | Bin {gimpcon => content/gimpcon}/2003/people.png | Bin .../gimpcon}/2004/Dave_Neary.jpg | Bin .../gimpcon}/2004/Oyvind_Kolas.png | Bin .../gimpcon/2004/_index.md | 10 +- .../gimpcon}/2004/gnu-head-sm.jpg | Bin .../gimpcon}/2004/mac_gimp_logo4.png | Bin .../2004/macosx_screenshot1_thumb.jpg | Bin .../gimpcon/2006/_index.md | 9 +- .../gimpcon}/2006/meetings.jpg | Bin .../gimpcon}/2006/meetings_small.jpg | Bin {gimpcon => content/gimpcon}/2006/people.jpg | Bin .../gimpcon}/2006/people_small.jpg | Bin gimpcon.xml => content/gimpcon/_index.md | 26 +- content/homepage/CHANGELOG.md | 7 + content/homepage/_index.md | 21 + content/homepage/about.md | 18 + content/homepage/bugs.md | 28 + content/homepage/changelog.md | 17 + content/homepage/cvs.md | 11 + content/homepage/faq.md | 433 ++++ content/homepage/git.md | 138 ++ content/homepage/lists.md | 12 + content/homepage/plug-in-template.md | 24 + content/homepage/plug-ins.md | 19 + content/homepage/screenshots.md | 63 + .../homepage/standards.md | 97 +- .../images}/developer-barbg.png | Bin {images => content/images}/developer-left.png | Bin .../images}/developer-right.png | Bin {images => content/images}/shadow.gif | Bin {images => content/images}/shadow.png | Bin {images => content/images}/wilber-icon.png | Bin {images => content/images}/wilber.png | Bin layout.xml => content/layout.xml | 0 {screenshots => content/screenshots}/Makefile | 0 content/screenshots/gimp-curves-thumb.png | Bin 0 -> 77364 bytes .../screenshots}/gimp-curves.png | Bin content/screenshots/gimp-empty-thumb.png | Bin 0 -> 52625 bytes .../screenshots}/gimp-empty.png | Bin .../screenshots}/gimp-osx.jpeg | Bin content/screenshots/gimp-print-thumb.png | Bin 0 -> 37582 bytes .../screenshots}/gimp-print.png | Bin .../writing-a-plug-in/1.md | 107 +- .../writing-a-plug-in/2.md | 286 +-- .../writing-a-plug-in/3.md | 29 +- cvs.xml | 19 - dtd/autolayout.dtd | 101 - dtd/extensions.mod | 51 - dtd/forms.mod | 134 -- dtd/layout.dtd | 99 - dtd/namespaces.mod | 54 - dtd/rddl.mod | 40 - dtd/website-custom.dtd | 55 - dtd/website-full.dtd | 40 - dtd/website.dtd | 1993 ----------------- dtd/website.mod | 109 - faq.xml | 812 ------- gimpcon2000.xml | 56 - git.xml | 145 -- index.xml | 37 - mailing-lists.xml | 17 - plug-in-template.xml | 36 - plug-ins.xml | 36 - public/404.html | 131 ++ public/about.html | 142 ++ public/api/2.0/libtest/test.txt | 1 + public/apple-touch-icon-144-precomposed.png | Bin 0 -> 570 bytes public/bugs.html | 151 ++ public/categories/index.html | 133 ++ public/categories/index.xml | 11 + public/changelog.html | 139 ++ public/css/hyde.css | 300 +++ public/css/poole.css | 404 ++++ public/css/print.css | 19 + public/css/syntax.css | 66 + public/cvs.html | 136 ++ public/default.css | 300 +++ public/favicon.png | Bin 0 -> 183 bytes public/gimpcon/2000/people-small.jpg | Bin 0 -> 49236 bytes .../2003/gimpcon2003-mins-1/index.html | 372 +++ .../2003/gimpcon2003-mins-2/index.html | 428 ++++ .../2003/gimpcon2003-mins-3/index.html | 313 +++ .../gimpcon/2003/gimpcon2003-mins/index.html | 260 +++ public/gimpcon/2003/index.html | 141 ++ public/gimpcon/2003/index.xml | 47 + public/gimpcon/2003/people-small.png | Bin 0 -> 244483 bytes public/gimpcon/2003/people.png | Bin 0 -> 1047014 bytes public/gimpcon/2004/Dave_Neary.jpg | Bin 0 -> 7489 bytes public/gimpcon/2004/Oyvind_Kolas.png | Bin 0 -> 50772 bytes public/gimpcon/2004/gnu-head-sm.jpg | Bin 0 -> 5286 bytes public/gimpcon/2004/index.html | 133 ++ public/gimpcon/2004/index.xml | 11 + public/gimpcon/2004/mac_gimp_logo4.png | Bin 0 -> 11474 bytes .../gimpcon/2004/macosx_screenshot1_thumb.jpg | Bin 0 -> 14879 bytes public/gimpcon/2006/index.html | 133 ++ public/gimpcon/2006/index.xml | 11 + public/gimpcon/2006/meetings.jpg | Bin 0 -> 220989 bytes public/gimpcon/2006/meetings_small.jpg | Bin 0 -> 33965 bytes public/gimpcon/2006/people.jpg | Bin 0 -> 281806 bytes public/gimpcon/2006/people_small.jpg | Bin 0 -> 38999 bytes public/gimpcon/index.html | 139 ++ public/gimpcon/index.xml | 11 + public/git.html | 142 ++ public/homepage/faq/index.html | 446 ++++ public/homepage/plug-ins/index.html | 145 ++ public/homepage/screenshots/index.html | 143 ++ public/images/developer-barbg.png | Bin 0 -> 152 bytes public/images/developer-left.png | Bin 0 -> 12513 bytes public/images/developer-right.png | Bin 0 -> 20340 bytes public/images/shadow.gif | Bin 0 -> 4364 bytes public/images/shadow.png | Bin 0 -> 3403 bytes public/images/wilber-icon.png | Bin 0 -> 765 bytes public/images/wilber.png | Bin 0 -> 6340 bytes public/index.html | 119 + public/index.xml | 189 ++ public/layout.xml | 118 + public/lists.html | 136 ++ public/plug-in-template.html | 146 ++ public/screenshots/Makefile | 19 + public/screenshots/gimp-curves-thumb.png | Bin 0 -> 77364 bytes public/screenshots/gimp-curves.png | Bin 0 -> 89683 bytes public/screenshots/gimp-empty-thumb.png | Bin 0 -> 52625 bytes public/screenshots/gimp-empty.png | Bin 0 -> 189512 bytes public/screenshots/gimp-osx.jpeg | Bin 0 -> 171210 bytes public/screenshots/gimp-print-thumb.png | Bin 0 -> 37582 bytes public/screenshots/gimp-print.png | Bin 0 -> 64286 bytes public/sitemap.xml | 71 + public/standards.html | 265 +++ public/tags/index.html | 133 ++ public/tags/index.xml | 11 + public/writing-a-plug-in/1/index.html | 512 +++++ public/writing-a-plug-in/2/index.html | 600 +++++ public/writing-a-plug-in/3/index.html | 1014 +++++++++ public/writing-a-plug-in/index.html | 139 ++ public/writing-a-plug-in/index.xml | 45 + screenshots.xml | 61 - themes/hyde/CHANGELOG.md | 7 + themes/hyde/LICENSE.md | 9 + themes/hyde/README.md | 1 + themes/hyde/archetypes/default.md | 6 + themes/hyde/go.mod | 3 + themes/hyde/images/screenshot.png | Bin 0 -> 447363 bytes themes/hyde/images/tn.png | Bin 0 -> 145312 bytes themes/hyde/layouts/404.html | 4 + themes/hyde/layouts/_default/baseof.html | 43 + themes/hyde/layouts/_default/list.html | 9 + themes/hyde/layouts/_default/single.html | 7 + themes/hyde/layouts/index.html | 18 + themes/hyde/layouts/partials/head.html | 33 + themes/hyde/layouts/partials/head_fonts.html | 1 + .../hyde/layouts/partials/hook_head_end.html | 0 themes/hyde/layouts/partials/sidebar.html | 8 + .../apple-touch-icon-144-precomposed.png | Bin 0 -> 570 bytes themes/hyde/static/css/hyde.css | 300 +++ themes/hyde/static/favicon.png | Bin 0 -> 183 bytes themes/hyde/theme.toml | 17 + writing-a-plug-in/1/architecture-small.png | Bin 10884 -> 0 bytes writing-a-plug-in/1/architecture.png | Bin 35991 -> 0 bytes writing-a-plug-in/1/hello.c | 84 - writing-a-plug-in/1/hello.png | Bin 14753 -> 0 bytes writing-a-plug-in/1/plug-in-details-small.png | Bin 29792 -> 0 bytes writing-a-plug-in/1/plug-in-details.png | Bin 98454 -> 0 bytes writing-a-plug-in/1/plug-in-menu-small.png | Bin 61710 -> 0 bytes writing-a-plug-in/1/plug-in-menu.png | Bin 136406 -> 0 bytes writing-a-plug-in/2/GimpImage-small.png | Bin 10265 -> 0 bytes writing-a-plug-in/2/GimpImage.png | Bin 39269 -> 0 bytes writing-a-plug-in/2/myblur1.c | 197 -- writing-a-plug-in/2/myblur2.c | 193 -- writing-a-plug-in/2/tiles-small.png | Bin 72313 -> 0 bytes writing-a-plug-in/2/tiles.png | Bin 679094 -> 0 bytes writing-a-plug-in/3/blur_dialog1.png | Bin 12295 -> 0 bytes writing-a-plug-in/3/blur_dialog2-small.png | Bin 15670 -> 0 bytes writing-a-plug-in/3/blur_dialog2.png | Bin 84408 -> 0 bytes writing-a-plug-in/3/blur_select-small.png | Bin 46700 -> 0 bytes writing-a-plug-in/3/blur_select.png | Bin 199690 -> 0 bytes writing-a-plug-in/3/glade-tree-small.png | Bin 7250 -> 0 bytes writing-a-plug-in/3/glade-tree.png | Bin 15925 -> 0 bytes writing-a-plug-in/3/myblur3.c | 282 --- writing-a-plug-in/3/myblur4.c | 394 ---- writing-a-plug-in/3/myblur5.c | 431 ---- xsl/VERSION | 5 - xsl/autolayout.xsl | 258 --- xsl/chunk-common.xsl | 182 -- xsl/chunk-tabular.xsl | 12 - xsl/chunk-website.xsl | 12 - xsl/head.xsl | 299 --- xsl/makefile-dep.xsl | 126 -- xsl/mine.xsl | 226 -- xsl/mytoc.xsl | 325 --- xsl/myxref.xsl | 56 - xsl/param.xsl | 377 ---- xsl/rss.xsl | 140 -- xsl/tabular.xsl | 210 -- xsl/toc-tabular.xsl | 481 ---- xsl/toc.xsl | 287 --- xsl/website-common.xsl | 761 ------- xsl/website.xsl | 133 -- xsl/xbel.xsl | 111 - 216 files changed, 9940 insertions(+), 10086 deletions(-) create mode 100644 .hugo_build.lock delete mode 100644 about.xml delete mode 100644 api/2.0/index.html delete mode 100644 bugs.xml delete mode 100644 changelog.xml create mode 100644 config.toml create mode 100644 content/_index.md rename {api => content/api}/2.0/libtest/test.txt (100%) rename {style => content}/default.css (95%) rename {gimpcon => content/gimpcon}/2000/people-small.jpg (100%) rename gimpcon2003.xml => content/gimpcon/2003/_index.md (83%) rename gimpcon2003-mins-1.xml => content/gimpcon/2003/gimpcon2003-mins-1.md (98%) rename gimpcon2003-mins-2.xml => content/gimpcon/2003/gimpcon2003-mins-2.md (98%) rename gimpcon2003-mins-3.xml => content/gimpcon/2003/gimpcon2003-mins-3.md (97%) rename gimpcon2003-mins.xml => content/gimpcon/2003/gimpcon2003-mins.md (91%) rename {gimpcon => content/gimpcon}/2003/people-small.png (100%) rename {gimpcon => content/gimpcon}/2003/people.png (100%) rename {gimpcon => content/gimpcon}/2004/Dave_Neary.jpg (100%) rename {gimpcon => content/gimpcon}/2004/Oyvind_Kolas.png (100%) rename gimpcon2004.xml => content/gimpcon/2004/_index.md (97%) rename {gimpcon => content/gimpcon}/2004/gnu-head-sm.jpg (100%) rename {gimpcon => content/gimpcon}/2004/mac_gimp_logo4.png (100%) rename {gimpcon => content/gimpcon}/2004/macosx_screenshot1_thumb.jpg (100%) rename gimpcon2006.xml => content/gimpcon/2006/_index.md (99%) rename {gimpcon => content/gimpcon}/2006/meetings.jpg (100%) rename {gimpcon => content/gimpcon}/2006/meetings_small.jpg (100%) rename {gimpcon => content/gimpcon}/2006/people.jpg (100%) rename {gimpcon => content/gimpcon}/2006/people_small.jpg (100%) rename gimpcon.xml => content/gimpcon/_index.md (63%) create mode 100644 content/homepage/CHANGELOG.md create mode 100644 content/homepage/_index.md create mode 100644 content/homepage/about.md create mode 100644 content/homepage/bugs.md create mode 100644 content/homepage/changelog.md create mode 100644 content/homepage/cvs.md create mode 100644 content/homepage/faq.md create mode 100644 content/homepage/git.md create mode 100644 content/homepage/lists.md create mode 100644 content/homepage/plug-in-template.md create mode 100644 content/homepage/plug-ins.md create mode 100644 content/homepage/screenshots.md rename standards.xml => content/homepage/standards.md (90%) rename {images => content/images}/developer-barbg.png (100%) rename {images => content/images}/developer-left.png (100%) rename {images => content/images}/developer-right.png (100%) rename {images => content/images}/shadow.gif (100%) rename {images => content/images}/shadow.png (100%) rename {images => content/images}/wilber-icon.png (100%) rename {images => content/images}/wilber.png (100%) rename layout.xml => content/layout.xml (100%) rename {screenshots => content/screenshots}/Makefile (100%) create mode 100644 content/screenshots/gimp-curves-thumb.png rename {screenshots => content/screenshots}/gimp-curves.png (100%) create mode 100644 content/screenshots/gimp-empty-thumb.png rename {screenshots => content/screenshots}/gimp-empty.png (100%) rename {screenshots => content/screenshots}/gimp-osx.jpeg (100%) create mode 100644 content/screenshots/gimp-print-thumb.png rename {screenshots => content/screenshots}/gimp-print.png (100%) rename writing-a-plug-in-1.xml => content/writing-a-plug-in/1.md (81%) rename writing-a-plug-in-2.xml => content/writing-a-plug-in/2.md (70%) rename writing-a-plug-in-3.xml => content/writing-a-plug-in/3.md (98%) delete mode 100644 cvs.xml delete mode 100644 dtd/autolayout.dtd delete mode 100644 dtd/extensions.mod delete mode 100644 dtd/forms.mod delete mode 100644 dtd/layout.dtd delete mode 100644 dtd/namespaces.mod delete mode 100644 dtd/rddl.mod delete mode 100644 dtd/website-custom.dtd delete mode 100644 dtd/website-full.dtd delete mode 100644 dtd/website.dtd delete mode 100644 dtd/website.mod delete mode 100644 faq.xml delete mode 100644 gimpcon2000.xml delete mode 100644 git.xml delete mode 100644 index.xml delete mode 100644 mailing-lists.xml delete mode 100644 plug-in-template.xml delete mode 100644 plug-ins.xml create mode 100644 public/404.html create mode 100644 public/about.html create mode 100644 public/api/2.0/libtest/test.txt create mode 100644 public/apple-touch-icon-144-precomposed.png create mode 100644 public/bugs.html create mode 100644 public/categories/index.html create mode 100644 public/categories/index.xml create mode 100644 public/changelog.html create mode 100644 public/css/hyde.css create mode 100644 public/css/poole.css create mode 100644 public/css/print.css create mode 100644 public/css/syntax.css create mode 100644 public/cvs.html create mode 100644 public/default.css create mode 100644 public/favicon.png create mode 100644 public/gimpcon/2000/people-small.jpg create mode 100644 public/gimpcon/2003/gimpcon2003-mins-1/index.html create mode 100644 public/gimpcon/2003/gimpcon2003-mins-2/index.html create mode 100644 public/gimpcon/2003/gimpcon2003-mins-3/index.html create mode 100644 public/gimpcon/2003/gimpcon2003-mins/index.html create mode 100644 public/gimpcon/2003/index.html create mode 100644 public/gimpcon/2003/index.xml create mode 100644 public/gimpcon/2003/people-small.png create mode 100644 public/gimpcon/2003/people.png create mode 100644 public/gimpcon/2004/Dave_Neary.jpg create mode 100644 public/gimpcon/2004/Oyvind_Kolas.png create mode 100644 public/gimpcon/2004/gnu-head-sm.jpg create mode 100644 public/gimpcon/2004/index.html create mode 100644 public/gimpcon/2004/index.xml create mode 100644 public/gimpcon/2004/mac_gimp_logo4.png create mode 100644 public/gimpcon/2004/macosx_screenshot1_thumb.jpg create mode 100644 public/gimpcon/2006/index.html create mode 100644 public/gimpcon/2006/index.xml create mode 100644 public/gimpcon/2006/meetings.jpg create mode 100644 public/gimpcon/2006/meetings_small.jpg create mode 100644 public/gimpcon/2006/people.jpg create mode 100644 public/gimpcon/2006/people_small.jpg create mode 100644 public/gimpcon/index.html create mode 100644 public/gimpcon/index.xml create mode 100644 public/git.html create mode 100644 public/homepage/faq/index.html create mode 100644 public/homepage/plug-ins/index.html create mode 100644 public/homepage/screenshots/index.html create mode 100644 public/images/developer-barbg.png create mode 100644 public/images/developer-left.png create mode 100644 public/images/developer-right.png create mode 100644 public/images/shadow.gif create mode 100644 public/images/shadow.png create mode 100644 public/images/wilber-icon.png create mode 100644 public/images/wilber.png create mode 100644 public/index.html create mode 100644 public/index.xml create mode 100644 public/layout.xml create mode 100644 public/lists.html create mode 100644 public/plug-in-template.html create mode 100644 public/screenshots/Makefile create mode 100644 public/screenshots/gimp-curves-thumb.png create mode 100644 public/screenshots/gimp-curves.png create mode 100644 public/screenshots/gimp-empty-thumb.png create mode 100644 public/screenshots/gimp-empty.png create mode 100644 public/screenshots/gimp-osx.jpeg create mode 100644 public/screenshots/gimp-print-thumb.png create mode 100644 public/screenshots/gimp-print.png create mode 100644 public/sitemap.xml create mode 100644 public/standards.html create mode 100644 public/tags/index.html create mode 100644 public/tags/index.xml create mode 100644 public/writing-a-plug-in/1/index.html create mode 100644 public/writing-a-plug-in/2/index.html create mode 100644 public/writing-a-plug-in/3/index.html create mode 100644 public/writing-a-plug-in/index.html create mode 100644 public/writing-a-plug-in/index.xml delete mode 100644 screenshots.xml create mode 100644 themes/hyde/CHANGELOG.md create mode 100644 themes/hyde/LICENSE.md create mode 100644 themes/hyde/README.md create mode 100644 themes/hyde/archetypes/default.md create mode 100644 themes/hyde/go.mod create mode 100644 themes/hyde/images/screenshot.png create mode 100644 themes/hyde/images/tn.png create mode 100644 themes/hyde/layouts/404.html create mode 100644 themes/hyde/layouts/_default/baseof.html create mode 100644 themes/hyde/layouts/_default/list.html create mode 100644 themes/hyde/layouts/_default/single.html create mode 100644 themes/hyde/layouts/index.html create mode 100644 themes/hyde/layouts/partials/head.html create mode 100644 themes/hyde/layouts/partials/head_fonts.html create mode 100644 themes/hyde/layouts/partials/hook_head_end.html create mode 100644 themes/hyde/layouts/partials/sidebar.html create mode 100644 themes/hyde/static/apple-touch-icon-144-precomposed.png create mode 100644 themes/hyde/static/css/hyde.css create mode 100644 themes/hyde/static/favicon.png create mode 100644 themes/hyde/theme.toml delete mode 100644 writing-a-plug-in/1/architecture-small.png delete mode 100644 writing-a-plug-in/1/architecture.png delete mode 100644 writing-a-plug-in/1/hello.c delete mode 100644 writing-a-plug-in/1/hello.png delete mode 100644 writing-a-plug-in/1/plug-in-details-small.png delete mode 100644 writing-a-plug-in/1/plug-in-details.png delete mode 100644 writing-a-plug-in/1/plug-in-menu-small.png delete mode 100644 writing-a-plug-in/1/plug-in-menu.png delete mode 100644 writing-a-plug-in/2/GimpImage-small.png delete mode 100644 writing-a-plug-in/2/GimpImage.png delete mode 100644 writing-a-plug-in/2/myblur1.c delete mode 100644 writing-a-plug-in/2/myblur2.c delete mode 100644 writing-a-plug-in/2/tiles-small.png delete mode 100644 writing-a-plug-in/2/tiles.png delete mode 100644 writing-a-plug-in/3/blur_dialog1.png delete mode 100644 writing-a-plug-in/3/blur_dialog2-small.png delete mode 100644 writing-a-plug-in/3/blur_dialog2.png delete mode 100644 writing-a-plug-in/3/blur_select-small.png delete mode 100644 writing-a-plug-in/3/blur_select.png delete mode 100644 writing-a-plug-in/3/glade-tree-small.png delete mode 100644 writing-a-plug-in/3/glade-tree.png delete mode 100644 writing-a-plug-in/3/myblur3.c delete mode 100644 writing-a-plug-in/3/myblur4.c delete mode 100644 writing-a-plug-in/3/myblur5.c delete mode 100644 xsl/VERSION delete mode 100644 xsl/autolayout.xsl delete mode 100644 xsl/chunk-common.xsl delete mode 100644 xsl/chunk-tabular.xsl delete mode 100644 xsl/chunk-website.xsl delete mode 100644 xsl/head.xsl delete mode 100644 xsl/makefile-dep.xsl delete mode 100644 xsl/mine.xsl delete mode 100644 xsl/mytoc.xsl delete mode 100644 xsl/myxref.xsl delete mode 100644 xsl/param.xsl delete mode 100644 xsl/rss.xsl delete mode 100644 xsl/tabular.xsl delete mode 100644 xsl/toc-tabular.xsl delete mode 100644 xsl/toc.xsl delete mode 100644 xsl/website-common.xsl delete mode 100644 xsl/website.xsl delete mode 100644 xsl/xbel.xsl diff --git a/.gitignore b/.gitignore index 714e072..e69de29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +0,0 @@ -*.html -autolayout.xml -depends.tabular -gimpcon -screenshots/*thumb.png -writing-a-plug-in diff --git a/.hugo_build.lock b/.hugo_build.lock new file mode 100644 index 0000000..e69de29 diff --git a/Makefile b/Makefile index fdc8d92..a208b3b 100644 --- a/Makefile +++ b/Makefile @@ -1,32 +1,5 @@ +all: + hugo -D -SUBDIRS=screenshots - -PROC=xsltproc -STYLEDIR=xsl -SCRIPTDIR=scripts -STYLESHEET=$(STYLEDIR)/mine.xsl - -all: subdirs website - -include depends.tabular - -subdirs: $(SUBDIRS) - -$(SUBDIRS): - $(MAKE) -C $@ - -autolayout.xml: layout.xml - $(PROC) $(STYLEDIR)/autolayout.xsl $< > $@ - $(MAKE) depends - -%.html: autolayout.xml - $(PROC) $(STYLESHEET) $(filter-out autolayout.xml,$^) $(TIDY) > $@ - -depends: autolayout.xml - $(PROC) $(STYLEDIR)/makefile-dep.xsl $< > depends.tabular - -depends.tabular: layout.xml - touch $@ - $(MAKE) depends - -.PHONY: clean subdirs $(SUBDIRS) +test: + hugo server diff --git a/about.xml b/about.xml deleted file mode 100644 index a4a3cdd..0000000 --- a/about.xml +++ /dev/null @@ -1,30 +0,0 @@ - - -]> - - - - - About this Site - About - About this Site - - - - The look of this site was borrowed from www.gimp.org. Under the hood - it is based on DocBook - Website. If you are curious, have a look at the XML source of the page you are reading. - - - - If you want to help us with developer.gimp.org, clone the - repository gimp-web-devel - from git. - - - diff --git a/api/2.0/index.html b/api/2.0/index.html deleted file mode 100644 index 1e65a92..0000000 --- a/api/2.0/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - GIMP Reference Manuals - - - -
- -
-
- -
-
- -
- - diff --git a/bugs.xml b/bugs.xml deleted file mode 100644 index 6c13a92..0000000 --- a/bugs.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - Bug Tracking System - Gitlab - Bugs, bugs, bugs - - - - The GIMP project uses Gitlab's - issues, - to coordinate bug reports. Gitlab is also used for enhancement requests and the preferred - way to submit patches for The GIMP is make a - merge request. - - - - On www.gimp.org - you can find a document describing HOW TO - Report GIMP Bugs. You can also find a document that - describes How To - Create and Submit a Patch. - - - - Below is a list of links to get you started with Gitlab: - - - - List of Open Bugs - - - - List of Open Bugs (excluding enhancement requests) - - - - Tables of Open/Closed Bugs with milestone 2.10.34 - - - - Tables of Open/Closed Bugs with milestone 2.99.12 - - - - Issues without an associated, planned version number. - - - - - diff --git a/changelog.xml b/changelog.xml deleted file mode 100644 index 2b4bd40..0000000 --- a/changelog.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - GIMP ChangeLog - ChangeLog - Keeping an eye on the development - - - - The - - GIT repository - - lists all changes in detail. The list below shows the latest - commits. It is generated from the RSS feed delivered by - the CIA. - - - - - diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..d869e0e --- /dev/null +++ b/config.toml @@ -0,0 +1,129 @@ +baseURL = "https://developer.gimp.org/" +languageCode = "en" +title = "GIMP Developer Resources" +author = "The GIMP Development Team" +theme = "hyde" +copyright = "Copyright 2003-2022 The GIMP Development Team" +DefaultContentLanguage = "en" +enableInlineShortcodes = true + +[taxanomies] +category = "categories" +tag = "tags" +series = "series" + +[menu] +[[menu.main]] + identifier = "git" + name = "Git" + url = "git.html" + weight = 10 + +[[menu.main]] + identifier = "changelog" + name = "ChangeLog" + url = "https://gitlab.gnome.org/browse/gimp/log/" + weight = 20 + +[[menu.main]] + identifier = "news" + name = "News" + url = "https://developer.gimp.org/NEWS" + weight = 21 + +[[menu.main]] + identifier = "hacking" + name = "Hacking" + url = "https://developer.gimp.org/HACKING" + weight = 22 + +[[menu.main]] + identifier = "gitlab" + name = "Gitlab" + url = "bugs.html" + weight = 30 + +[[menu.main]] + identifier = "mailing-lists" + name = "Mailing Lists" + url = "lists.html" + weight = 40 + +[[menu.main]] + identifier = "screenshots" + name = "Screenshots" + url = "screenshots.html" + weight = 50 + +[[menu.main]] + identifier = "plug-in" + name = "Plug-In Development" + url = "plug-ins.html" + weight = 60 + +[[menu.main]] + identifier = "api-ref" + name = "API Reference" + url = "api/2.0/index.html" + weight = 61 + +[[menu.main]] + identifier = "writing-plug-ins" + name = "Writing A Plug-In" + url = "writing-api-plug-in/1.html" + weight = 62 + +[[menu.main]] + identifier = "plug-in-template" + name = "Plug-In Template" + url = "plug-in-template.html" + weight = 63 + +[[menu.main]] + identifier = "conference" + name = "Conference" + url = "gimpcon/index.html" + weight = 70 + +[[menu.main]] + identifier = "gimpcon2000" + name = "GIMPCon 2000" + url = "gimpcon/2000/index.html" + weight = 71 + +[[menu.main]] + identifier = "gimpcon2003" + name = "GIMPCon 2003" + url = "gimpcon/2003/index.html" + weight = 72 + +[[menu.main]] + identifier = "gimpcon2004" + name = "GIMPCon 2004" + url = "gimpcon/2004/index.html" + weight = 73 + +[[menu.main]] + identifier = "gimpcon2006" + name = "GIMPCon 2006" + url = "gimpcon/2006/index.html" + weight = 74 + +[[menu.main]] + identifier = "faq" + name = "Developer FAQ" + url = "faq.html" + weight = 80 + +[[menu.main]] + identifier = "standards" + name = "Standards" + url = "standards.html" + weight = 90 + +[[menu.main]] + identifier = "about" + name = "About this Site" + url = "about.html" + weight = 100 + diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..12ae0d2 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,21 @@ ++++ +title = "GIMP Development" +date = "2022-07-19" +description = "Online Resources for GIMP Developers" +url = "index.html" +author = "The GIMP Development Team" ++++ + +This site tries to provide useful information for GIMP developers. +No matter if you are into [plug-in development](plug-in.html) +or want to dive into the +[internals of the GIMP core](/api/2.0/app/app-hierarchy-part.html), +you should find your way from here. + +If you're looking for the main GIMP website you should visit +[www.gimp.org](https://www.gimp.org). + +The GIMP source code is versioned with git. You +can [browse the source](https://gitlab.gnome.org/GNOME/gimp/) +online. + diff --git a/api/2.0/libtest/test.txt b/content/api/2.0/libtest/test.txt similarity index 100% rename from api/2.0/libtest/test.txt rename to content/api/2.0/libtest/test.txt diff --git a/style/default.css b/content/default.css similarity index 95% rename from style/default.css rename to content/default.css index de43de1..597c8cd 100644 --- a/style/default.css +++ b/content/default.css @@ -4,9 +4,9 @@ * so keep a backup of this file while working with it. Niklas */ /* Copyright (C) 2002-2006 by The GIMP Web Team - Contributions by: - * Ville Pätsi (drc), Henrik Brix Andersen (brix), Carol Spears - * (carol), Niklas Mattisson (scizzo), Raphaël Quinet (raphael), - * Branko Collin (branko), Sven Neumann (neo) and Øyvind Kolås + * Ville Pätsi (drc), Henrik Brix Andersen (brix), Carol Spears + * (carol), Niklas Mattisson (scizzo), Raphaël Quinet (raphael), + * Branko Collin (branko), Sven Neumann (neo) and Øyvind KolÃ¥s * (pippin) * * This style sheet and corresponding site layout are designed to be diff --git a/gimpcon/2000/people-small.jpg b/content/gimpcon/2000/people-small.jpg similarity index 100% rename from gimpcon/2000/people-small.jpg rename to content/gimpcon/2000/people-small.jpg diff --git a/gimpcon2003.xml b/content/gimpcon/2003/_index.md similarity index 83% rename from gimpcon2003.xml rename to content/gimpcon/2003/_index.md index 565e6c0..0465164 100644 --- a/gimpcon2003.xml +++ b/content/gimpcon/2003/_index.md @@ -1,13 +1,7 @@ - - -]> ++++ +title = "GIMP Developers Conference 2003" ++++ - - - - GIMP Developers Conference 2003 GIMPCon 2003 Chaos Communication Camp, near Berlin diff --git a/gimpcon2003-mins-1.xml b/content/gimpcon/2003/gimpcon2003-mins-1.md similarity index 98% rename from gimpcon2003-mins-1.xml rename to content/gimpcon/2003/gimpcon2003-mins-1.md index d51e16b..5d16f64 100644 --- a/gimpcon2003-mins-1.xml +++ b/content/gimpcon/2003/gimpcon2003-mins-1.md @@ -1,10 +1,7 @@ - - ++++ +author = "The GIMP Development Team" ++++ - - - The First Big Serious Meeting of GIMPCon 2003 First Meeting Minutes of the first GIMPCon 2003 Meeting diff --git a/gimpcon2003-mins-2.xml b/content/gimpcon/2003/gimpcon2003-mins-2.md similarity index 98% rename from gimpcon2003-mins-2.xml rename to content/gimpcon/2003/gimpcon2003-mins-2.md index 2624d2c..c20d123 100644 --- a/gimpcon2003-mins-2.xml +++ b/content/gimpcon/2003/gimpcon2003-mins-2.md @@ -1,10 +1,7 @@ - - ++++ +author = "The GIMP Development Team" ++++ - - - The Second Big Serious Meeting of GIMPCon2003 Second Meeting Minutes of the second GIMPCon 2003 Meeting diff --git a/gimpcon2003-mins-3.xml b/content/gimpcon/2003/gimpcon2003-mins-3.md similarity index 97% rename from gimpcon2003-mins-3.xml rename to content/gimpcon/2003/gimpcon2003-mins-3.md index b5ff419..b1b3da9 100644 --- a/gimpcon2003-mins-3.xml +++ b/content/gimpcon/2003/gimpcon2003-mins-3.md @@ -1,10 +1,7 @@ - - ++++ +author = "The GIMP Development Team" ++++ - - - The Third Big Serious Meeting of GIMPCon 2003 Third Meeting Minutes of the third GIMPCon 2003 Meeting diff --git a/gimpcon2003-mins.xml b/content/gimpcon/2003/gimpcon2003-mins.md similarity index 91% rename from gimpcon2003-mins.xml rename to content/gimpcon/2003/gimpcon2003-mins.md index 91cd87e..f1c68eb 100644 --- a/gimpcon2003-mins.xml +++ b/content/gimpcon/2003/gimpcon2003-mins.md @@ -1,14 +1,7 @@ - - - - -]> ++++ +author = "The GIMP Development Team" ++++ - - - Minutes of The GIMP Developers Conference 2003 Minutes Minutes of the GIMPCon 2003 Meetings diff --git a/gimpcon/2003/people-small.png b/content/gimpcon/2003/people-small.png similarity index 100% rename from gimpcon/2003/people-small.png rename to content/gimpcon/2003/people-small.png diff --git a/gimpcon/2003/people.png b/content/gimpcon/2003/people.png similarity index 100% rename from gimpcon/2003/people.png rename to content/gimpcon/2003/people.png diff --git a/gimpcon/2004/Dave_Neary.jpg b/content/gimpcon/2004/Dave_Neary.jpg similarity index 100% rename from gimpcon/2004/Dave_Neary.jpg rename to content/gimpcon/2004/Dave_Neary.jpg diff --git a/gimpcon/2004/Oyvind_Kolas.png b/content/gimpcon/2004/Oyvind_Kolas.png similarity index 100% rename from gimpcon/2004/Oyvind_Kolas.png rename to content/gimpcon/2004/Oyvind_Kolas.png diff --git a/gimpcon2004.xml b/content/gimpcon/2004/_index.md similarity index 97% rename from gimpcon2004.xml rename to content/gimpcon/2004/_index.md index 1a3432b..3914f36 100644 --- a/gimpcon2004.xml +++ b/content/gimpcon/2004/_index.md @@ -1,11 +1,7 @@ - - ++++ +title = "GIMP Developers Conference 2004" ++++ - - - - GIMP Developers Conference 2004 GIMPCon 2004 GUADEC, Kristiansand diff --git a/gimpcon/2004/gnu-head-sm.jpg b/content/gimpcon/2004/gnu-head-sm.jpg similarity index 100% rename from gimpcon/2004/gnu-head-sm.jpg rename to content/gimpcon/2004/gnu-head-sm.jpg diff --git a/gimpcon/2004/mac_gimp_logo4.png b/content/gimpcon/2004/mac_gimp_logo4.png similarity index 100% rename from gimpcon/2004/mac_gimp_logo4.png rename to content/gimpcon/2004/mac_gimp_logo4.png diff --git a/gimpcon/2004/macosx_screenshot1_thumb.jpg b/content/gimpcon/2004/macosx_screenshot1_thumb.jpg similarity index 100% rename from gimpcon/2004/macosx_screenshot1_thumb.jpg rename to content/gimpcon/2004/macosx_screenshot1_thumb.jpg diff --git a/gimpcon2006.xml b/content/gimpcon/2006/_index.md similarity index 99% rename from gimpcon2006.xml rename to content/gimpcon/2006/_index.md index 55fea55..70e3a41 100644 --- a/gimpcon2006.xml +++ b/content/gimpcon/2006/_index.md @@ -1,10 +1,7 @@ - - ++++ +author = "The GIMP Development Team" ++++ - - - GIMP Developers Conference 2006 GIMPCon 2006 Libre Graphics Meeting, Lyon diff --git a/gimpcon/2006/meetings.jpg b/content/gimpcon/2006/meetings.jpg similarity index 100% rename from gimpcon/2006/meetings.jpg rename to content/gimpcon/2006/meetings.jpg diff --git a/gimpcon/2006/meetings_small.jpg b/content/gimpcon/2006/meetings_small.jpg similarity index 100% rename from gimpcon/2006/meetings_small.jpg rename to content/gimpcon/2006/meetings_small.jpg diff --git a/gimpcon/2006/people.jpg b/content/gimpcon/2006/people.jpg similarity index 100% rename from gimpcon/2006/people.jpg rename to content/gimpcon/2006/people.jpg diff --git a/gimpcon/2006/people_small.jpg b/content/gimpcon/2006/people_small.jpg similarity index 100% rename from gimpcon/2006/people_small.jpg rename to content/gimpcon/2006/people_small.jpg diff --git a/gimpcon.xml b/content/gimpcon/_index.md similarity index 63% rename from gimpcon.xml rename to content/gimpcon/_index.md index fcdf912..2fe2570 100644 --- a/gimpcon.xml +++ b/content/gimpcon/_index.md @@ -1,29 +1,16 @@ - - - - - -]> ++++ +title = "GIMP Developer Conferences" +abbrev = "Conference" +description = "Hanging out with GIMP developers." ++++ - - - GIMP Developer Conferences - Conference - Hanging out with GIMP developers - - - The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. This is where we get together and discuss the future development, hack on GIMP and meet GIMP users. - - GIMPCon 2000, June @@ -45,6 +32,3 @@ March 17-18-19 in Lyon, France. - - - diff --git a/content/homepage/CHANGELOG.md b/content/homepage/CHANGELOG.md new file mode 100644 index 0000000..891329a --- /dev/null +++ b/content/homepage/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +## Version 1.0 + +- Due to the switch to the base template feature the minimum required version of Hugo changed to v0.21 +- Support for Google Analytics have been added +- Hugo's internal Disqus template replaced the custom one of this theme. The Disqus shortname now has to be defined outsite the `[params]` blog diff --git a/content/homepage/_index.md b/content/homepage/_index.md new file mode 100644 index 0000000..12ae0d2 --- /dev/null +++ b/content/homepage/_index.md @@ -0,0 +1,21 @@ ++++ +title = "GIMP Development" +date = "2022-07-19" +description = "Online Resources for GIMP Developers" +url = "index.html" +author = "The GIMP Development Team" ++++ + +This site tries to provide useful information for GIMP developers. +No matter if you are into [plug-in development](plug-in.html) +or want to dive into the +[internals of the GIMP core](/api/2.0/app/app-hierarchy-part.html), +you should find your way from here. + +If you're looking for the main GIMP website you should visit +[www.gimp.org](https://www.gimp.org). + +The GIMP source code is versioned with git. You +can [browse the source](https://gitlab.gnome.org/GNOME/gimp/) +online. + diff --git a/content/homepage/about.md b/content/homepage/about.md new file mode 100644 index 0000000..6da9a09 --- /dev/null +++ b/content/homepage/about.md @@ -0,0 +1,18 @@ ++++ +title = "About this Site" +description = "About this Site." +date = "2022-07-19" +author = "The GIMP Development Team" +url = "about.html" ++++ + +The look of this site was borrowed from +[www.gimp.org](http://www.gimp.org/). +Under the hood it is based on +[DocBook Website](http://docbook.sourceforge.net/projects/website/). +If you are curious, have a look at the [Markdown source](about.md) +of the page you are reading. + +If you want to help us with developer.gimp.org, clone the +repository `gimp-web-devel` from [git](git). + diff --git a/content/homepage/bugs.md b/content/homepage/bugs.md new file mode 100644 index 0000000..c7f8d20 --- /dev/null +++ b/content/homepage/bugs.md @@ -0,0 +1,28 @@ ++++ +title = "Bug Tracking System" +description = "Bugs, bugs, bugs" +date = "2022-07-19" +abbrev = "Gitlab" +url = "bugs.html" ++++ + +The GIMP project uses Gitlab's +[issues](https://gitlab.gnome.org/GNOME/gimp/-/issues), +to coordinate bug reports. Gitlab is also used for enhancement requests +and the preferred way to submit patches for the GIMP is make a +[merge request](https://gitlab.gnome.org/GNOME/gimp/-/merge_requests). + +On [www.gimp.org](https://www.gimp.org) you can find a document describing +[HOW TO Report GIMP Bugs](https://www.gimp.org/bugs/howtos/bugzilla.html). +You can also find a document that describes +[How To Create and Submit a Patch](https://www.gimp.org/bugs/howtos/submit-patch.html). + +Below is a list of links to get you started with Gitlab: + +* [List of Open Bugs](https://gitlab.gnome.org/GNOME/gimp/-/issues) +* [List of Open Bugs (excluding enhancement requests)](https://gitlab.gnome.org/GNOME/gimp/-/issues/?label_name%5B%5D=1.%20Bug) +* [Tables of Open/Closed Bugs with milestone 2.10.34](https://gitlab.gnome.org/GNOME/gimp/-/milestones/20#tab-issues) +* [Tables of Open/Closed Bugs with milestone 2.99.12](https://gitlab.gnome.org/GNOME/gimp/-/milestones/19#tab-issues) +* [Issues without an associated, planned version number.](https://gitlab.gnome.org/GNOME/gimp/-/milestones/1#tab-issues) + + diff --git a/content/homepage/changelog.md b/content/homepage/changelog.md new file mode 100644 index 0000000..435b3cd --- /dev/null +++ b/content/homepage/changelog.md @@ -0,0 +1,17 @@ +--- +title: "GIMP ChangeLog" +date: 2022-07-20T19:04:06+01:00 +draft: true +abbrev: "ChangeLog" +description: "Keeping an eye on the development." +type: new +url: changelog.html +--- + +The [GIT repository](https://gitlab.gnome.org/GNOME/gimp/commits/master) +lists all changes in detail. The list below shows the latest +commits. It is generated from the RSS feed delivered by +the [CIA](https://cia.vc/). + + + diff --git a/content/homepage/cvs.md b/content/homepage/cvs.md new file mode 100644 index 0000000..e87e879 --- /dev/null +++ b/content/homepage/cvs.md @@ -0,0 +1,11 @@ +--- +title: "CVS" +date: 2022-07-19T20:45:01+01:00 +draft: false +description: "CVS migrated to Subversion." +url: cvs.html +--- + +GIMP doesn't use CVS any longer. The source code repository has been +migrated to [git](git). + diff --git a/content/homepage/faq.md b/content/homepage/faq.md new file mode 100644 index 0000000..218e14c --- /dev/null +++ b/content/homepage/faq.md @@ -0,0 +1,433 @@ +--- +title: "Frequently Asked Questions" +date: 2022-07-20T19:04:11+01:00 +draft: true +abbrev: "Developer FAQ" +description: "New to GIMP Development?" +--- + +Below you will find a collection of frequently asked questions +regarding development of the GIMP. + +## GIMP Development + +#### Who coordinates GIMP development? + +GIMP development is coordinated by Wilber the GIMP along +with a loosely knit team of GIMP developers. The +developers can be reached through the GIMP developer +mailing list. + +#### How can I become a GIMP developer? + +If you are a developer who wants to start contributing +code to the GIMP, the best way to get to know its +structure is by fixing bugs reported in Bugzilla. Pick a +bug, perhaps ask the advice of another developer as to +whether he/she thinks it will be an easy bug or not, and +then fix it. Sounds easy, doesn't it? + +After helping with a couple of bugs, people will start to +recognize your immense talent, and you will be on your way +to becoming a GIMP hacker. Any time you feel able, you +can pick a smaller enhancement request and have a go at +implementing it. It's that easy. + +#### Where can I discuss GIMP development? + +There are several mailing +lists associated with the GIMP project. +Developments related issues can be brought up on the GIMP +Developer mailing list. + +The GIMP has its own IRC channel on GIMPNet where most of +the active developers hang out. Join us in #gimp on +irc.gimp.org. + +Every once in a while the GIMP developers get together for +a few days to throw a GIMP Developers Conference, also +referred to as GIMPCon. + +#### Where can I find documentation for the GIMP API? + +You can pass --enable-gtk-doc to the gimp +`configure` script. This requires having +gtk-doc +installed. After running make you can +find the GIMP API reference in the +`devel-docs` directory. + +Pre-generated API documentation is included in the +official GIMP tarballs. + +The API reference will normally be installed in +`PREFIX/share/gtk-doc/html`. An on +line version of the GIMP API reference can be found +here. + +#### How do I make a stack trace? + +A stack trace is a list of function calls that leads to +some point in the program. Debugging tools like gdb +can get stack traces from crashed applications so that +developers can figure out what went wrong. By including a +stack trace with your bug report, it will be much easier +for the developers to fix the reported problem. + +Information on how to make a stack trace can be found in +the document Capturing +Stack Traces. + +#### What is the best way to submit a patch? + +The best way to submit a patch is to open a bug report in +Bugzilla and attach the patch there along with a +description of what it does and why it should be applied. + +An introduction to how this is done can be found in the + +How To Create and Submit a Patch document. + +#### What is the preferred coding style used in GIMP? + +We encourage you to follow the GIMP coding style +throughout the GIMP project. For the core components +(application and libs) this coding style is enforced. The +GIMP coding style is defined as follows: + +* Function names are lowercase, words separated by underscores. +* Macros and enums are all uppercase, words separated by underscores +* Types are all words capitalized, no separators between words. +* All functions in header files need to be prototyped. +* Indentation rules are GNU coding style, in particular: + * 2 characters indentation level + * Do not use tabs (of course your editor can use tabs, but it should write them to file as 8 spaces each). + * Opening brackets are on a new line and indented one level. + * Function header have the return type on one line, the name starting in the first column of the following line. All parameters are prototyped and there's a new line for each. + +Try to make use of GLib's object system as much as +possible. Do not create wrappers around functions of +parent classes. If you end up duplicating code, try to +create a common parent class and implement the common +methods there. + +Don't include headers in headers except where unavoidable +(e.g. for deriving objects). Opaque typedefs go to +`app/base/base-types.h`, `app/core/core-types.h` etc. See +`devel-docs/includes.txt` for a +detailed description of the include policy. + +Don't use the GTK wrappers around the GLib object and +signal system. + +The above coding style, along with other useful +information, is documented in the file HACKING. + +#### How can I configure my editor for this coding style? + +Your editor will not be able to do everything for you, but +you can configure most editors so that they use two spaces +for indentation, use spaces instead of tabs, etc. + +* If you are using Emacs, you can insert the following settings into your `~/.emacs` file: + +``` +;; Merge this into your custom-set-variables section if you already have one +(custom-set-variables +;; Syntax highlighting +'(global-font-lock-mode t nil (font-lock)) +'(show-paren-mode t nil (paren)) +) +;; use UTF-8 by default +(prefer-coding-system 'mule-utf-8) +;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces +(setq c-mode-common-hook '(lambda () (c-set-style "gnu") + (setq indent-tabs-mode nil) + (setq show-trailing-whitespace t))) ]]> +``` + +* If you are using Vim, you can insert the following settings into your `~/.vimrc` file: + +``` +syn on " syntax highlighting +set expandtab " use spaces instead of tabs +set shiftwidth=2 " default indentation is 2 spaces ]]> +``` + +* If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ. + +#### Who coordinates the GIMP translation efforts? + +Any help with translations is appreciated. If you want to +help, please get in contact with the people from the +GNOME +Translation Project who coordinate all translation +efforts for projects hosted in the GNOME GIT repository. + +More information about GIMP and localisation can be found +in the file README.i18n. + + +#### How can I support GIMP development? + +By using GIMP and reporting any bugs you find to +Bugzilla +you're helping a great deal. But there are other +non-technical ways of supporting the development of The +GIMP as well. + +GIMP has a web site, application documentation, lots of +tutorials, and more. Unfortunately, as GIMP develops over +time, much of this documentation needs to be re-written or +freshened up, documentation needs to be added for new +functionality, the web site needs to get a new lick of +paint and so on. + +If you're interested in helping out you should drop an +e-mail to the GIMP developer mailing list offering your +help. + +## Plug-In Development + +#### Is there a plug-in template available? + +Yes. An official GIMP plug-in template is available in +the gimp-plugin-template + git module. Snapshots are available at ftp.gimp.org. + +#### How about a Script-Fu template? + +Yes. Simon Budig has written a fill-in-the-blanks +Script-Fu template which is available here. + +#### How do I get my plug-in included in the GIMP? + +The best way to make your plug-in available to the World +is to submit it to the GIMP Plug-In +Registry. + +If you are certain that your plug-in will be useful to all +GIMP users, then you can ask the GIMP developers to +consider it for inclusion in future GIMP release. The +best way to do that is to suggest it on the GIMP developer +mailing list or to +open an enhancement request in Bugzilla. However, we would +like to limit the number of plug-ins included in the +standard distribution and encourage all users to use the +registry. + +#### How do I debug a GIMP plug-in? + +Eeek! The plug-in you're working on has a bug in it! And +the fix isn't completely obvious, so you want to use +debugger to see what is going on. But hmm, how does one +start a plug-in under a debugger if GIMP is the one who is +starting the plug-in... + +To address this issue, libgimp has some hooks controlled +by the `GIMP_PLUGIN_DEBUG` environment +variable. The idea is that you can attach a debugger to +the pid of the plug-in you want to debug. The process is +described in the file debug-plug-ins.txt. + + +#### Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4? + +The short answer is yes. GIMP 2.2 and 2.4 are binary +compatible with plug-ins compiled for GIMP 2.0. The API is +also backwards source compatible, so your plug-in should +also compile cleanly against GIMP 2.2 and 2.4. + +If the plug-in you compiled for 2.0 does not work with 2.2 +or 2.4, there is one change which has been made which is +not backwards compatible, since the old behaviour was +considered incorrect. If you create a temporary drawable, +using for example gimp_layer_new(), you are now required +to add it to an image before calling any functions with +the drawable as an argument. + +## GIT + +#### What should I put in the commit message when doing a git commit? + +Please put a short explanation of the change on the first line. +Then, after an empty line, you can describe the change in more +detail using as many lines as you need. Try not to exceed 72 +colums. + +If the commit fixes a bug or part of a bug please use the +bug number and description as the first line of the commit +message. It's most convenient to just copy the line from the +Bugzilla bug page. + +## GEGL + +#### What is GEGL? + +GEGL is the Generic +Graphical Library. It is supposed to replace the +handling of various image processing tasks in GIMP in +a not too distant future (planned for GIMP 2.6). + +#### What will GEGL be able to do? + +GEGL will be a general image processing library. It uses +a directed acyclic graph, a DAG, to represent image +processing operations. In the DAG, images are edges, and +operations are nodes. It takes advantage of this DAG to +minimize regions which are processed, provide efficient +caching of operations, and efficient redrawing when a +parameter of the graph changes. + +GEGL should also be independent of the data type being +processed and will be able to handle high bit depth +images, ICC profiles and parallel processing of image +tiles. + +#### What does all that gibberish mean for GIMP? + +Many highly requested features of the GIMP will be easier +to do using GEGL. Layer effects, layer groups, and +adjustment layers are quite easily represented (and +efficiently calculated) using the DAG organization of GEGL. +CMYK and high bit depth support will be easier because +GEGL does not make the same assumptions about color spaces +and data types that the GIMP does. + +The reusability of image processing operations means that +plug-ins will be able to be designed in a much more modular +way. The brush system will be able to become more +flexible, especially when filter plug-ins are able to be +used as procedural brush plug-ins. + +## Bugzilla + +#### What is Bugzilla? + +The GIMP project uses GNOME Bugzilla for +tracking of bug reports, enhancement requests etc. + +A beginners tutorial describing how to report a bug can be +found in the +How To Report GIMP Bugs document. + +An easy to use interface to reporting GIMP bugs can be +found on bugs.gimp.org. + +#### What is the meaning of the NEEDINFO status code inBugzilla? + +If the status of a bug is changed to NEEDINFO it means the +GIMP developers need more information from the bug +reporter in order to resolve the bug. + +More information about the meaning of the Bugzilla status +field codes can be found in +A Bug's Life Cycle. + +#### What is the best way to refer to a bug in Bugzilla? + +The best way to refer to a bug is bug +#nnnnn, where nnnnn is the bug number. Using +bug before the number allows Bugzilla to +link to the corresponding bug report automatically. Using +# before the number is optional for +Bugzilla but makes it easier to locate references to bug +reports in the ChangeLog or in e-mails. + +When referencing multiple bugs, it is better to be a bit +redundant by writing bug #xxxxx, bug #yyyyy and bug +#zzzzz instead of bugs #xxxxx, #yyyyy and +#zzzzz in order to allow Bugzilla to link all bugs +automatically. + +#### What is the proper way of handling duplicate bug reports? + +A bug report describing the same bug as a previous bug +report should be marked as DUPLICATE of the older one. +In some exceptional cases, it is possible to mark an old +bug report as DUPLICATE of a newer one (e.g., when the +newer bug report has a significantly better description +than the older one). + +Another exception is when the same person submits the same +bug report several times (same description): in this case, +it is better to mark the additional copies of the bug +report as INVALID in order to avoid inflating the +statistics about the number of duplicates. + +#### What is the proper way of marking a bug as RESOLVED? + +When fixing a bug, always mention the bug number in the +commit message. Once the changes are in git, paste the +relevant part of the commit message (or all of it) in the +comment field and mark the bug as RESOLVED FIXED. +These cross-references help a lot when trying to find +when a bug was fixed, its relations to other bugs, and +potential regressions. + +A bug that is fixed in git or in an unstable release +should be marked as RESOLVED FIXED. Optionally, the +reporter or someone other than the one who fixed the bug +can mark it as VERIFIED after some testing. When the fix +is part of a stable release, it can be marked as CLOSED. + +This is explained further in A +Bug's Life Cycle except for the difference between +stable and unstable releases. + +## Miscellaneous + +#### Where can I learn more about the GObject system used by GIMP? + +The +GObject +documentation has a +nice tutorial that you might want to have a look at. + +#### Where can I learn more about color spaces etc? + +Charles Poynton has collected a set of Frequently +Asked Questions about Color. + +#### Where can I learn more about image manipulation algorithms? + +A good source of information is the +comp.graphics.algorithms list of Frequently +Asked Questions. + +#### Is there a GIMP user FAQ available? + +There is no user FAQ available at the moment. However +there has been discussions about creating one. If you +would like to help with this please drop a mail on the +GIMP developer mailing +list. + +#### How can I contribute to this FAQ? + +If you would like to contribute to this FAQ, send an +e-mail to the GIMP developer [mailing list](lists) with the +exact text you think should be included (both question and +answer). + +With your help this FAQ will grow and become more useful. + diff --git a/content/homepage/git.md b/content/homepage/git.md new file mode 100644 index 0000000..19477cd --- /dev/null +++ b/content/homepage/git.md @@ -0,0 +1,138 @@ +--- +title: "Git" +date: 2022-07-20T19:04:57+01:00 +draft: true +abbrev: "Git" +description: "Living on the bleeding edge" +url: git.html +--- + +The GIMP source code lives in the gimp +repository on the +GNOME git server. +For more information on the GNOME git solution, go +here. + +The GNOME git server hosts a couple of GIMP related repositories: + + + + + +Module +Description + + + + + +babl + + +Pixel format conversion library + + + + +gegl + + +Generic Graphical Library + + + + +gimp + + +GIMP and the standard set of plug-ins + + + + +gimp-data-extras + + +GIMP Data files such as brushes, gradients, patterns and the like + + + + +gimp-gap + + +GIMP Animation Package, a set of plug-ins that provide +video editing functionality + + + + +gimp-help-2 + + +GIMP User Manual + + + + +gimp-perl + + +GIMP Perl bindings and a bunch of nice gimp-perl scripts + + + + +gimp-plugin-template + + +GIMP Plug-In Template, a starting ground for plug-in developers, +currently in need of updating with regards to the use of GEGL + + + + +gimp-plugins-unstable + + +GIMP plug-ins from the past, a collection of unstable and +unmaintained plug-ins + + + + +gimp-ruby + + +GIMP Ruby-based scripting plug-in + + + + +gimp-tiny-fu + + +GIMP Tiny-Fu, a drop-in replacement for Script-Fu + + + + +gimp-web + + +The GIMP web site, available at www.gimp.org + + + + +gimp-web-devel + + +The source of the pages you are reading right now + + + + + + + diff --git a/content/homepage/lists.md b/content/homepage/lists.md new file mode 100644 index 0000000..a720c24 --- /dev/null +++ b/content/homepage/lists.md @@ -0,0 +1,12 @@ +--- +title: "Mailing Lists" +description: "The finest spam in town" +date: 2022-07-20T19:05:03+01:00 +draft: false +type: new +url: lists.html +--- + +There are several mailing-lists related to GIMP and +[www.gimp.org lists them all](https://www.gimp.org/mail_lists.html). + diff --git a/content/homepage/plug-in-template.md b/content/homepage/plug-in-template.md new file mode 100644 index 0000000..3d9bd5b --- /dev/null +++ b/content/homepage/plug-in-template.md @@ -0,0 +1,24 @@ +--- +title: "GIMP Plug-In Template" +abbrev: "Plug-In Template" +description: "Don't start from scratch" +date: 2022-07-20T19:05:12+01:00 +draft: false +url: plug-in-template.html +--- + +The GIMP Plug-In Template is an empty GIMP Plug-In that does +nothing. It also has a GUI that allows to control how it achieves +this task. But best of all, it comes with a complete setup for +[autoconf](https://www.gnu.org/software/autoconf/), +[automake](https://www.gnu.org/software/automake/), +internationalisation and all these things you never wanted to know +about. + +Thanks to the GIMP Plug-In Template you don't need to worry about +all these things. Just download the tarball, add some magic image +manipulation routines and voilà, your own GIMP plug-in. + +Grab the latest release from +[ftp.gimp.org/pub/gimp/plugin-template/](ftp://ftp.gimp.org/pub/gimp/plugin-template/). + diff --git a/content/homepage/plug-ins.md b/content/homepage/plug-ins.md new file mode 100644 index 0000000..4747110 --- /dev/null +++ b/content/homepage/plug-ins.md @@ -0,0 +1,19 @@ +--- +title: "Plug Ins" +date: 2022-07-20T19:05:09+01:00 +draft: true +--- + +--- +title: "Plug-In Development" +description: "Writing GIMP plug-ins" +--- + +* [Writing a GIMP Plug-In Part I](writing-a-plug-in-1) +* [Writing a GIMP Plug-In Part II](writing-a-plug-in-2) +* [Writing a GIMP Plug-In Part III](writing-a-plug-in-3) + +Make good use of the GIMP 2.0 API reference, +and you can also have a look at a talk about +GIMP plug-in programming that Simon gave at GUADEC in Sevilla. + diff --git a/content/homepage/screenshots.md b/content/homepage/screenshots.md new file mode 100644 index 0000000..3801e0a --- /dev/null +++ b/content/homepage/screenshots.md @@ -0,0 +1,63 @@ +--- + +--- + + + + + + + +Screenshots +What everyone is after... + + + +Here are a few screenshots of the development version. More should +be added... + + + + + + + + + +No image opened + + + +This screenshot shows a GNOME desktop and GIMP 2.5 right after +startup with no image loaded yet. + + + + + + + + + +Print dialog + + + +The Print plug-in has been further improved for GIMP 2.5. + + + + + + + + + +Curves dialog + + + +These screenshots illustrate changes to the Curves dialog for the +upcoming GIMP 2.6 release. + diff --git a/standards.xml b/content/homepage/standards.md similarity index 90% rename from standards.xml rename to content/homepage/standards.md index c02857a..3770d1d 100644 --- a/standards.xml +++ b/content/homepage/standards.md @@ -1,23 +1,18 @@ - - - - - - - GIMP and Standards - Standards - Standards GIMP conforms to - - - - GIMP is supposed to integrate well into your workflow. Thus is - needs to interoperate with other applications and your desktop. - Standards are there to make this happen and so we try to follow - established (and sometimes even proposed) standards. Below you - will find a list with links to specifications that a GIMP - developer may find useful. - +--- +title: "GIMP and Standards" +date: 2022-07-20T19:05:19+01:00 +draft: true +abbrev: "Standards" +description: "Standards GIMP conforms to" +url: standards.html +--- + +GIMP is supposed to integrate well into your workflow. Thus is +needs to interoperate with other applications and your desktop. +Standards are there to make this happen and so we try to follow +established (and sometimes even proposed) standards. Below you +will find a list with links to specifications that a GIMP +developer may find useful. Image File Formats @@ -27,10 +22,8 @@ Extensible Markup Language (XML) - Describes the XML markup language, used to store the menu layout, the startup tips, help indices and other things. - @@ -39,10 +32,8 @@ Graphics Interchange Format - Describes the GIF file format, used in the GIF plug-in. GIF is bad, don't use it. - @@ -51,9 +42,7 @@ JPEG (Joint Photographic Experts Group) - Describes the JPEG JFIF file format, used in the JPEG plug-in. - @@ -62,11 +51,9 @@ JNG (JPEG Network Graphics) Format - GIMP doesn't use this format yet but it would be nice to extend the MNG plug-in to use it and to add a dedicated JNG plug-in. - @@ -75,9 +62,7 @@ MNG (Multiple-image Network Graphics) Format - Describes the MNG file format, used in the MNG plug-in. - @@ -86,11 +71,9 @@ Portable Network Graphics (PNG) - Describes the PNG file format, used in the PNG plug-in. GIMP also reads patterns in the PNG file format and it stores thumbnails as PNG images. - @@ -99,11 +82,9 @@ Scalable Vector Graphics (SVG) 1.1 - Describes the SVG file format, used in the SVG plug-in. GIMP uses SVG for import and export of paths and it also loads gradients from SVG files. - @@ -112,11 +93,9 @@ TIFF 6.0 - Describes the TIFF file format, used in the TIFF plug-in. See also the Unofficial TIFF Home Page. - @@ -125,10 +104,8 @@ Extensible Metadata Platform (XMP) - Describes XMP, a labeling technology that allows to embed data about a file, known as metadata, into the file itself. - @@ -137,10 +114,8 @@ Digital Negative (DNG) - Specifies DNG, a format, proposed by Adobe, aiming to become a standard for storing raw data from digital cameras. - @@ -155,10 +130,8 @@ sRGB Color Space - Describes sRGB, a color space proposed as a standard default color space for the Internet and other interested vendors. - @@ -167,12 +140,10 @@ ICC Specification - Specifies the profile format defined by the International Color Consortium (ICC). The intent of this format is to provide a cross-platform device profile format that can be used to translate color data between device colorspaces. - @@ -181,10 +152,8 @@ ICC Profiles In X Specification - This is a specification for associating ICC color profiles with X screens. GIMP 2.4 implements this proposed standard. - @@ -198,12 +167,10 @@ Desktop Entry Specification - This document describes desktop entries: files describing information about an application such as the name, icon, and description. GIMP installs such a .desktop file. - @@ -212,12 +179,10 @@ Desktop Message Bus - D-Bus is a message bus for the desktop. If available, GIMP uses it to detect if another GIMP instance is already running. In the future, GIMP might make even more use of D-Bus. - @@ -226,10 +191,8 @@ File URI Specification - Specifies how URIs for normal UNIX filenames (file: URIs) are interpreted and created. This functionality is provided by GLib, - @@ -238,10 +201,8 @@ GNOME Human Interface Guidelines - We don't follow this spec to the word but we try to adopt as much of these guidelines as makes sense. - @@ -250,10 +211,8 @@ Recent File Storage Specification - Provides a standard mechanism for storing a list of recently used files. Supported since GIMP version 2.1.6. - @@ -262,11 +221,9 @@ Shared MIME Database - The shared MIME database contains common MIME types, descriptions, and rules for determining the types of files. GIMP file plug-ins should use the MIME types and descriptions defined here. - @@ -275,11 +232,9 @@ Startup Notification - Specifies a mechanism allowing a desktop environment to track application startup to provide user feedback. GTK+ provides support for this protocol. - @@ -288,13 +243,11 @@ Thumbnail Managing Standard - Deals with the permanent storage of previews for file content. In particular, it tries to define a general and widely accepted standard for this task. GIMP 2.0 implements this standard and dropped support for the old-fashioned .xvpics. - @@ -309,10 +262,8 @@ Clipboards - Not a formal specification, but explains the consensus of the Qt and GTK+ developers on how the X clipboard works. - @@ -321,12 +272,10 @@ Clipboard Manager - The Clipboard Manager specification describes how applications can actively store the contents of the clipboard when the application is quit. This requires that a compliant clipboard manager is running. - @@ -335,10 +284,8 @@ Drag-and-Drop Protocol for the X Window System - XDND defines a standard for drag and drop on X11. It is implemented by GTK+. - @@ -347,11 +294,9 @@ Direct Save Protocol for the X Window System - XDS defines an extension to XDND that allow users to save a file by simply dragging it to a file manager window. GIMP 2.4 supports this protocol. - @@ -360,10 +305,8 @@ Extended Window Manager Hints - The Window Manager Specification is meant to unify the GNOME and KDE window manager hint conventions. - @@ -372,12 +315,10 @@ Inter-Client Communication Conventions Manual (ICCCM) - This spec defines the interaction between X11 clients. In particular it talks about selections, cut buffers, window and session management, manipulation of shared resources and device color characterization. - @@ -386,12 +327,10 @@ XSETTINGS - The XSETTINGS protocol provides a mechanism for applications written with different toolkits to share simple configuration settings such as double-click-times and background colors. GTK+ hides this from us. - @@ -405,11 +344,9 @@ GIMP Hackordnung - The last section from the file HACKING as found in the GIMP source tree explains how the GIMP source code should be formatted. - @@ -418,11 +355,9 @@ GNU coding standards - A guide to writing portable, robust and reliable programs. Also defines the GNU coding style. - @@ -431,9 +366,7 @@ ISO/IEC 9899 - ISO 9899 is the international standard for the C programming language. - diff --git a/images/developer-barbg.png b/content/images/developer-barbg.png similarity index 100% rename from images/developer-barbg.png rename to content/images/developer-barbg.png diff --git a/images/developer-left.png b/content/images/developer-left.png similarity index 100% rename from images/developer-left.png rename to content/images/developer-left.png diff --git a/images/developer-right.png b/content/images/developer-right.png similarity index 100% rename from images/developer-right.png rename to content/images/developer-right.png diff --git a/images/shadow.gif b/content/images/shadow.gif similarity index 100% rename from images/shadow.gif rename to content/images/shadow.gif diff --git a/images/shadow.png b/content/images/shadow.png similarity index 100% rename from images/shadow.png rename to content/images/shadow.png diff --git a/images/wilber-icon.png b/content/images/wilber-icon.png similarity index 100% rename from images/wilber-icon.png rename to content/images/wilber-icon.png diff --git a/images/wilber.png b/content/images/wilber.png similarity index 100% rename from images/wilber.png rename to content/images/wilber.png diff --git a/layout.xml b/content/layout.xml similarity index 100% rename from layout.xml rename to content/layout.xml diff --git a/screenshots/Makefile b/content/screenshots/Makefile similarity index 100% rename from screenshots/Makefile rename to content/screenshots/Makefile diff --git a/content/screenshots/gimp-curves-thumb.png b/content/screenshots/gimp-curves-thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..6941a85a8b5d972e1934443d1b0259bb5ef61eee GIT binary patch literal 77364 zcmV)QK(xP!P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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

c8g4CQU{T2H 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 F{{t(livj=u literal 0 HcmV?d00001 diff --git a/screenshots/gimp-print.png b/content/screenshots/gimp-print.png similarity index 100% rename from screenshots/gimp-print.png rename to content/screenshots/gimp-print.png diff --git a/writing-a-plug-in-1.xml b/content/writing-a-plug-in/1.md similarity index 81% rename from writing-a-plug-in-1.xml rename to content/writing-a-plug-in/1.md index 5916754..084676e 100644 --- a/writing-a-plug-in-1.xml +++ b/content/writing-a-plug-in/1.md @@ -1,46 +1,29 @@ - - -]> - - - - - How to write a GIMP plug-in - Writing A Plug-In -

Write your own - - - - Written By Dave Neary - - - - In this article, I present GIMP plug-ins basics and introduce the - libgimp API. I will also show how to use the PDB to make our - plug-in available to other script authors. - +--- +title: "How to write a GIMP plug-in" +abbrev: "Writing A Plug-In" +description: "Write your own" +--- -
- Introduction +Written By Dave Neary - - New developers are often intimidated by The GIMP size and its - reputation. They think that writing a plug-in would be a - difficult task. The goal of these articles is to dumb this - feeling down, by showing how easily one can make a C plug-in. - +In this article, I present GIMP plug-ins basics and introduce the +libgimp API. I will also show how to use the PDB to make our +plug-in available to other script authors. - - In this part, I present a plug-in's basic elements. We will see - how to install a plug-in and how to get data from an image and - directly manipulate it. - -
+
+Introduction -
- Architecture + +New developers are often intimidated by The GIMP size and its +reputation. They think that writing a plug-in would be a +difficult task. The goal of these articles is to dumb this +feeling down, by showing how easily one can make a C plug-in. + +In this part, I present a plug-in's basic elements. We will see +how to install a plug-in and how to get data from an image and +directly manipulate it. + +## Architecture @@ -56,40 +39,28 @@ - - The GIMP script interface is centered on the Procedural database - (PDB). At startup, The GIMP looks into a predefined set of - places for scripts and plug-ins, and asks each new script to - identify itself. - +The GIMP script interface is centered on the Procedural database +(PDB). At startup, The GIMP looks into a predefined set of +places for scripts and plug-ins, and asks each new script to +identify itself. - - The plug-in declares itself to the PDB at that time, and passes - informations like the position it wishes to get in the menu - hierarchy, input parameters, and output parameters. - +The plug-in declares itself to the PDB at that time, and passes +informations like the position it wishes to get in the menu +hierarchy, input parameters, and output parameters. - - When a script or a plug-in wants to use our plug-in, it gets - through the PDB, which manages communicating parameters in one - direction and the other in a transparent way. - +When a script or a plug-in wants to use our plug-in, it gets +through the PDB, which manages communicating parameters in one +direction and the other in a transparent way. - - Internal functions that wish to get exposed to plug-ins have to - be packaged first in the core, that will register them in the - PDB, and secondly in the libgimp that will allow the function to - be called as a normal one. - +Internal functions that wish to get exposed to plug-ins have to +be packaged first in the core, that will register them in the +PDB, and secondly in the libgimp that will allow the function to +be called as a normal one. - - This was the introduction - now, we will look closer at our - first plug-in, a "Hello, world!". - -
+This was the introduction - now, we will look closer at our +first plug-in, a "Hello, world!". -
- Compiling the plug-in +## Compiling the plug-in To be able to compile simple plug-ins for The GIMP, one needs diff --git a/writing-a-plug-in-2.xml b/content/writing-a-plug-in/2.md similarity index 70% rename from writing-a-plug-in-2.xml rename to content/writing-a-plug-in/2.md index bdf85b7..92a8b8e 100644 --- a/writing-a-plug-in-2.xml +++ b/content/writing-a-plug-in/2.md @@ -1,86 +1,56 @@ - - - -]> - - - - - How to write a GIMP plug-in, part II - Part II - Write your own - - - - Written By Dave Neary - - - - In the first - part, I presented essential elements to build a plug-in - interface with The GIMP. Now we will produce a simple but useful - algorithm that we could use in our plug-in. - - -
- Introduction - - - The algorithm we are going to implement is a simple blur. It is - included in The GIMP as "Filters->Blur->Blur" with default - parameters. - - - - That algorithm is very simple. Each pixel in our image is - replaced by a mean value of its neighbours. For example, if we - look at the simplest case where the neighbourhood is 3x3 (see - figure 1), in that case the center value will be replaced with - 5, the mean of the 9 numbers in its neighbourhood. - - - - With this method, edge differences are splatted, giving a - blurred result. One can choose another radius, using a (2r + 1) - x (2r + 1) matrix. - -
- -
- Image structure - - - Last month, we wrote a run() function that did nothing useful. - Let's look again at run() prototype: - - - - - - - - We saw that for a filter (i.e. a plug-in that modifies the - image), the first three input parameters were the run mode, an - identifier for the image, and another one for the active - drawable (layer or mask). - - - - A GIMP image is a structure that contains, among others, guides, - layers, layer masks, and any data associated to the image. The - word "drawable" is often used in GIMP internal structures. A - "drawable" is an object where you can get, and sometimes modify, - raw data. So : layers, layer masks, selections are all - "drawables". - +--- +title: "How to write a GIMP plug-in, part II" +abbrev: "Part II" +description: "Write your own" +--- + +Written By Dave Neary + +In the first +part, I presented essential elements to build a plug-in +interface with The GIMP. Now we will produce a simple but useful +algorithm that we could use in our plug-in. + +## Introduction + +The algorithm we are going to implement is a simple blur. It is +included in The GIMP as "Filters->Blur->Blur" with default +parameters. + +That algorithm is very simple. Each pixel in our image is +replaced by a mean value of its neighbours. For example, if we +look at the simplest case where the neighbourhood is 3x3 (see +figure 1), in that case the center value will be replaced with +5, the mean of the 9 numbers in its neighbourhood. + +With this method, edge differences are splatted, giving a +blurred result. One can choose another radius, using a (2r + 1) +x (2r + 1) matrix. + +## Image structure + +Last month, we wrote a run() function that did nothing useful. +Let's look again at run() prototype: + +``` +static void run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals); +``` + +We saw that for a filter (i.e. a plug-in that modifies the +image), the first three input parameters were the run mode, an +identifier for the image, and another one for the active +drawable (layer or mask). + +A GIMP image is a structure that contains, among others, guides, +layers, layer masks, and any data associated to the image. The +word "drawable" is often used in GIMP internal structures. A +"drawable" is an object where you can get, and sometimes modify, +raw data. So : layers, layer masks, selections are all +"drawables". @@ -94,11 +64,8 @@ Drawables - -
-
- Accessing the data +## Accessing the data To get a GimpDrawable from its identifier, we need the @@ -207,34 +174,24 @@
-
- Updating the image +## Updating the image - - At last, a plug-in that has modified a drawable data must flush - it to send data to the core, and to tell the application that - the display must be updated. This is done with the following - function: - +At last, a plug-in that has modified a drawable data must flush +it to send data to the core, and to tell the application that +the display must be updated. This is done with the following +function: - - - -
+``` + gimp_displays_flush (); + gimp_drawable_detach (drawable); +``` -
- Implementing blur() +## Implementing blur() - - To be able to try out several different processing methods, we - will delegate the job to a blur() function. Our run() is below. - +To be able to try out several different processing methods, we +will delegate the job to a blur() function. Our run() is below. - - - - - - There are a few lines here that need to be explained a bit more. - The call to gimp_progress_init() initialises a progress - measurement for our plug-in. Later, if we call - gimp_progress_update(double percent), the percentage given as an - input parameter will be shown graphically. The run_mode tells us - whether the plug-in was launched in a way such as we can display - a graphical interface or not. Possible values are - GIMP_RUN_INTERACTIVE, GIMP_RUN_NONINTERACTIVE or - GIMP_RUN_WITH_LAST_VALS, which mean the plug-in was executed - from The GIMP, from a script, or from the "Repeat last filter" - menu entry. - - - - Regarding the blur algorithm itself, the first version using - gimp_pixel_rgn_(get|set)_pixel() is found below. Some functions - in it have not been explained yet. - - - - gimp_drawable_mask_bounds() allows calculation of the filter's - effect limits, excluding any region that is not in the active - selection. Limiting the processing this way allows an important - performance improvement. - - - - gimp_pixel_rgn_init() takes as input parameters the drawable, - its limits for the processing, and two booleans that - significantly modify the behaviour of the resulting GimpPixelRgn. - The first one tells that "set" operations must be done on shadow - tiles, in order to leave original data as is until - gimp_drawable_merge_shadow() is called, when all modified data - will be merged. The second one tells that modified tiles should - be tagged "dirty" and sent to the core to be merged. Most of the - time, to read data, one uses FALSE and FALSE for these two - parameters, and to write data, one uses TRUE and TRUE. Other - combinations are possible but seldom used. - - - - - -
+``` -
- Row processing +## Row processing - - Our function has a bug drawback: performance. On a 300x300 - selection, with the timing code uncommented, blur() took 12 - minutes on my K6-2 350MHz, well loaded with other stuff. To - compare, on the same selection, Gaussian blur took 3 seconds. - +Our function has a bug drawback: performance. On a 300x300 +selection, with the timing code uncommented, blur() took 12 +minutes on my K6-2 350MHz, well loaded with other stuff. To +compare, on the same selection, Gaussian blur took 3 seconds. - - If we modify our function to rather use - gimp_pixel_rgn_(get|set)_row() the result is far better. We - reduce the timing for the 300x300 selection from 760 seconds to - 6 seconds. blur() V2 is below: - +If we modify our function to rather use +gimp_pixel_rgn_(get|set)_row() the result is far better. We +reduce the timing for the 300x300 selection from 760 seconds to +6 seconds. blur() V2 is below: - -]> - - - - - How to write a GIMP plug-in, part III - Part III - Write your own - - - - Written By Dave Neary - +--- +title: "How to write a GIMP plug-in, part III" +abbrev: "Part III" +description: "Write your own" +--- + +Written By Dave Neary - In the second part, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which @@ -148,7 +137,7 @@ are there to keep the blur code clean and small. - +```
-
- diff --git a/cvs.xml b/cvs.xml deleted file mode 100644 index bfed2c0..0000000 --- a/cvs.xml +++ /dev/null @@ -1,19 +0,0 @@ - - -]> - - - - - CVS - CVS migrated to Subversion - - - - GIMP doesn't use CVS any longer. The source code repository has been - migrated to git. - - - diff --git a/dtd/autolayout.dtd b/dtd/autolayout.dtd deleted file mode 100644 index f01720a..0000000 --- a/dtd/autolayout.dtd +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dtd/extensions.mod b/dtd/extensions.mod deleted file mode 100644 index 2db2f5c..0000000 --- a/dtd/extensions.mod +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - -%namespaces.mod; - - - - - -]]> - - - - - - -]]> - - - - - - - - - diff --git a/dtd/forms.mod b/dtd/forms.mod deleted file mode 100644 index ff9919a..0000000 --- a/dtd/forms.mod +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dtd/layout.dtd b/dtd/layout.dtd deleted file mode 100644 index 5da6d9a..0000000 --- a/dtd/layout.dtd +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dtd/namespaces.mod b/dtd/namespaces.mod deleted file mode 100644 index 0060470..0000000 --- a/dtd/namespaces.mod +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dtd/rddl.mod b/dtd/rddl.mod deleted file mode 100644 index a58b38a..0000000 --- a/dtd/rddl.mod +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/dtd/website-custom.dtd b/dtd/website-custom.dtd deleted file mode 100644 index 28a80c9..0000000 --- a/dtd/website-custom.dtd +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -%extensions.mod; - - - - - -%sdocbook; - - -%website.mod; - - - diff --git a/dtd/website-full.dtd b/dtd/website-full.dtd deleted file mode 100644 index 6d155b2..0000000 --- a/dtd/website-full.dtd +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -%extensions.mod; - - - -%docbook.dtd; - - - - - - -%website.mod; - - - diff --git a/dtd/website.dtd b/dtd/website.dtd deleted file mode 100644 index d5bbeca..0000000 --- a/dtd/website.dtd +++ /dev/null @@ -1,1993 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dtd/website.mod b/dtd/website.mod deleted file mode 100644 index f099985..0000000 --- a/dtd/website.mod +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%rddl.mod; -]]> - - -%forms.mod; -]]> - - - diff --git a/faq.xml b/faq.xml deleted file mode 100644 index 5bdc003..0000000 --- a/faq.xml +++ /dev/null @@ -1,812 +0,0 @@ - - - -]> - - - - - Frequently Asked Questions - Developer FAQ - New to GIMP Development? - - - - Below you will find a collection of frequently asked questions - regarding development of the GIMP. - - - - - GIMP Development - - - - - Who coordinates GIMP development? - - - - - GIMP development is coordinated by Wilber the GIMP along - with a loosely knit team of GIMP developers. The - developers can be reached through the GIMP developer - mailing list. - - - - - - - - How can I become a GIMP developer? - - - - - If you are a developer who wants to start contributing - code to the GIMP, the best way to get to know its - structure is by fixing bugs reported in Bugzilla. Pick a - bug, perhaps ask the advice of another developer as to - whether he/she thinks it will be an easy bug or not, and - then fix it. Sounds easy, doesn't it? - - - After helping with a couple of bugs, people will start to - recognize your immense talent, and you will be on your way - to becoming a GIMP hacker. Any time you feel able, you - can pick a smaller enhancement request and have a go at - implementing it. It's that easy. - - - - - - - - Where can I discuss GIMP development? - - - - - There are several mailing - lists associated with the GIMP project. - Developments related issues can be brought up on the GIMP - Developer mailing list. - - - The GIMP has its own IRC channel on GIMPNet where most of - the active developers hang out. Join us in #gimp on - irc.gimp.org. - - - Every once in a while the GIMP developers get together for - a few days to throw a GIMP Developers Conference, also - referred to as GIMPCon. - - - - - - - - Where can I find documentation for the GIMP API? - - - - - You can pass --enable-gtk-doc to the gimp - configure script. This requires having - gtk-doc - installed. After running make you can - find the GIMP API reference in the - devel-docs directory. - - - Pre-generated API documentation is included in the - official GIMP tarballs. - - - The API reference will normally be installed in - PREFIX/share/gtk-doc/html. An on - line version of the GIMP API reference can be found - here. - - - - - - - - How do I make a stack trace? - - - - - A stack trace is a list of function calls that leads to - some point in the program. Debugging tools like gdb - can get stack traces from crashed applications so that - developers can figure out what went wrong. By including a - stack trace with your bug report, it will be much easier - for the developers to fix the reported problem. - - - Information on how to make a stack trace can be found in - the document Capturing - Stack Traces. - - - - - - - - What is the best way to submit a patch? - - - - - The best way to submit a patch is to open a bug report in - Bugzilla and attach the patch there along with a - description of what it does and why it should be applied. - - - An introduction to how this is done can be found in the - - How To Create and Submit a Patch document. - - - - - - - - What is the preferred coding style used in GIMP? - - - - - We encourage you to follow the GIMP coding style - throughout the GIMP project. For the core components - (application and libs) this coding style is enforced. The - GIMP coding style is defined as follows: - - - - Function names are lowercase, words separated by - underscores. - - - - - Macros and enums are all uppercase, words separated - by underscores - - - - - Types are all words capitalized, no separators - between words. - - - - - All functions in header files need to be prototyped. - - - - - Indentation rules are GNU coding style, in - particular: - - - - 2 characters indentation level - - - - - Do not use tabs (of course your editor can use - tabs, but it should write them to file as 8 - spaces each). - - - - - Opening brackets are on a new line and - indented one level. - - - - - Function header have the return type on one - line, the name starting in the first column of - the following line. All parameters are - prototyped and there's a new line for each. - - - - - - - - - Try to make use of GLib's object system as much as - possible. Do not create wrappers around functions of - parent classes. If you end up duplicating code, try to - create a common parent class and implement the common - methods there. - - - Don't include headers in headers except where unavoidable - (e.g. for deriving objects). Opaque typedefs go to - app/base/base-types.h, - app/core/core-types.h etc. See - devel-docs/includes.txt for a - detailed description of the include policy. - - - Don't use the GTK wrappers around the GLib object and - signal system. - - - The above coding style, along with other useful - information, is documented in the file HACKING. - - - - - - - - How can I configure my editor for this coding style? - - - - - Your editor will not be able to do everything for you, but - you can configure most editors so that they use two spaces - for indentation, use spaces instead of tabs, etc. - - - - - If you are using Emacs, you can insert the following - settings into your ~/.emacs file: - - - - - - If you are using Vim, you can insert the following - settings into your ~/.vimrc file: - - - - - - If you are using another editor and you know how to - configure it correctly, please tell us about it on the - GIMP developer mailing - list so that we can update this FAQ. - - - - - - - - - - Who coordinates the GIMP translation efforts? - - - - - Any help with translations is appreciated. If you want to - help, please get in contact with the people from the - GNOME - Translation Project who coordinate all translation - efforts for projects hosted in the GNOME GIT repository. - - - More information about GIMP and localisation can be found - in the file README.i18n. - - - - - - - - How can I support GIMP development? - - - - - By using GIMP and reporting any bugs you find to - Bugzilla - you're helping a great deal. But there are other - non-technical ways of supporting the development of The - GIMP as well. - - - GIMP has a web site, application documentation, lots of - tutorials, and more. Unfortunately, as GIMP develops over - time, much of this documentation needs to be re-written or - freshened up, documentation needs to be added for new - functionality, the web site needs to get a new lick of - paint and so on. - - - If you're interested in helping out you should drop an - e-mail to the GIMP developer mailing list offering your - help. - - - - - - - Plug-In Development - - - - - Is there a plug-in template available? - - - - - Yes. An official GIMP plug-in template is available in - the gimp-plugin-template - git module. Snapshots are available at ftp.gimp.org. - - - - - - - - How about a Script-Fu template? - - - - - Yes. Simon Budig has written a fill-in-the-blanks - Script-Fu template which is available here. - - - - - - - - How do I get my plug-in included in the GIMP? - - - - - The best way to make your plug-in available to the World - is to submit it to the GIMP Plug-In - Registry. - - - If you are certain that your plug-in will be useful to all - GIMP users, then you can ask the GIMP developers to - consider it for inclusion in future GIMP release. The - best way to do that is to suggest it on the GIMP developer - mailing list or to - open an enhancement request in Bugzilla. However, we would - like to limit the number of plug-ins included in the - standard distribution and encourage all users to use the - registry. - - - - - - - - How do I debug a GIMP plug-in? - - - - - Eeek! The plug-in you're working on has a bug in it! And - the fix isn't completely obvious, so you want to use - debugger to see what is going on. But hmm, how does one - start a plug-in under a debugger if GIMP is the one who is - starting the plug-in... - - - To address this issue, libgimp has some hooks controlled - by the GIMP_PLUGIN_DEBUG environment - variable. The idea is that you can attach a debugger to - the pid of the plug-in you want to debug. The process is - described in the file debug-plug-ins.txt. - - - - - - - - Will the plug-in I compiled against 2.0 work with - GIMP 2.2 or 2.4? - - - - - The short answer is yes. GIMP 2.2 and 2.4 are binary - compatible with plug-ins compiled for GIMP 2.0. The API is - also backwards source compatible, so your plug-in should - also compile cleanly against GIMP 2.2 and 2.4. - - - If the plug-in you compiled for 2.0 does not work with 2.2 - or 2.4, there is one change which has been made which is - not backwards compatible, since the old behaviour was - considered incorrect. If you create a temporary drawable, - using for example gimp_layer_new(), you are now required - to add it to an image before calling any functions with - the drawable as an argument. - - - - - - - GIT - - - - - What should I put in the commit message when doing a git commit? - - - - - Please put a short explanation of the change on the first line. - Then, after an empty line, you can describe the change in more - detail using as many lines as you need. Try not to exceed 72 - colums. - - - If the commit fixes a bug or part of a bug please use the - bug number and description as the first line of the commit - message. It's most convenient to just copy the line from the - Bugzilla bug page. - - - - - - - GEGL - - - - - What is GEGL? - - - - - GEGL is the Generic - Graphical Library. It is supposed to replace the - handling of various image processing tasks in GIMP in - a not too distant future (planned for GIMP 2.6). - - - - - - - - What will GEGL be able to do? - - - - - GEGL will be a general image processing library. It uses - a directed acyclic graph, a DAG, to represent image - processing operations. In the DAG, images are edges, and - operations are nodes. It takes advantage of this DAG to - minimize regions which are processed, provide efficient - caching of operations, and efficient redrawing when a - parameter of the graph changes. - - - GEGL should also be independent of the data type being - processed and will be able to handle high bit depth - images, ICC profiles and parallel processing of image - tiles. - - - - - - - - What does all that gibberish mean for GIMP? - - - - - Many highly requested features of the GIMP will be easier - to do using GEGL. Layer effects, layer groups, and - adjustment layers are quite easily represented (and - efficiently calculated) using the DAG organization of GEGL. - CMYK and high bit depth support will be easier because - GEGL does not make the same assumptions about color spaces - and data types that the GIMP does. - - - The reusability of image processing operations means that - plug-ins will be able to be designed in a much more modular - way. The brush system will be able to become more - flexible, especially when filter plug-ins are able to be - used as procedural brush plug-ins. - - - - - - Bugzilla - - - - - What is Bugzilla? - - - - - The GIMP project uses GNOME Bugzilla for - tracking of bug reports, enhancement requests etc. - - - A beginners tutorial describing how to report a bug can be - found in the - How To Report GIMP Bugs document. - - - An easy to use interface to reporting GIMP bugs can be - found on bugs.gimp.org. - - - - - - - - What is the meaning of the NEEDINFO status code in - Bugzilla? - - - - - If the status of a bug is changed to NEEDINFO it means the - GIMP developers need more information from the bug - reporter in order to resolve the bug. - - - More information about the meaning of the Bugzilla status - field codes can be found in - A Bug's Life Cycle. - - - - - - - - What is the best way to refer to a bug in Bugzilla? - - - - - The best way to refer to a bug is bug - #nnnnn, where nnnnn is the bug number. Using - bug before the number allows Bugzilla to - link to the corresponding bug report automatically. Using - # before the number is optional for - Bugzilla but makes it easier to locate references to bug - reports in the ChangeLog or in e-mails. - - - When referencing multiple bugs, it is better to be a bit - redundant by writing bug #xxxxx, bug #yyyyy and bug - #zzzzz instead of bugs #xxxxx, #yyyyy and - #zzzzz in order to allow Bugzilla to link all bugs - automatically. - - - - - - - - What is the proper way of handling duplicate bug reports? - - - - - A bug report describing the same bug as a previous bug - report should be marked as DUPLICATE of the older one. - In some exceptional cases, it is possible to mark an old - bug report as DUPLICATE of a newer one (e.g., when the - newer bug report has a significantly better description - than the older one). - - - Another exception is when the same person submits the same - bug report several times (same description): in this case, - it is better to mark the additional copies of the bug - report as INVALID in order to avoid inflating the - statistics about the number of duplicates. - - - - - - - - What is the proper way of marking a bug as RESOLVED? - - - - - When fixing a bug, always mention the bug number in the - commit message. Once the changes are in git, paste the - relevant part of the commit message (or all of it) in the - comment field and mark the bug as RESOLVED FIXED. - These cross-references help a lot when trying to find - when a bug was fixed, its relations to other bugs, and - potential regressions. - - - A bug that is fixed in git or in an unstable release - should be marked as RESOLVED FIXED. Optionally, the - reporter or someone other than the one who fixed the bug - can mark it as VERIFIED after some testing. When the fix - is part of a stable release, it can be marked as CLOSED. - - - This is explained further in A - Bug's Life Cycle except for the difference between - stable and unstable releases. - - - - - - - Miscellaneous - - - - - Where can I learn more about the GObject system used by - GIMP? - - - - - The - GObject - documentation has a - nice tutorial that you might want to have a look at. - - - - - - - - Where can I learn more about color spaces etc? - - - - - Charles Poynton has collected a set of Frequently - Asked Questions about Color. - - - - - - - - Where can I learn more about image manipulation - algorithms? - - - - - A good source of information is the - comp.graphics.algorithms list of Frequently - Asked Questions. - - - - - - - - Is there a GIMP user FAQ available? - - - - - There is no user FAQ available at the moment. However - there has been discussions about creating one. If you - would like to help with this please drop a mail on the - GIMP developer mailing - list. - - - - - - - - How can I contribute to this FAQ? - - - - - If you would like to contribute to this FAQ, send an - e-mail to the GIMP developer mailing list with the - exact text you think should be included (both question and - answer). - - - With your help this FAQ will grow and become more useful. - - - - - - - - - diff --git a/gimpcon2000.xml b/gimpcon2000.xml deleted file mode 100644 index e03fbab..0000000 --- a/gimpcon2000.xml +++ /dev/null @@ -1,56 +0,0 @@ - - -]> - - - - - GIMP Developers Conference 2000 - GIMPCon 2000 - Chaos Computer Club, Berlin - - - - The first official GIMP Developers Conference took place - June 2nd - 4th 2000 in Berlin. - - - - The Chaos Computer Club - Berlin was so kind to allow us to use their rooms for the - conference. The Chaos Computer - Club is a galactic community of human beings including - all ages, genders, races and social positions. They demand - unlimited freedom and flow of information without censorship. - - - - - - - - - - The People at GIMPCon 2000 - - - - - - From left to right, top to bottom: Calvin, Simon, Seth, Jakub, - Lauri, Austin, Tigert, Tim, Jens, Tor, Jay, Daniel, Sven, Adam, - Mitch, Garry, Marc, Caroline, Andy, Yosh. - - - - We'd like to thank the Free - Software Foundation, the Chaos Computer Club and O'Reilly Germany for their - help that made this meeting possible. - - - diff --git a/git.xml b/git.xml deleted file mode 100644 index e620906..0000000 --- a/git.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - Git - Git - Living on the bleeding edge - - - - The GIMP source code lives in the gimp - repository on the - GNOME git server. - For more information on the GNOME git solution, go - here. - - - - The GNOME git server hosts a couple of GIMP related repositories: - - - - - - - Module - Description - - - - - - babl - - - Pixel format conversion library - - - - - gegl - - - Generic Graphical Library - - - - - gimp - - - GIMP and the standard set of plug-ins - - - - - gimp-data-extras - - - GIMP Data files such as brushes, gradients, patterns and the like - - - - - gimp-gap - - - GIMP Animation Package, a set of plug-ins that provide - video editing functionality - - - - - gimp-help-2 - - - GIMP User Manual - - - - - gimp-perl - - - GIMP Perl bindings and a bunch of nice gimp-perl scripts - - - - - gimp-plugin-template - - - GIMP Plug-In Template, a starting ground for plug-in developers, - currently in need of updating with regards to the use of GEGL - - - - - gimp-plugins-unstable - - - GIMP plug-ins from the past, a collection of unstable and - unmaintained plug-ins - - - - - gimp-ruby - - - GIMP Ruby-based scripting plug-in - - - - - gimp-tiny-fu - - - GIMP Tiny-Fu, a drop-in replacement for Script-Fu - - - - - gimp-web - - - The GIMP web site, available at www.gimp.org - - - - - gimp-web-devel - - - The source of the pages you are reading right now - - - - - - - diff --git a/index.xml b/index.xml deleted file mode 100644 index cb9c8bb..0000000 --- a/index.xml +++ /dev/null @@ -1,37 +0,0 @@ - - -]> - - - - - - GIMP Development - Online Resources for GIMP Developers - - - - This site tries to provide useful information for GIMP developers. - No matter if you are into plug-in - development or want to dive into the - internals of the - GIMP core, you should find your way from here. - - - - If you're looking for the main GIMP website you should visit - www.gimp.org. - - - - The GIMP source code is versioned with git. You - can browse the - source online. - - - diff --git a/mailing-lists.xml b/mailing-lists.xml deleted file mode 100644 index 730af9a..0000000 --- a/mailing-lists.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - Mailing Lists - The finest spam in town - - - - There are several mailing-lists related to GIMP and - www.gimp.org lists them all. - - - diff --git a/plug-in-template.xml b/plug-in-template.xml deleted file mode 100644 index 5f13fe0..0000000 --- a/plug-in-template.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - GIMP Plug-In Template - Plug-In Template - Don't start from scratch - - - - The GIMP Plug-In Template is an empty GIMP Plug-In that does - nothing. It also has a GUI that allows to control how it achieves - this task. But best of all, it comes with a complete setup for - autoconf, - automake, - internationalisation and all these things you never wanted to know - about. - - - - Thanks to the GIMP Plug-In Template you don't need to worry about - all these things. Just download the tarball, add some magic image - manipulation routines and voilà, your own GIMP plug-in. - - - - Grab the latest release from - - ftp.gimp.org/pub/gimp/plugin-template/ - - - - diff --git a/plug-ins.xml b/plug-ins.xml deleted file mode 100644 index 2361348..0000000 --- a/plug-ins.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - -]> - - - - - Plug-In Development - Writing GIMP plug-ins - - - - - - Writing a GIMP Plug-In Part I - - - Writing a GIMP Plug-In Part II - - - Writing a GIMP Plug-In Part III - - - - - - Make good use of the GIMP 2.0 API reference, - and you can also have a look at a talk about - GIMP plug-in programming that Simon gave at GUADEC in Sevilla. - - - diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..16eb494 --- /dev/null +++ b/public/404.html @@ -0,0 +1,131 @@ + + + + + + + + + + + 404 Page not found · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+

404: Page not found

+

Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. Head back home to try finding it again.

+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/about.html b/public/about.html new file mode 100644 index 0000000..07855fa --- /dev/null +++ b/public/about.html @@ -0,0 +1,142 @@ + + + + + + + + + + + About this Site · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

About this Site

+ +

The look of this site was borrowed from +www.gimp.org. +Under the hood it is based on +DocBook Website. +If you are curious, have a look at the Markdown source +of the page you are reading.

+

If you want to help us with developer.gimp.org, clone the +repository gimp-web-devel from git.

+ +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/api/2.0/libtest/test.txt b/public/api/2.0/libtest/test.txt new file mode 100644 index 0000000..c677029 --- /dev/null +++ b/public/api/2.0/libtest/test.txt @@ -0,0 +1 @@ +only a test. diff --git a/public/apple-touch-icon-144-precomposed.png b/public/apple-touch-icon-144-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..19323de1ee3aa16ca05e222a3aecdb5d6251b578 GIT binary patch literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q2}owBl)eX2k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+81HzxIEGZ*dUMAxuPH$0z{6W5pO}33{8R+o-182kbX-^L zyVq(_$?dkxymG3UulmYkZQng|_TB%H6+f@$X}ox(sO!gN*I(XMWl&3CV)Hq`!ZV|R zQ^J5z*dT#PE#Ux*&w&Qc84W-#BQsdR`YZ0c*7hGyzP-(R-^@)q@BgmIoOSu-mM4k7 z_PyVAPWBm}_ca5a%STtO`ef7p>HF{H*W=e;f4M#-GVJ=-KZjccjuqBCdwV{A>j&{) zNoP;8Uw;1+NV!}-@9{-55RcuMuKC?xyXVEu^Upv3@xAuibVF;`Ck-a$z;_$0TLl*N z966iDoYVR3_uoIh)9U9{yL+!sPp!0&$rIbGv-)+_zeFdF#}@Z=_zoBBj9C>W*49B zfA@zWXZPJ@);|C4me{h+n3$n*s-2HGCoG$9$11@vE!bP|@u3yZfQf;@)78&qol`;+ E0G>zh-v9sr literal 0 HcmV?d00001 diff --git a/public/bugs.html b/public/bugs.html new file mode 100644 index 0000000..0ef670b --- /dev/null +++ b/public/bugs.html @@ -0,0 +1,151 @@ + + + + + + + + + + + Bug Tracking System · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

Bug Tracking System

+ +

The GIMP project uses Gitlab’s +issues, +to coordinate bug reports. Gitlab is also used for enhancement requests +and the preferred way to submit patches for the GIMP is make a +merge request.

+

On www.gimp.org you can find a document describing +HOW TO Report GIMP Bugs. +You can also find a document that describes +How To Create and Submit a Patch.

+

Below is a list of links to get you started with Gitlab:

+ + +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..6676b68 --- /dev/null +++ b/public/categories/index.html @@ -0,0 +1,133 @@ + + + + + + + + + + + Categories · GIMP Developer Resources + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..73ad696 --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1,11 @@ + + + + Categories on GIMP Developer Resources + https://developer.gimp.org/categories/ + Recent content in Categories on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + + diff --git a/public/changelog.html b/public/changelog.html new file mode 100644 index 0000000..f67f790 --- /dev/null +++ b/public/changelog.html @@ -0,0 +1,139 @@ + + + + + + + + + + + GIMP ChangeLog · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

GIMP ChangeLog

+ +

The GIT repository +lists all changes in detail. The list below shows the latest +commits. It is generated from the RSS feed delivered by +the CIA.

+ + +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/css/hyde.css b/public/css/hyde.css new file mode 100644 index 0000000..597c8cd --- /dev/null +++ b/public/css/hyde.css @@ -0,0 +1,300 @@ +/* This is the stylesheet of http://developer.gimp.org/ and should + * only be changed by the designer or the website maintainer. Remember + * that changes done here will change the appearance on the whole site + * so keep a backup of this file while working with it. Niklas */ + +/* Copyright (C) 2002-2006 by The GIMP Web Team - Contributions by: + * Ville Pätsi (drc), Henrik Brix Andersen (brix), Carol Spears + * (carol), Niklas Mattisson (scizzo), Raphaël Quinet (raphael), + * Branko Collin (branko), Sven Neumann (neo) and Øyvind Kolås + * (pippin) + * + * This style sheet and corresponding site layout are designed to be + * used on official GIMP web sites only. You may copy some parts of + * this file into your own style sheet as long as you create your own + * design that is significantly different from the one used on GIMP + * web sites (layout, colors, etc.) and you give appropriate credit if + * you copy more than a few lines from this file (do not claim that + * you wrote everything yourself). + */ + +body { + background: white; + color: black; + font-family: arial,helvetica,sans-serif; + margin: 0px; + padding: 0px; +} + +a { + background: transparent; + color: #566e41; + text-decoration: none; + font-weight: bold; +} + +a:hover { + background: transparent; + color: #991e1e; + text-decoration: underline; + font-weight: bold; +} + +img { + border: none; +} + +img.map { + margin: 0px; + padding: 0px; +} + +p { + margin-top: 1.33em; + margin-right: 1.33em; + text-align: justify; +} + +p.title { + font-size: 110%; +} + +p.images img { + border: solid black 2px; +} + +p.framelessimages, +p.images { + text-align: center; +} + +p.screenshot { + clear:both; + padding: 1em; +} + +p.screenshot .mediaobject { + float: left; + background: url(/images/shadow.png) no-repeat bottom right !important; + background: url(/images/shadow.gif) no-repeat bottom right; + margin: 0 0 6px 6px; + padding: 4px; +} + +p.screenshot .mediaobject img { + border: none; + margin: -6px 2px -2px -6px; +} + +li { + text-align: justify; +} + +td { + padding: 5px 5px 0px 0px; +} + +td.main { + padding: 10px; + padding-left: 40px; + padding-right: 40px; + vertical-align: top; + width: 100%; +} + +td.map { + margin: 0px; + padding: 0px; +} + +h1 { + background-color: #dce5d4; + color: black; + border: thin solid #a9b3a1; + padding: 5px; + margin-bottom: 30px; + margin-left: -30px; + margin-right: -30px; + font-weight: bold; + font-size: 110%; + text-align: center; +} + +h2 { + font-weight: bold; + clear: both; + font-size: 110%; +} + +h3 { + font-weight: bold; + clear: both; + font-size: 105%; +} + +td.menu { + background: #dce5d4; + color: black; + border-style: solid; + border-color: #a9b3a1; + border-top-width: 0px; + border-bottom-width: 0px; + border-left-width: 0px; + border-right-width: 1px; + padding: 10px; + font-weight: bold; + vertical-align: top; + white-space: nowrap; +} + +table.layout { + clear: both; + margin: 0px; + border: none; + padding: 0px; + border-collapse: collapse; + width: 100%; +} + +div.titlebar { + background-image: url("../images/developer-barbg.png"); + background-repeat: repeat-x; + height: 100px; +} + +div.informaltable table { + border-collapse: collapse; +} + +div.informaltable table tr td, div.informaltable table tr th { + padding: 5px; +} + +img.titlebarleft { + float: left; +} + +img.titlebarright { + float: right; +} + +div.linkbar, div.navbar { + clear: both; + background: #dce5d4; + color: black; + border: solid #a9b3a1; + border-width: 1px 0px 1px 0px; + padding: 5px 5px 5px 5px; + font-weight: bold; + text-align: center; +} + +span.footerleft { + float: left; + padding: 20px; +} + +span.footerright { + float: right; + padding: 20px; +} + +span.shrink1 { + padding-left: 10px; + font-size: 95%; +} + +span.shrink2 { + padding-left: 20px; + font-size: 90%; +} + +span.shrink3 { + padding-left: 30px; + font-size: 85%; +} + +div.rss { + margin-top: 1em; + margin-bottom: 2em; +} + +div.rss dd p { + white-space: pre; + border-width: 0px; + padding: 0px; + border: 2px solid red; +} + +div.rss img { + border: none; + float: right; + border: 2px solid red; +} + +div.rss p { + background-color: green; + display: inline; +} + +span.date { + display: block; + font-size: 75%; + padding-right: 1em; + font-style: italic; + background-color: #ddd; + text-align: right; + border-left: 1px solid #888; + border-top: 1px solid #888; + border-right: 1px solid #888; +} + +div.rss ul { + padding-right: 1em; + margin-top: -0.1em; + padding-left: 2.0em; +} + +div.rss strong { + font-weight: bold; + font-style: italic; + color: #566e41; +} +div.rss b { + font-weight : normal; + color: #000: +} + + +div.rss b { + font-weight: normal; +} + +div.rss ul li { + text-align: left; +} + +div.rss_entry { + margin-bottom: 1em; +} + +div.qandaset tr.question td { + padding-top: 15px; +} + +div.qandaset tr.question p { + margin: 0px; +} + +@media print { + +div.navbar, div.linkbar, td.menu { + display: none +} + +td.main { + padding-right: 0px; + padding-left: 0px; +} + +} diff --git a/public/css/poole.css b/public/css/poole.css new file mode 100644 index 0000000..ec6a32f --- /dev/null +++ b/public/css/poole.css @@ -0,0 +1,404 @@ +/* + * ___ + * /\_ \ + * _____ ___ ___\//\ \ __ + * /\ '__`\ / __`\ / __`\\ \ \ /'__`\ + * \ \ \_\ \/\ \_\ \/\ \_\ \\_\ \_/\ __/ + * \ \ ,__/\ \____/\ \____//\____\ \____\ + * \ \ \/ \/___/ \/___/ \/____/\/____/ + * \ \_\ + * \/_/ + * + * Designed, built, and released under MIT license by @mdo. Learn more at + * https://github.com/poole/poole. + */ + + +/* + * Contents + * + * Body resets + * Custom type + * Messages + * Container + * Masthead + * Posts and pages + * Pagination + * Reverse layout + * Themes + */ + + +/* + * Body resets + * + * Update the foundational and global aspects of the page. + */ + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; +} + +html { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5; +} +@media (min-width: 38em) { + html { + font-size: 20px; + } +} + +body { + color: #515151; + background-color: #fff; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; +} + +/* No `:visited` state is required by default (browsers will use `a`) */ +a { + color: #227bb9; + text-decoration: none; +} +/* `:focus` is linked to `:hover` for basic accessibility */ +a:hover, +a:focus { + text-decoration: underline; +} + +/* Headings */ +h1, h2, h3, h4, h5, h6 { + margin-bottom: .5rem; + font-weight: bold; + line-height: 1.25; + color: #313131; + text-rendering: optimizeLegibility; +} +h1 { + font-size: 2rem; +} +h2 { + margin-top: 1rem; + font-size: 1.5rem; +} +h3 { + margin-top: 1.5rem; + font-size: 1.25rem; +} +h4, h5, h6 { + margin-top: 1rem; + font-size: 1rem; +} + +/* Body text */ +p { + margin-top: 0; + margin-bottom: 1rem; +} + +strong { + color: #303030; +} + + +/* Lists */ +ul, ol, dl { + margin-top: 0; + margin-bottom: 1rem; +} + +dt { + font-weight: bold; +} +dd { + margin-bottom: .5rem; +} + +/* Misc */ +hr { + position: relative; + margin: 1.5rem 0; + border: 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #fff; +} + +abbr { + font-size: 85%; + font-weight: bold; + color: #555; + text-transform: uppercase; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #e5e5e5; +} + +/* Code */ +code, +pre { + font-family: Menlo, Monaco, "Courier New", monospace; +} +code { + padding: .25em .5em; + font-size: 85%; + color: #b3555e; + background-color: #f9f9f9; + border-radius: 3px; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + padding: 1rem; + font-size: .8rem; + line-height: 1.4; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + background-color: #f9f9f9; +} +pre code { + padding: 0; + font-size: 100%; + color: inherit; + background-color: transparent; +} +.highlight { + margin-bottom: 1rem; + border-radius: 4px; +} +.highlight pre { + margin-bottom: 0; +} + +/* Quotes */ +blockquote { + padding: .5rem 1rem; + margin: .8rem 0; + color: #7a7a7a; + border-left: .25rem solid #e5e5e5; +} +blockquote p:last-child { + margin-bottom: 0; +} +@media (min-width: 30em) { + blockquote { + padding-right: 5rem; + padding-left: 1.25rem; + } +} + +img { + display: block; + margin: 0 0 1rem; + border-radius: 5px; + max-width: 100%; +} + +/* Tables */ +table { + margin-bottom: 1rem; + width: 100%; + border: 1px solid #e5e5e5; + border-collapse: collapse; +} +td, +th { + padding: .25rem .5rem; + border: 1px solid #e5e5e5; +} +tbody tr:nth-child(odd) td, +tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + + +/* + * Custom type + * + * Extend paragraphs with `.lead` for larger introductory text. + */ + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + + +/* + * Messages + * + * Show alert messages to users. You may add it to single elements like a `

`, + * or to a parent if there are multiple elements to show. + */ + +.message { + margin-bottom: 1rem; + padding: 1rem; + color: #717171; + background-color: #f9f9f9; +} + + +/* + * Container + * + * Center the page content. + */ + +.container { + max-width: 38rem; + padding-left: 1rem; + padding-right: 1rem; + margin-left: auto; + margin-right: auto; +} + + +/* + * Masthead + * + * Super small header above the content for site name and short description. + */ + +.masthead { + padding-top: 1rem; + padding-bottom: 1rem; + margin-bottom: 3rem; +} +.masthead-title { + margin-top: 0; + margin-bottom: 0; + color: #505050; +} +.masthead-title a { + color: #505050; +} +.masthead-title small { + font-size: 75%; + font-weight: 400; + color: #c0c0c0; + letter-spacing: 0; +} + + +/* + * Posts and pages + * + * Each post is wrapped in `.post` and is used on default and post layouts. Each + * page is wrapped in `.page` and is only used on the page layout. + */ + +.page, +.post { + margin-bottom: 4em; +} + +/* Blog post or page title */ +.page-title, +.post-title, +.post-title a { + color: #303030; +} +.page-title, +.post-title { + margin-top: 0; +} + +/* Meta data line below post title */ +.post-date { + display: block; + margin-top: -.5rem; + margin-bottom: 1rem; + color: #757575; +} + +/* Related posts */ +.related { + padding-top: 2rem; + padding-bottom: 2rem; + border-top: 1px solid #eee; +} +.related-posts { + padding-left: 0; + list-style: none; +} +.related-posts h3 { + margin-top: 0; +} +.related-posts li small { + font-size: 75%; + color: #999; +} +.related-posts li a:hover { + color: #227bb9; + text-decoration: none; +} +.related-posts li a:hover small { + color: inherit; +} + + +/* + * Pagination + * + * Super lightweight (HTML-wise) blog pagination. `span`s are provide for when + * there are no more previous or next posts to show. + */ + +.pagination { + overflow: hidden; /* clearfix */ + margin-left: -1rem; + margin-right: -1rem; + font-family: "PT Sans", Helvetica, Arial, sans-serif; + color: #ccc; + text-align: center; +} + +/* Pagination items can be `span`s or `a`s */ +.pagination-item { + display: block; + padding: 1rem; + border: 1px solid #eee; +} +.pagination-item:first-child { + margin-bottom: -1px; +} + +/* Only provide a hover state for linked pagination items */ +a.pagination-item:hover { + background-color: #f5f5f5; +} + +@media (min-width: 30em) { + .pagination { + margin: 3rem 0; + } + .pagination-item { + float: left; + width: 50%; + } + .pagination-item:first-child { + margin-bottom: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + .pagination-item:last-child { + margin-left: -1px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } +} diff --git a/public/css/print.css b/public/css/print.css new file mode 100644 index 0000000..da8f1df --- /dev/null +++ b/public/css/print.css @@ -0,0 +1,19 @@ +.sidebar { + display: none !important; +} + +.content { + margin: 0 auto; + width: 100%; + float: none; + display: initial; +} + +.container { + width: 100%; + float: none; + display: initial; + padding-left: 1rem; + padding-right: 1rem; + margin: 0 auto; +} diff --git a/public/css/syntax.css b/public/css/syntax.css new file mode 100644 index 0000000..1264b87 --- /dev/null +++ b/public/css/syntax.css @@ -0,0 +1,66 @@ +.hll { background-color: #ffffcc } + /*{ background: #f0f3f3; }*/ +.c { color: #999; } /* Comment */ +.err { color: #AA0000; background-color: #FFAAAA } /* Error */ +.k { color: #006699; } /* Keyword */ +.o { color: #555555 } /* Operator */ +.cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ +.cp { color: #009999 } /* Comment.Preproc */ +.c1 { color: #999; } /* Comment.Single */ +.cs { color: #999; } /* Comment.Special */ +.gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #003300; } /* Generic.Heading */ +.gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ +.go { color: #AAAAAA } /* Generic.Output */ +.gp { color: #000099; } /* Generic.Prompt */ +.gs { } /* Generic.Strong */ +.gu { color: #003300; } /* Generic.Subheading */ +.gt { color: #99CC66 } /* Generic.Traceback */ +.kc { color: #006699; } /* Keyword.Constant */ +.kd { color: #006699; } /* Keyword.Declaration */ +.kn { color: #006699; } /* Keyword.Namespace */ +.kp { color: #006699 } /* Keyword.Pseudo */ +.kr { color: #006699; } /* Keyword.Reserved */ +.kt { color: #007788; } /* Keyword.Type */ +.m { color: #FF6600 } /* Literal.Number */ +.s { color: #d44950 } /* Literal.String */ +.na { color: #4f9fcf } /* Name.Attribute */ +.nb { color: #336666 } /* Name.Builtin */ +.nc { color: #00AA88; } /* Name.Class */ +.no { color: #336600 } /* Name.Constant */ +.nd { color: #9999FF } /* Name.Decorator */ +.ni { color: #999999; } /* Name.Entity */ +.ne { color: #CC0000; } /* Name.Exception */ +.nf { color: #CC00FF } /* Name.Function */ +.nl { color: #9999FF } /* Name.Label */ +.nn { color: #00CCFF; } /* Name.Namespace */ +.nt { color: #2f6f9f; } /* Name.Tag */ +.nv { color: #003333 } /* Name.Variable */ +.ow { color: #000000; } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #FF6600 } /* Literal.Number.Float */ +.mh { color: #FF6600 } /* Literal.Number.Hex */ +.mi { color: #FF6600 } /* Literal.Number.Integer */ +.mo { color: #FF6600 } /* Literal.Number.Oct */ +.sb { color: #CC3300 } /* Literal.String.Backtick */ +.sc { color: #CC3300 } /* Literal.String.Char */ +.sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #CC3300 } /* Literal.String.Double */ +.se { color: #CC3300; } /* Literal.String.Escape */ +.sh { color: #CC3300 } /* Literal.String.Heredoc */ +.si { color: #AA0000 } /* Literal.String.Interpol */ +.sx { color: #CC3300 } /* Literal.String.Other */ +.sr { color: #33AAAA } /* Literal.String.Regex */ +.s1 { color: #CC3300 } /* Literal.String.Single */ +.ss { color: #FFCC33 } /* Literal.String.Symbol */ +.bp { color: #336666 } /* Name.Builtin.Pseudo */ +.vc { color: #003333 } /* Name.Variable.Class */ +.vg { color: #003333 } /* Name.Variable.Global */ +.vi { color: #003333 } /* Name.Variable.Instance */ +.il { color: #FF6600 } /* Literal.Number.Integer.Long */ + +.css .o, +.css .o + .nt, +.css .nt + .nt { color: #999; } diff --git a/public/cvs.html b/public/cvs.html new file mode 100644 index 0000000..dcbc9fb --- /dev/null +++ b/public/cvs.html @@ -0,0 +1,136 @@ + + + + + + + + + + + CVS · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +

+ + + + +
+
+ + + + + + + +
+
+
+

CVS

+ +

GIMP doesn’t use CVS any longer. The source code repository has been +migrated to git.

+ +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/default.css b/public/default.css new file mode 100644 index 0000000..597c8cd --- /dev/null +++ b/public/default.css @@ -0,0 +1,300 @@ +/* This is the stylesheet of http://developer.gimp.org/ and should + * only be changed by the designer or the website maintainer. Remember + * that changes done here will change the appearance on the whole site + * so keep a backup of this file while working with it. Niklas */ + +/* Copyright (C) 2002-2006 by The GIMP Web Team - Contributions by: + * Ville Pätsi (drc), Henrik Brix Andersen (brix), Carol Spears + * (carol), Niklas Mattisson (scizzo), Raphaël Quinet (raphael), + * Branko Collin (branko), Sven Neumann (neo) and Øyvind KolÃ¥s + * (pippin) + * + * This style sheet and corresponding site layout are designed to be + * used on official GIMP web sites only. You may copy some parts of + * this file into your own style sheet as long as you create your own + * design that is significantly different from the one used on GIMP + * web sites (layout, colors, etc.) and you give appropriate credit if + * you copy more than a few lines from this file (do not claim that + * you wrote everything yourself). + */ + +body { + background: white; + color: black; + font-family: arial,helvetica,sans-serif; + margin: 0px; + padding: 0px; +} + +a { + background: transparent; + color: #566e41; + text-decoration: none; + font-weight: bold; +} + +a:hover { + background: transparent; + color: #991e1e; + text-decoration: underline; + font-weight: bold; +} + +img { + border: none; +} + +img.map { + margin: 0px; + padding: 0px; +} + +p { + margin-top: 1.33em; + margin-right: 1.33em; + text-align: justify; +} + +p.title { + font-size: 110%; +} + +p.images img { + border: solid black 2px; +} + +p.framelessimages, +p.images { + text-align: center; +} + +p.screenshot { + clear:both; + padding: 1em; +} + +p.screenshot .mediaobject { + float: left; + background: url(/images/shadow.png) no-repeat bottom right !important; + background: url(/images/shadow.gif) no-repeat bottom right; + margin: 0 0 6px 6px; + padding: 4px; +} + +p.screenshot .mediaobject img { + border: none; + margin: -6px 2px -2px -6px; +} + +li { + text-align: justify; +} + +td { + padding: 5px 5px 0px 0px; +} + +td.main { + padding: 10px; + padding-left: 40px; + padding-right: 40px; + vertical-align: top; + width: 100%; +} + +td.map { + margin: 0px; + padding: 0px; +} + +h1 { + background-color: #dce5d4; + color: black; + border: thin solid #a9b3a1; + padding: 5px; + margin-bottom: 30px; + margin-left: -30px; + margin-right: -30px; + font-weight: bold; + font-size: 110%; + text-align: center; +} + +h2 { + font-weight: bold; + clear: both; + font-size: 110%; +} + +h3 { + font-weight: bold; + clear: both; + font-size: 105%; +} + +td.menu { + background: #dce5d4; + color: black; + border-style: solid; + border-color: #a9b3a1; + border-top-width: 0px; + border-bottom-width: 0px; + border-left-width: 0px; + border-right-width: 1px; + padding: 10px; + font-weight: bold; + vertical-align: top; + white-space: nowrap; +} + +table.layout { + clear: both; + margin: 0px; + border: none; + padding: 0px; + border-collapse: collapse; + width: 100%; +} + +div.titlebar { + background-image: url("../images/developer-barbg.png"); + background-repeat: repeat-x; + height: 100px; +} + +div.informaltable table { + border-collapse: collapse; +} + +div.informaltable table tr td, div.informaltable table tr th { + padding: 5px; +} + +img.titlebarleft { + float: left; +} + +img.titlebarright { + float: right; +} + +div.linkbar, div.navbar { + clear: both; + background: #dce5d4; + color: black; + border: solid #a9b3a1; + border-width: 1px 0px 1px 0px; + padding: 5px 5px 5px 5px; + font-weight: bold; + text-align: center; +} + +span.footerleft { + float: left; + padding: 20px; +} + +span.footerright { + float: right; + padding: 20px; +} + +span.shrink1 { + padding-left: 10px; + font-size: 95%; +} + +span.shrink2 { + padding-left: 20px; + font-size: 90%; +} + +span.shrink3 { + padding-left: 30px; + font-size: 85%; +} + +div.rss { + margin-top: 1em; + margin-bottom: 2em; +} + +div.rss dd p { + white-space: pre; + border-width: 0px; + padding: 0px; + border: 2px solid red; +} + +div.rss img { + border: none; + float: right; + border: 2px solid red; +} + +div.rss p { + background-color: green; + display: inline; +} + +span.date { + display: block; + font-size: 75%; + padding-right: 1em; + font-style: italic; + background-color: #ddd; + text-align: right; + border-left: 1px solid #888; + border-top: 1px solid #888; + border-right: 1px solid #888; +} + +div.rss ul { + padding-right: 1em; + margin-top: -0.1em; + padding-left: 2.0em; +} + +div.rss strong { + font-weight: bold; + font-style: italic; + color: #566e41; +} +div.rss b { + font-weight : normal; + color: #000: +} + + +div.rss b { + font-weight: normal; +} + +div.rss ul li { + text-align: left; +} + +div.rss_entry { + margin-bottom: 1em; +} + +div.qandaset tr.question td { + padding-top: 15px; +} + +div.qandaset tr.question p { + margin: 0px; +} + +@media print { + +div.navbar, div.linkbar, td.menu { + display: none +} + +td.main { + padding-right: 0px; + padding-left: 0px; +} + +} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..84cce4dd307a78a3a9455c4fed62b49b9c7e61ad GIT binary patch literal 183 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 F|Je(V+A9D6 literal 0 HcmV?d00001 diff --git a/public/gimpcon/2003/gimpcon2003-mins-1/index.html b/public/gimpcon/2003/gimpcon2003-mins-1/index.html new file mode 100644 index 0000000..a1906ae --- /dev/null +++ b/public/gimpcon/2003/gimpcon2003-mins-1/index.html @@ -0,0 +1,372 @@ + + + + + + + + + + + · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

+ +
<title>The First Big Serious Meeting of GIMPCon 2003</title>
+<titleabbrev>First Meeting</titleabbrev>
+<summary>Minutes of the first GIMPCon 2003 Meeting</summary>
+
+ + + + + + + +
<para>
+  The idea of a foundation was proposed. Lots of ideas were thrown
+  about as to what kind of remit it would have. If created, the
+  foundation would certainly have 2 things we don't have at the
+  moment - a bank account people could donate to, and a focus on
+  <quote>marketing</quote> in the broadest sense of the word.
+</para>
+
+<para>
+  Some of the issues were whether the foundation would be set up
+  in Europe or in the US (in the US it might make it easier to get
+  donations from US companies, but in Europe we're not as
+  litigious, so setting up would certainly cost less, but then we
+  probably wouldn't have NPO status in the US), whether it would
+  have any technical aspect (that is, would the foundation act as
+  a kind of steering committee for the general direction of the
+  GIMP?), and how, if the issue came up, we might pay someone.
+</para>
+
+<para>
+  This led onto a discussion of whether the foundation would be
+  responsible for setting release dates, or whether we would have
+  a separate...
+</para>
+
+ + +
<para>
+  The general consensus (more on that later) was that a release
+  manager is a good thing. There do seem to be a few different
+  ideas of what the role would entail. The general idea would be
+  that the release manager would be responsible for following CVS
+  and know at what stage a given feature is at, follow bugzilla
+  making sure that bugs got milestoned for some release in order
+  of their priority, would annoy people to get commits in before
+  feature freeze dates or postpone mercilessly features which are
+  not finished.
+</para>
+
+<para>
+  It was agreed that a release schedule would be helpful to define
+  the perimeters of responsibility of the release manager -
+  basically, some way to set up large milestones to aim for with
+  things to go into those milestones. This release schedule would
+  be subject to revision, and would be no more realistic than any
+  other release schedule, but it would serve as a guide for
+  development. Dan agreed to draw up a first draft of this, and
+  we'll have something more concrete before the end of the
+  weekend.
+</para>
+
+<para>
+  The questions that came up about the release manager were things
+  like where his authority comes from, how does he decide which
+  bugs are important and which features can be postponed and so
+  on. In other words, how do decisions get made. Is the release
+  manager a benevolent dictator, or does he answer to the larger
+  developer and user community? If so, to what extent? Is backing
+  out CVS commits OK, for example?
+</para>
+
+<para>
+  So we started talking about how to get contentious decisions
+  made.
+</para>
+
+ + +
<para>
+  Currently, there are two ways to get something done in the
+  GIMP. First, you can write decent code and patches for a while,
+  until you get CVS commit access, then you write whatever feature
+  you're interested in, and commit it. If no-one backs it out,
+  then it's in.
+</para>
+
+<para>
+  Second, you can bring it up on the mailing list, or in bugzilla,
+  or in IRC (more on communication later), and discuss it until
+  there is a consensus. However, we tend to be pretty bad at
+  reaching consensus on anything even slightly contentious. The
+  important questions to be answered any time a discussion like
+  this comes up are what's going to be done, and who's going to do
+  it.
+</para>
+
+<para>
+  It was agreed that beyond a certain point, there is generally
+  very little technical merit to these types of discussions. It
+  was felt that about 5 days was enough for everyone with an
+  opinion on a given matter to make that opinion known, and that
+  after that point, it would be an idea to have a summary of the
+  salient points and close the discussion. That means, the people
+  here would stop posting to the discussion. Of course, if other
+  people want to keep on flaming, they're free to do so, but
+  people will just ignore the thread.
+</para>
+
+<para>
+  At this point, the summary should sum up the various points, and
+  finish with an answer to those two questions - what gets done,
+  and who's doing it.
+</para>
+
+<para>
+  We may even have a bake-off system. If there are two competing
+  ideas for the way something should be done, currently no-one
+  tends to do it. Ideally, both people would do it and we pick the
+  best one.
+</para>
+
+<para>
+  This brings up another point, though - in general, what is
+  authority? And in particular, at what point has someone gained
+  enough standing and authority to post one of these thread-ending
+  summaries? Some discussion is going to be had on that over the
+  weekend.
+</para>
+
+ + +
<para>
+  We talked about various ways of improving the way we use these
+  tools. First is whether it makes sense for us to have module
+  owners, and if so, who should they be? Should we use the system
+  of bug owners to track who is responsible for a bug at any given
+  time, or is the current scheme of bugs@gimp.org sufficient? Do
+  we need to change bugs@gimp.org to something else to avoid
+  confusion with the old bug reporting address? There were a few
+  open points in here.
+</para>
+
+<para>
+  Second, we talked about pre-release branches, and whether it
+  would be worthwhile having a mozilla style release cycle with
+  feature-freezes, followed by concurrent bug-fixing before
+  unstable releases, freeing up the branch for bigger stuff that
+  people want to start committing. In general, it was felt that
+  there was very little to be gained from that, and the current
+  system of a long-lived devel branch with self-imposed feature
+  freezes every few weeks was a better way to go.
+</para>
+
+<para>
+  We also expressed a desire to have more redundancy in the
+  non-technical aspects of The GIMP, things like the mailing lists
+  and ftp mirror lists should have more than one person with the
+  ability to change them so that if there's a problem, and that
+  person has no time to take care of it, then someone
+  will. Perhaps using a Debian or GNU style ticket system might
+  help here fro these particular tasks? In any case, everyone in a
+  given group should know everyone else in the group, and know
+  more or less that when an issue gets in, it will be handled by
+  at least one person.
+</para>
+
+ + +
<para>
+  It was agreed that we need to communicate better (that's a
+  no-brainer, really). For a start, every developer should be
+  subscribed to the userlist. gimp-devel (if it doesn't disappear
+  altogether) would only be used for technical discussions of
+  implementation details - all the philosophical level discussions
+  of new features, ui changes, release mechanisms and so on should
+  be discussed on the user list.
+</para>
+
+<para>
+  Basically, we're going to talk a lot more about how the
+  developers can interface better with the users.
+</para>
+
+ + +
<para>
+  Not too many of these... we will have a release manager, but we
+  need to define exactly what his/her remit will be. And who it
+  will be. We agreed that the <quote>5 days and it's dead</quote>
+  rule for threads makes sense, so that will be done.
+</para>
+
+ + +
<para>
+  <orderedlist>
+    <listitem>
+      Roadmap - rough release schedule, we will have a first draft
+      today.
+    </listitem>
+    <listitem>
+      GIMP Foundation - we need to define its responsibilities,
+      set up election rules, and get this set up. The principle of
+      the foundation is more or less agreed.
+    </listitem>
+    <listitem>
+      Communication
+    </listitem>
+    <listitem>
+      Release Manager - what'll he do, who'll he be. This should
+      be short once we have discussed communication channels a
+      bit.
+    </listitem>
+    <listitem>
+      Technie stuff - Sven and mitch are going to talk to us about
+      the re-organisation of the code, GObjectification of
+      everything, and other stuff. Daniel and Calvin are going to
+      talk to us about GEGL and how they feel The GIMP could use
+      it. This will probably be a two-way discussion about what
+      kind of things we expect GEGL to furnish as well.
+    </listitem>
+    <listitem>
+      GIMP tutorials - jimmac and nomis are going to do some
+      presentations for people, which should be good.
+    </listitem>
+    <listitem>
+      Plug-in distribution - 3 years ago this was discussion, yosh
+      has been working on something as a proof-of-concept, it
+      would be nice to address this and get something in place
+      soon.
+    </listitem>
+  </orderedlist>
+</para>
+
+ + + + +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2003/gimpcon2003-mins-2/index.html b/public/gimpcon/2003/gimpcon2003-mins-2/index.html new file mode 100644 index 0000000..a423f57 --- /dev/null +++ b/public/gimpcon/2003/gimpcon2003-mins-2/index.html @@ -0,0 +1,428 @@ + + + + + + + + + + + · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

+ +
<title>The Second Big Serious Meeting of GIMPCon2003</title>
+<titleabbrev>Second Meeting</titleabbrev>
+<summary>Minutes of the second GIMPCon 2003 Meeting</summary>
+
+ + + + + + +
<para>
+  There was quite a lot of talk on what was required for a 2.0
+  release. It was agreed that a pre-release should have feature
+  complete versions of everything going into 2.0, for obvious
+  reasons. These can be somewhat buggy, but they should at least
+  support what is supported in the 1.2 equivalents.
+</para>
+
+<para>
+  The major features or API changes which it was agreed are
+  necessary are:
+<orderedlist>
+  <listitem>Complete path tool (nomis)</listitem>
+  <listitem>Remove libgck (Sven and mitch)</listitem>
+  <listitem>Finish the text tool (Sven)</listitem>
+  <listitem>Documentation (more on this later)</listitem>
+  <listitem>Web-site (again, more on this later)</listitem>
+  <listitem>Some libgimp changes which need to be made now so that
+  we can havebinary compatibility across a 2.2 release</listitem>
+</orderedlist>
+</para>
+
+ + +
<para>
+  We felt that with pre-releases, the documentation will become
+  more complete. There should, however, be an effort to actively
+  get people writing docs. The main requirement, then, for 2.0
+  pre-releases will be to have a working help framework, so that
+  when people hit F1 for help, they at least get a message saying
+  <quote>This help item does not exist yet.If you would like to
+  help write it, contact docs@gimp.org</quote> or some such.
+  <footnote>
+<para>
+      That email address doesn't exist (yet). People interested in
+      helping with the documentation should have a look at the
+      <ulink url="http://wiki.gimp.org/gimp/GimpDocs">Wiki</ulink>.
+    </para>
+  </footnote>
+</para>
+
+<para>
+  If documentation is going to be released as a separate package,
+  as now seems likely, then we will need to define the interface
+  between the core and the help pages reasonably quickly. The
+  general idea is to more or less hard-code tagnames for a
+  particular help topic, and get the core and help using the same
+  tags, and agreeing on how they be communicated. This will
+  presumably require a considerable amount of communication with
+  the help team.
+</para>
+
+<para>
+  We also need to have the docs browsable online so that if people
+  want to browse them they can.
+</para>
+
+ + +
<para>
+  The new site should switch over to www.gimp.org soon. There will
+  obviously be quite a bit of pain involved as content gets added
+  and we get lots of <quote>your website sucks</quote> type
+  feedback, but this will only befor the short term. We should
+  switch to mmaybe as the main site before 2.0pre1. It was
+  suggested to do it even earlier than that, in the region of 2 to
+  3 weeks time.
+</para>
+
+<para>
+  It was also discussed whether it was a good idea to have a
+  separate coordinator for the website.
+</para>
+
+ + +
<para>
+  As an approximate set of ideals, it was agreed that we want
+  this: 2.0pre1 very soon, 2.0 soon, 2.2 next year, and GEGL
+  integration the end of next Summer.
+</para>
+
+<para>
+  More specifically, the near-term release schedule that we agreed
+  was reasonable is this:
+</para>
+
+<para>
+  1 or 2 developer releases (one now, more or less, and another
+  one in another 2 weeks). 6 weeks time (end of September 2003):
+  First pre-release of 2.0, including the features mentioned
+  above, and any other minor features that people code in the
+  meantime (hint, hint). Roughly 3 months later: 2.0
+</para>
+
+<para>
+  It was more or less agreed that 3 to 4 weeks was a nice
+  turnaround time for pre-releases, so that would imply between 4
+  and 6 (inclusive) pre-releases before 2.0.
+</para>
+
+<para>
+  The reason for not having a pre-release straight away was
+  mentioned above: to be feature complete, some features need a
+  little more than 2 weeks work, and people have real lives. So 6
+  weeks was felt to be a reasonable amount of time to have the
+  path tool and the help browser in place.
+</para>
+
+ + +
<para>
+  The developer release will also be a prelude to a bug week. We
+  would like people (that's you, in particular) to actively work
+  on bugzilla clean-up for 2.0 - bugs need to be prioritized,
+  unconfirmed bugs need confirming and milestoning (and if you're
+  feeling really helpful, fixing). The idea would more or less be
+  that the 2.0 milestone will be locked down for anything other
+  than serious bugs after this bug week, so if there are bugs that
+  are annoying you a lot, this is your chance to get them
+  considered and worked on for the 2.0 releases.
+</para>
+
+<para>
+  Just to spell that out - at the end of the bug week, any bugs
+  reported against The GIMP in CVS will be milestoned for 2.0.x,
+  or even 2.2, unless they are considered blockers for the
+  release. If we want to get a 2.0 release soon, we need to get
+  lots of testing done, and lots of bugfixing done, but we also
+  need to choose what to do and what not to do. We felt this was a
+  reasonable compromise.
+</para>
+
+<para>
+  It was also re-discussed whether it would make sense to have
+  module owners. The conclusion was that for certain components,
+  it makes sense to have a smaller group of people getting the bug
+  reports and having responsibility for them. This would be done
+  via mail aliases for the group of people guiding the component,
+  in a similar way to that which is used for (say) gtktreeview in
+  gtk+.
+</para>
+
+<para>
+  The module owner group wouldn't have to be technical, and we
+  should be actively recruiting people to do this kind of work and
+  leave more time for programmers to program.
+</para>
+
+<para>
+  This leads us on to...
+</para>
+
+ + +
<para>
+  There are lots of non-technical jobs that need doing around the
+  gimp-docs, website, bugzilla triage, internationalisation,
+  etc. Often it is quite difficult to know what needs doing, and
+  who to contact about getting it done. We need a list of
+  bite-sized tasks that people can do, including the kinds of
+  tasks that only take a few hours a week to do, but are ongoing
+  tasks.
+</para>
+
+<para>
+  We used to have a TODO, and we could use that system again, if
+  someone were maintaining it. That could come under the remit of
+  the release manager to some extent, but since the mainenance of
+  the TODO list is mostly a non-technical task, anyone could do it
+  (in fact, as an example of a task, <quote>Maintaining the TODO
+  list</quote> would go in the TODO list).
+</para>
+
+<para>
+  We might do this through Bugzilla using a keyword to allow
+  getting at the list easily, which would imply getting more
+  people looking at bugzilla regularly. Then again, if there were
+  a link to a bugzilla query on the webpage marked <quote>GIMP
+  TODO list</quote> we could get that for free.
+</para>
+
+ + +
<para>
+  Basically, we're agreed this is a good idea to have some kind of
+  public face people and companies can contribute to. There is no
+  problem with having 2 foundations, one in Europe and one in the
+  US. It was more or less agreed that assigning copyright to the
+  foundation isn't going to happen soon (for a start, so many
+  plug-in authors have gone their merry way and are almost
+  unfindable) This may hapen in the future, but most people felt
+  that it would not be something they'd be happy doing personally.
+</para>
+
+<para>
+  Other people said they would prefer to assign copyright to an
+  organism under the jurisdiction of European law rather than
+  under US jurisdiction.
+</para>
+
+<para>
+  So, to sum up, there's no reason not to have one of
+  these. Daniel Rogers has agreed to do the necessary paperwork
+  and set up the foundation and the bank account for donations in
+  the US. Pretty quickly after getting that up and going, we will
+  need to get a board of directors and a set of by-laws. We know
+  lots of people who can help with this (in particular, the GNOME
+  foundation and the FSF).
+</para>
+
+<para>
+  If someone wants to set up an equivalent in Europe, we're all
+  ears. Currently no-one has said they'll do it, so it's an open
+  point. To start, the foundation will only be a board an a bank
+  account - in the future, we could expand its responsibilities to
+  promotional work, a single point where people could go to get
+  speakers, a group that does press releases and so on. It was
+  agreed that at least in the short term it is undesirable to have
+  the foundation have actual control of source code, just in case
+  the foundation then gets sued.
+</para>
+
+<para>
+  In brief, it's being set up with a very narrow remit, with the
+  possibility to expand later if it is felt that there is a need.
+</para>
+
+ + +
<para>
+  The responsibilities are:
+<itemizedlist>
+  <listitem>
+    Follow CVS so that he can write release notes, and knows at
+    any given time who is working on what, and at what stage it
+    is
+  </listitem>
+  <listitem>
+    Follow bugzilla closely
+  </listitem>
+  <listitem>
+    Make releases regularly, according to the roadmap (or make
+    sure releases get made)
+  </listitem>
+  <listitem>
+    Update the roadmap to reflect reality
+  </listitem>
+  <listitem>
+    Write release notes for the releases (keep NEWS up to date)
+  </listitem>
+  <listitem>
+    Generally annoy people sending mails to the mailing lists and
+    sending content to the website to explain the state of play
+    and get people to work on stuff.
+  </listitem>
+</itemizedlist>
+</para>
+
+<para>
+  Dave Neary (me) agreed to do this. He already regrets it.
+</para>
+
+<para>
+  That's it folks - today, Sven and mitch are going to talk to us
+  about the major changes in the codebase and the general utility
+  stuff which exists now which has been written from scratch,
+  Calvin and Daniel are going to talk about GEGL and how we can
+  use it, and work towards having a GEGL that we can use in a
+  year. I'm going to lead a discussion on communication in the
+  GIMP, and how to maybe make it easier for people to contribute,
+  and jimmac is going to demonstrate what a power user really is.
+</para>
+
+<para>
+  Goodbye from everyone at camp. As usual, comments are welcome on
+  all this stuff. While on a philosophical level, we are agreed on
+  the direction things should take, all the details are open to
+  discussion, if there's any reason to change them.
+</para>
+
+ + + + +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2003/gimpcon2003-mins-3/index.html b/public/gimpcon/2003/gimpcon2003-mins-3/index.html new file mode 100644 index 0000000..5fc08e9 --- /dev/null +++ b/public/gimpcon/2003/gimpcon2003-mins-3/index.html @@ -0,0 +1,313 @@ + + + + + + + + + + + · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

+ +
<title>The Third Big Serious Meeting of GIMPCon 2003</title>
+<titleabbrev>Third Meeting</titleabbrev>
+<summary>Minutes of the third GIMPCon 2003 Meeting</summary>
+
+ + + + + + +
<para>
+  Like in any Free Software project, developers are leaving from
+  time to time to pursue other projects. And from time to time,
+  new developersare joining the team and starting to contribute.
+  However, it looks like the number of new developers joining the
+  GIMP development has been decreasing in the recent years. This
+  may be due in part to the fact that there haven't been any major
+  changes in a stable release for a long time.
+</para>
+
+<para>
+  Another reason may be that it is difficult to build the
+  development version because it depends on released versions of
+  some libraries that are not included yet in the major GNU/Linux
+  distributions (e.g., GTK+ version 2.2.2). Also, the number of
+  dependencies for GIMP 1.3.x is much higher than the number of
+  dependencies for GIMP 1.2.x, so it ismore difficult to have a
+  working build environment for the 1.3.x version. This problem
+  may be solved as time passes, because more and more
+  distributions will include the required libraries.
+</para>
+
+<para>
+  There should be a section on www.gimp.org or developer.gimp.org
+  titled <quote>How to contribute?</quote> or <quote>How to get
+  involved?</quote>. It should be easy for potential new
+  developers to see where to start and how they can help. More on
+  that below.
+</para>
+
+ + +
<para>
+  There was a discussion about binary distributions. This may help
+  people to try some versions of the GIMP (especially the
+  development versions) without having to compile everything.
+  However, maintaining binaries is a lot of work, even if we only
+  maintain binaries supplied by others. In addition, this would
+  bring some additional responsabilities that we do not want to
+  have. For these reasons, it was decided that www.gimp.org would
+  not host any binaries but would link to the pages of those who
+  are providing binaries for various platforms.
+</para>
+
+<para>
+  It would be very nice to have Windows binaries for the
+  development version.
+</para>
+
+ + +
<para>
+  It was suggested to make it easier for users to submit bug
+  reports, for example by having an e-mail address to which bug
+  reports can be sent without having to register to Bugzilla (we
+  already have such an address, although it is not widely known).
+  This proposal was rejected because most of the bug reports
+  (especially from new users) are incomplete and require
+  additional information. If the user does nothave a Bugzilla
+  account, it is not possible to rely on the automatic
+  notification system to send messages to the user when a comment
+  is added to their bug report or when the status of their bug
+  report changes.
+</para>
+
+<para>
+  Most developers consider Bugzilla to be a very valuable tool
+  that works well. Instead of trying to hide Bugzilla from the
+  users, we should try to make it as easy as possible for the new
+  users to join. This is already done to some extent by the bug
+  submission wizard available from http://bugs.gimp.org/. There is
+  a small problem with the GNOME2 keyword that prevents the open
+  GIMP bugs from being displayed to the user and we should try to
+  get this fixed.
+</para>
+
+ + +
<para>
+  There are many open bug reports or proposals for enhancements
+  that would be relatively easy to fix or implement. We should
+  make it easier for potential contributors to see the list of
+  easy tasks that are open. The <quote>easy tasks</quote> should
+  include anything that can be done in one or two hours by an
+  average developer or maybe a bit more if the contributor is not
+  familiar with the code.
+</para>
+
+<para>
+  The best way to keep the list of open tasks up-to-date is
+  probably to base it on Bugzilla. We could for example use a
+  Bugzilla keyword for all bugs that are easy to fix (there is
+  already a keyword <quote>easy-fix</quote> reserved for that,
+  although we could invent our own). It would then be easy to
+  create a Bugzilla query showing the list of easy tasks. Another
+  solution would be to have a page on www.gimp.org or
+  developer.gimp.org containing a list of all these bugs, with
+  direct links to the corresponding bug reports. The second
+  solution may require a bit more work because it would have to be
+  maintained by someone, but it might be a bit easier to use.
+</para>
+
+ + +
<para>
+  Sometimes, there is a lack of communication between users and
+  developers of The GIMP. After some discussion, it was decided
+  that we should not merge the mailing lists gimp-user and
+  gimp-developer because this could cause various problems: the
+  combined amount of traffic may be too high for some subscribers,
+  the discussions among developers may be confusing for some
+  users, and in general we should let people subscribe to what
+  they are interested in, instead of removing this option by
+  merging the lists (we cannot force anybody to read what they do
+  not want to read).
+</para>
+
+<para>
+  But it would be very useful for the developers to get more
+  feedback from the users, especially about UI and usability
+  issues. For this reason, all developers are strongly encouraged
+  to subscribe to the gimp-user list.
+</para>
+
+<para>
+  The web site (www.gimp.org) should contain a list of the various
+  sources of information about the GIMP: mailing lists, newsgroup,
+  Yahoo group, GUG, other web sites such as linuxgraphic.org or
+  gimp.de, etc. The description of the mailing lists should
+  encourage people to subscribe to both the users and developers
+  lists.
+</para>
+
+ + +
<para>
+  We hope that the next stable release will attract new
+  developers. This has been the case when 1.0 and 1.2 were
+  released. The transition to the new web site will also help,
+  especially if the navigation menu contains some useful items
+  such as <quote>Bugs</quote>, <quote>FAQ</quote>, etc. The
+  following items should be available in the web site:
+<itemizedlist>
+  <listitem>
+    <quote>How to contribute?</quote> or <quote>Getting involved</quote>
+  </listitem>
+  <listitem>
+    List of tasks
+  </listitem>
+  <listitem>
+    List of sources of information (mailing lists, newsgroup, ...)
+  </listitem>
+  <listitem>
+    FAQ
+  </listitem>
+</itemizedlist>
+</para>
+
+<para>
+  As with the other documents summarizing what is happening here
+  at GimpCon, comments are welcome...
+</para>
+
+<para>
+  Written by Raphaël Quinet
+</para>
+
+ + + +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2003/gimpcon2003-mins/index.html b/public/gimpcon/2003/gimpcon2003-mins/index.html new file mode 100644 index 0000000..4e30e2d --- /dev/null +++ b/public/gimpcon/2003/gimpcon2003-mins/index.html @@ -0,0 +1,260 @@ + + + + + + + + + + + · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
+

+ +
<title>Minutes of The GIMP Developers Conference 2003</title>
+<titleabbrev>Minutes</titleabbrev>
+<summary>Minutes of the GIMPCon 2003 Meetings</summary>
+
+ + + +
<para>
+  This meeting was held in the evening of August 7th, 2003. The main
+  issues discussed were:
+  <itemizedlist>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-1"
+      localinfo="foundation">The GIMP foundation</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-1"
+      localinfo="manager">Release manager</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-1"
+      localinfo="decisions">Decision making (or lack of
+      it)</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-1"
+      localinfo="general">General stuff about CVS,
+      Bugzilla</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-1"
+      localinfo="communication">Communication</olink>
+    </listitem>
+  </itemizedlist>
+</para>
+
+<para>
+  The minutes from this meeting can be found <olink
+  targetdocent="gimpcon2003-mins-1">here</olink>.
+</para>
+
+ + +
<para>
+  This meeting was held in the evening of August 8th, 2003. The
+  main issues discussed were:
+  <itemizedlist>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="features">Features required for 2.0</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="documentation">Documentation</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="web">Web-site</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="roadmap">Roadmap</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="bugs">Bugs</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="tasks">Task List</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="foundation">GIMP Foundation</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-2"
+      localinfo="manager">Release manager</olink>
+    </listitem>
+  </itemizedlist>
+</para>
+
+<para>
+  The minutes from this meeting can be found <olink
+  targetdocent="gimpcon2003-mins-2">here</olink>.
+</para>
+
+ + +
<para>
+  This meeting was held in the afternoon of August 9th, 2003. The
+  main issues discussed were:
+  <itemizedlist>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-3"
+      localinfo="developers">How to get new
+      developers?</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-3"
+      localinfo="binary">De we need binary
+      distributions?</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-3"
+      localinfo="bugzilla">Is Bugzilla too hard to use for new
+      users?</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-3"
+      localinfo="tasks">List of open tasks</olink>
+    </listitem>
+    <listitem>
+      <olink targetdocent="gimpcon2003-mins-3"
+      localinfo="mailinglists">Mailing lists</olink>
+    </listitem>
+  </itemizedlist>
+</para>
+
+<para>
+  The minutes from this meeting can be found <olink
+  targetdocent="gimpcon2003-mins-3">here</olink>.
+</para>
+
+ + + +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2003/index.html b/public/gimpcon/2003/index.html new file mode 100644 index 0000000..6072e42 --- /dev/null +++ b/public/gimpcon/2003/index.html @@ -0,0 +1,141 @@ + + + + + + + + + + + GIMP Developers Conference 2003 · GIMP Developer Resources + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + + + + +
+
+
    +
  • + +
  • + +
  • + +
  • + +
  • +
+
+ + + + +
+
+
+ +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2003/index.xml b/public/gimpcon/2003/index.xml new file mode 100644 index 0000000..ffd7c84 --- /dev/null +++ b/public/gimpcon/2003/index.xml @@ -0,0 +1,47 @@ + + + + GIMP Developers Conference 2003 on GIMP Developer Resources + https://developer.gimp.org/gimpcon/2003/ + Recent content in GIMP Developers Conference 2003 on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + &lt;title&gt;The First Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;First Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the first GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on &lt;quote&gt;marketing&lt;/quote&gt; in the broadest sense of the word. + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + &lt;title&gt;The Second Big Serious Meeting of GIMPCon2003&lt;/title&gt; &lt;titleabbrev&gt;Second Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the second GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. &lt;/para&gt; &lt;para&gt; The major features or API changes which it was agreed are necessary are: &lt;orderedlist&gt; &lt;listitem&gt;Complete path tool (nomis)&lt;/listitem&gt; &lt;listitem&gt;Remove libgck (Sven and mitch)&lt;/listitem&gt; &lt;listitem&gt;Finish the text tool (Sven)&lt;/listitem&gt; &lt;listitem&gt;Documentation (more on this later)&lt;/listitem&gt; &lt;listitem&gt;Web-site (again, more on this later)&lt;/listitem&gt; &lt;listitem&gt;Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2. + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ + &lt;title&gt;The Third Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;Third Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the third GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ + &lt;title&gt;Minutes of The GIMP Developers Conference 2003&lt;/title&gt; &lt;titleabbrev&gt;Minutes&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the GIMPCon 2003 Meetings&lt;/summary&gt; &lt;para&gt; This meeting was held in the evening of August 7th, 2003. The main issues discussed were: &lt;itemizedlist&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;foundation&quot;&gt;The GIMP foundation&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;manager&quot;&gt;Release manager&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;decisions&quot;&gt;Decision making (or lack of it)&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;general&quot;&gt;General stuff about CVS, Bugzilla&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;communication&quot;&gt;Communication&lt;/olink&gt; &lt;/listitem&gt; &lt;/itemizedlist&gt; &lt;/para&gt; &lt;para&gt; The minutes from this meeting can be found &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot;&gt;here&lt;/olink&gt;. + + + + diff --git a/public/gimpcon/2003/people-small.png b/public/gimpcon/2003/people-small.png new file mode 100644 index 0000000000000000000000000000000000000000..c921c9c3749b1e31e300009dd60917335681bcd4 GIT binary patch literal 244483 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�V(}xad;VY!Hs9Ivnim|gSoF|eAMwB=YQKV6| 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�QPwY^V_ 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

(<3624aH#2A;w8rc-~M5Rw<%lmRAf3 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 z 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

EpcIiRtRv+| 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°<}>JH8Dn{&Ak`M9N8|l?jhdShg$dh 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�uP0_&8?Q}?bVB`H?xd#zVVxFt@Eg9U^*Z4 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%0AH5Xj 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Ν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 z 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�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 literal 0 HcmV?d00001 diff --git a/public/gimpcon/2004/Oyvind_Kolas.png b/public/gimpcon/2004/Oyvind_Kolas.png new file mode 100644 index 0000000000000000000000000000000000000000..4aad64c2a7140c74cf638bc964753952c3084321 GIT binary patch literal 50772 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 JPDHLkV1ju}edPcE literal 0 HcmV?d00001 diff --git a/public/gimpcon/2004/gnu-head-sm.jpg b/public/gimpcon/2004/gnu-head-sm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49502c771ff95ff97514eaf4c21f7a3f262b5310 GIT binary patch literal 5286 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 gsC_5S#|`YUozz#@!H~8FIF{mFF9-kix_t2de + + + + + + + + + + GIMP Developers Conference 2004 · GIMP Developer Resources + + + + + + + + + + + + + + + + + + + +

+ + +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2004/index.xml b/public/gimpcon/2004/index.xml new file mode 100644 index 0000000..c0d806e --- /dev/null +++ b/public/gimpcon/2004/index.xml @@ -0,0 +1,11 @@ + + + + GIMP Developers Conference 2004 on GIMP Developer Resources + https://developer.gimp.org/gimpcon/2004/ + Recent content in GIMP Developers Conference 2004 on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + + diff --git a/public/gimpcon/2004/mac_gimp_logo4.png b/public/gimpcon/2004/mac_gimp_logo4.png new file mode 100644 index 0000000000000000000000000000000000000000..d96f370b3c02f723089130084c1c14f385c6182f GIT binary patch literal 11474 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 + + + + + + + + + + · GIMP Developer Resources + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
+
+
+ + Validate XHTML + +
+ + diff --git a/public/gimpcon/2006/index.xml b/public/gimpcon/2006/index.xml new file mode 100644 index 0000000..5a5497f --- /dev/null +++ b/public/gimpcon/2006/index.xml @@ -0,0 +1,11 @@ + + + + GIMP Developer Resources + https://developer.gimp.org/gimpcon/2006/ + Recent content on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + + diff --git a/public/gimpcon/2006/meetings.jpg b/public/gimpcon/2006/meetings.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fbc766056d1b6a1cd3a57be140d3ebf841a42153 GIT binary patch literal 220989 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
8EzO`Q^;mX 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

&ja02qZ?D3c9M@qL?kEW6V@l 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

Vjxh;u2>>pw}Oo047&T!$2qCp5?(_4-pM
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˸))sBCW0eM;U`Xe)F3B)=UwZ7lcxT(19}q>
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

PG*3QK3}tZQkF` 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 literal 0 HcmV?d00001 diff --git a/public/gimpcon/2006/people.jpg b/public/gimpcon/2006/people.jpg new file mode 100644 index 0000000000000000000000000000000000000000..beb4a57360e254848bdc3cd8e3eb4789e4f5dbd0 GIT binary patch literal 281806 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

VQ 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�YZrwn+uwZCt2Z3#tHLU0OVUv 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 z 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 N6_^gc{P4f!{{t6*M4bQt literal 0 HcmV?d00001 diff --git a/public/gimpcon/2006/people_small.jpg b/public/gimpcon/2006/people_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09a9b7f80b8f2a115caa3bea903ad0f15b77c46d GIT binary patch literal 38999 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 + + + + + + + + + + GIMP Developer Conferences · GIMP Developer Resources + + + + + + + + + + + + + + + + + + + +

    + + +
    + + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
    +
    +
    + + Validate XHTML + +
    + + diff --git a/public/gimpcon/index.xml b/public/gimpcon/index.xml new file mode 100644 index 0000000..77c4c8c --- /dev/null +++ b/public/gimpcon/index.xml @@ -0,0 +1,11 @@ + + + + GIMP Developer Conferences on GIMP Developer Resources + https://developer.gimp.org/gimpcon/ + Recent content in GIMP Developer Conferences on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + + diff --git a/public/git.html b/public/git.html new file mode 100644 index 0000000..1f76997 --- /dev/null +++ b/public/git.html @@ -0,0 +1,142 @@ + + + + + + + + + + + Git · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + +
    +
    +
    +

    Git

    + +

    The GIMP source code lives in the gimp +repository on the +GNOME git server. +For more information on the GNOME git solution, go +here.

    +

    The GNOME git server hosts a couple of GIMP related repositories:

    + + + +
    +
    + + + + +
    +
    +
    + +
    + + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
    +
    +
    + + Validate XHTML + +
    + + diff --git a/public/homepage/faq/index.html b/public/homepage/faq/index.html new file mode 100644 index 0000000..8bc7677 --- /dev/null +++ b/public/homepage/faq/index.html @@ -0,0 +1,446 @@ + + + + + + + + + + + Frequently Asked Questions · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + +
    +
    +
    +

    Frequently Asked Questions

    + +

    Below you will find a collection of frequently asked questions +regarding development of the GIMP.

    +

    GIMP Development

    +

    Who coordinates GIMP development?

    +

    GIMP development is coordinated by Wilber the GIMP along +with a loosely knit team of GIMP developers. The +developers can be reached through the GIMP developer +mailing list.

    +

    How can I become a GIMP developer?

    +

    If you are a developer who wants to start contributing +code to the GIMP, the best way to get to know its +structure is by fixing bugs reported in Bugzilla. Pick a +bug, perhaps ask the advice of another developer as to +whether he/she thinks it will be an easy bug or not, and +then fix it. Sounds easy, doesn’t it?

    +

    After helping with a couple of bugs, people will start to +recognize your immense talent, and you will be on your way +to becoming a GIMP hacker. Any time you feel able, you +can pick a smaller enhancement request and have a go at +implementing it. It’s that easy.

    +

    Where can I discuss GIMP development?

    +

    There are several mailing +lists associated with the GIMP project. +Developments related issues can be brought up on the GIMP +Developer mailing list.

    +

    The GIMP has its own IRC channel on GIMPNet where most of +the active developers hang out. Join us in #gimp on +irc.gimp.org.

    +

    Every once in a while the GIMP developers get together for +a few days to throw a GIMP Developers Conference, also +referred to as GIMPCon.

    +

    Where can I find documentation for the GIMP API?

    +

    You can pass –enable-gtk-doc to the gimp +configure script. This requires having +gtk-doc +installed. After running make you can +find the GIMP API reference in the +devel-docs directory.

    +

    Pre-generated API documentation is included in the +official GIMP tarballs.

    +

    The API reference will normally be installed in +PREFIX/share/gtk-doc/html. An on +line version of the GIMP API reference can be found +here.

    +

    How do I make a stack trace?

    +

    A stack trace is a list of function calls that leads to +some point in the program. Debugging tools like gdb +can get stack traces from crashed applications so that +developers can figure out what went wrong. By including a +stack trace with your bug report, it will be much easier +for the developers to fix the reported problem.

    +

    Information on how to make a stack trace can be found in +the document Capturing +Stack Traces.

    +

    What is the best way to submit a patch?

    +

    The best way to submit a patch is to open a bug report in +Bugzilla and attach the patch there along with a +description of what it does and why it should be applied.

    +

    An introduction to how this is done can be found in the + +How To Create and Submit a Patch document.

    +

    What is the preferred coding style used in GIMP?

    +

    We encourage you to follow the GIMP coding style +throughout the GIMP project. For the core components +(application and libs) this coding style is enforced. The +GIMP coding style is defined as follows:

    +
      +
    • Function names are lowercase, words separated by underscores.
    • +
    • Macros and enums are all uppercase, words separated by underscores
    • +
    • Types are all words capitalized, no separators between words.
    • +
    • All functions in header files need to be prototyped.
    • +
    • Indentation rules are GNU coding style, in particular: +
        +
      • 2 characters indentation level
      • +
      • Do not use tabs (of course your editor can use tabs, but it should write them to file as 8 spaces each).
      • +
      • Opening brackets are on a new line and indented one level.
      • +
      • Function header have the return type on one line, the name starting in the first column of the following line. All parameters are prototyped and there’s a new line for each.
      • +
      +
    • +
    +

    Try to make use of GLib’s object system as much as +possible. Do not create wrappers around functions of +parent classes. If you end up duplicating code, try to +create a common parent class and implement the common +methods there.

    +

    Don’t include headers in headers except where unavoidable +(e.g. for deriving objects). Opaque typedefs go to +app/base/base-types.h, app/core/core-types.h etc. See +devel-docs/includes.txt for a +detailed description of the include policy.

    +

    Don’t use the GTK wrappers around the GLib object and +signal system.

    +

    The above coding style, along with other useful +information, is documented in the file HACKING.

    +

    How can I configure my editor for this coding style?

    +

    Your editor will not be able to do everything for you, but +you can configure most editors so that they use two spaces +for indentation, use spaces instead of tabs, etc.

    +
      +
    • If you are using Emacs, you can insert the following settings into your ~/.emacs file:
    • +
    +
    ;; Merge this into your custom-set-variables section if you already have one
    +(custom-set-variables
    +;; Syntax highlighting
    +'(global-font-lock-mode t nil (font-lock))
    +'(show-paren-mode t nil (paren))
    +)
    +;; use UTF-8 by default
    +(prefer-coding-system 'mule-utf-8)
    +;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces
    +(setq c-mode-common-hook '(lambda () (c-set-style "gnu")
    +                (setq indent-tabs-mode nil)
    +                (setq show-trailing-whitespace t))) ]]></programlisting>
    +
      +
    • If you are using Vim, you can insert the following settings into your ~/.vimrc file:
    • +
    +
    syn on           " syntax highlighting
    +set expandtab    " use spaces instead of tabs
    +set shiftwidth=2 " default indentation is 2 spaces ]]></programlisting>
    +
      +
    • If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ.
    • +
    +

    Who coordinates the GIMP translation efforts?

    +

    Any help with translations is appreciated. If you want to +help, please get in contact with the people from the +GNOME +Translation Project who coordinate all translation +efforts for projects hosted in the GNOME GIT repository.

    +

    More information about GIMP and localisation can be found +in the file README.i18n.

    +

    How can I support GIMP development?

    +

    By using GIMP and reporting any bugs you find to +Bugzilla +you’re helping a great deal. But there are other +non-technical ways of supporting the development of The +GIMP as well.

    +

    GIMP has a web site, application documentation, lots of +tutorials, and more. Unfortunately, as GIMP develops over +time, much of this documentation needs to be re-written or +freshened up, documentation needs to be added for new +functionality, the web site needs to get a new lick of +paint and so on.

    +

    If you’re interested in helping out you should drop an +e-mail to the GIMP developer mailing list offering your +help.

    +

    Plug-In Development

    +

    Is there a plug-in template available?

    +

    Yes. An official GIMP plug-in template is available in +the gimp-plugin-template + git module. Snapshots are available at ftp.gimp.org.

    +

    How about a Script-Fu template?

    +

    Yes. Simon Budig has written a fill-in-the-blanks +Script-Fu template which is available here.

    +

    How do I get my plug-in included in the GIMP?

    +

    The best way to make your plug-in available to the World +is to submit it to the GIMP Plug-In +Registry.

    +

    If you are certain that your plug-in will be useful to all +GIMP users, then you can ask the GIMP developers to +consider it for inclusion in future GIMP release. The +best way to do that is to suggest it on the GIMP developer +mailing list or to +open an enhancement request in Bugzilla. However, we would +like to limit the number of plug-ins included in the +standard distribution and encourage all users to use the +registry.

    +

    How do I debug a GIMP plug-in?

    +

    Eeek! The plug-in you’re working on has a bug in it! And +the fix isn’t completely obvious, so you want to use +debugger to see what is going on. But hmm, how does one +start a plug-in under a debugger if GIMP is the one who is +starting the plug-in…

    +

    To address this issue, libgimp has some hooks controlled +by the GIMP_PLUGIN_DEBUG environment +variable. The idea is that you can attach a debugger to +the pid of the plug-in you want to debug. The process is +described in the file debug-plug-ins.txt.

    +

    Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4?

    +

    The short answer is yes. GIMP 2.2 and 2.4 are binary +compatible with plug-ins compiled for GIMP 2.0. The API is +also backwards source compatible, so your plug-in should +also compile cleanly against GIMP 2.2 and 2.4.

    +

    If the plug-in you compiled for 2.0 does not work with 2.2 +or 2.4, there is one change which has been made which is +not backwards compatible, since the old behaviour was +considered incorrect. If you create a temporary drawable, +using for example gimp_layer_new(), you are now required +to add it to an image before calling any functions with +the drawable as an argument.

    +

    GIT

    +

    What should I put in the commit message when doing a git commit?

    +

    Please put a short explanation of the change on the first line. +Then, after an empty line, you can describe the change in more +detail using as many lines as you need. Try not to exceed 72 +colums.

    +

    If the commit fixes a bug or part of a bug please use the +bug number and description as the first line of the commit +message. It’s most convenient to just copy the line from the +Bugzilla bug page.

    +

    GEGL

    +

    What is GEGL?

    +

    GEGL is the Generic +Graphical Library. It is supposed to replace the +handling of various image processing tasks in GIMP in +a not too distant future (planned for GIMP 2.6).

    +

    What will GEGL be able to do?

    +

    GEGL will be a general image processing library. It uses +a directed acyclic graph, a DAG, to represent image +processing operations. In the DAG, images are edges, and +operations are nodes. It takes advantage of this DAG to +minimize regions which are processed, provide efficient +caching of operations, and efficient redrawing when a +parameter of the graph changes.

    +

    GEGL should also be independent of the data type being +processed and will be able to handle high bit depth +images, ICC profiles and parallel processing of image +tiles.

    +

    What does all that gibberish mean for GIMP?

    +

    Many highly requested features of the GIMP will be easier +to do using GEGL. Layer effects, layer groups, and +adjustment layers are quite easily represented (and +efficiently calculated) using the DAG organization of GEGL. +CMYK and high bit depth support will be easier because +GEGL does not make the same assumptions about color spaces +and data types that the GIMP does.

    +

    The reusability of image processing operations means that +plug-ins will be able to be designed in a much more modular +way. The brush system will be able to become more +flexible, especially when filter plug-ins are able to be +used as procedural brush plug-ins.

    +

    Bugzilla

    +

    What is Bugzilla?

    +

    The GIMP project uses GNOME Bugzilla for +tracking of bug reports, enhancement requests etc.

    +

    A beginners tutorial describing how to report a bug can be +found in the +How To Report GIMP Bugs document.

    +

    An easy to use interface to reporting GIMP bugs can be +found on bugs.gimp.org.

    +

    What is the meaning of the NEEDINFO status code inBugzilla?

    +

    If the status of a bug is changed to NEEDINFO it means the +GIMP developers need more information from the bug +reporter in order to resolve the bug.

    +

    More information about the meaning of the Bugzilla status +field codes can be found in +A Bug’s Life Cycle.

    +

    What is the best way to refer to a bug in Bugzilla?

    +

    The best way to refer to a bug is bug +#nnnnn, where nnnnn is the bug number. Using +bug before the number allows Bugzilla to +link to the corresponding bug report automatically. Using +# before the number is optional for +Bugzilla but makes it easier to locate references to bug +reports in the ChangeLog or in e-mails.

    +

    When referencing multiple bugs, it is better to be a bit +redundant by writing bug #xxxxx, bug #yyyyy and bug +#zzzzz instead of bugs #xxxxx, #yyyyy and +#zzzzz in order to allow Bugzilla to link all bugs +automatically.

    +

    What is the proper way of handling duplicate bug reports?

    +

    A bug report describing the same bug as a previous bug +report should be marked as DUPLICATE of the older one. +In some exceptional cases, it is possible to mark an old +bug report as DUPLICATE of a newer one (e.g., when the +newer bug report has a significantly better description +than the older one).

    +

    Another exception is when the same person submits the same +bug report several times (same description): in this case, +it is better to mark the additional copies of the bug +report as INVALID in order to avoid inflating the +statistics about the number of duplicates.

    +

    What is the proper way of marking a bug as RESOLVED?

    +

    When fixing a bug, always mention the bug number in the +commit message. Once the changes are in git, paste the +relevant part of the commit message (or all of it) in the +comment field and mark the bug as RESOLVED FIXED. +These cross-references help a lot when trying to find +when a bug was fixed, its relations to other bugs, and +potential regressions.

    +

    A bug that is fixed in git or in an unstable release +should be marked as RESOLVED FIXED. Optionally, the +reporter or someone other than the one who fixed the bug +can mark it as VERIFIED after some testing. When the fix +is part of a stable release, it can be marked as CLOSED.

    +

    This is explained further in A +Bug’s Life Cycle except for the difference between +stable and unstable releases.

    +

    Miscellaneous

    +

    Where can I learn more about the GObject system used by GIMP?

    +

    The +GObject +documentation has a +nice tutorial that you might want to have a look at.

    +

    Where can I learn more about color spaces etc?

    +

    Charles Poynton has collected a set of Frequently +Asked Questions about Color.

    +

    Where can I learn more about image manipulation algorithms?

    +

    A good source of information is the +comp.graphics.algorithms list of Frequently +Asked Questions.

    +

    Is there a GIMP user FAQ available?

    +

    There is no user FAQ available at the moment. However +there has been discussions about creating one. If you +would like to help with this please drop a mail on the +GIMP developer mailing +list.

    +

    How can I contribute to this FAQ?

    +

    If you would like to contribute to this FAQ, send an +e-mail to the GIMP developer mailing list with the +exact text you think should be included (both question and +answer).

    +

    With your help this FAQ will grow and become more useful.

    + +
    +
    + + + + +
    +
    +
    + +
    + + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
    +
    +
    + + Validate XHTML + +
    + + diff --git a/public/homepage/plug-ins/index.html b/public/homepage/plug-ins/index.html new file mode 100644 index 0000000..ec19c3a --- /dev/null +++ b/public/homepage/plug-ins/index.html @@ -0,0 +1,145 @@ + + + + + + + + + + + Plug Ins · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + +
    +
    +
    +

    Plug Ins

    + +
    +

    title: “Plug-In Development” +description: “Writing GIMP plug-ins”

    + +

    Make good use of the GIMP 2.0 API reference, +and you can also have a look at a talk about +GIMP plug-in programming that Simon gave at GUADEC in Sevilla.

    + +
    +
    + + + + +
    +
    +
    + +
    + + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
    +
    +
    + + Validate XHTML + +
    + + diff --git a/public/homepage/screenshots/index.html b/public/homepage/screenshots/index.html new file mode 100644 index 0000000..56b9208 --- /dev/null +++ b/public/homepage/screenshots/index.html @@ -0,0 +1,143 @@ + + + + + + + + + + + · GIMP Developer Resources + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + + + + + + + +
    +
    +
    +

    + + + + + + + + + + + +
    +
    + + + + +
    +
    +
    + +
    + + Copyright © 2003-2022 The GIMP Development Team. + + + webmaster@gimp.org + +
    +
    +
    + + Validate XHTML + +
    + + diff --git a/public/images/developer-barbg.png b/public/images/developer-barbg.png new file mode 100644 index 0000000000000000000000000000000000000000..14d066e4a08a1b1e2cd5eaf41fedda57f54e94f5 GIT binary patch literal 152 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 b4?~+JMspD*EzyAgi~x}Pq6`E}nuPohrf{z? literal 0 HcmV?d00001 diff --git a/public/images/developer-right.png b/public/images/developer-right.png new file mode 100644 index 0000000000000000000000000000000000000000..07626146612924d33f7dde126d923aa8a758bbf3 GIT binary patch literal 20340 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 X#CNAZ!wI)e00000NkvXXu0mjfZYn@@ literal 0 HcmV?d00001 diff --git a/public/images/shadow.gif b/public/images/shadow.gif new file mode 100644 index 0000000000000000000000000000000000000000..af7f537e391f08327e417c7be6323c917d5d3788 GIT binary patch literal 4364 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 mNRx4)$-Se2KGVRJG=-nEko^8U73WMVE8{ literal 0 HcmV?d00001 diff --git a/public/images/shadow.png b/public/images/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..a2561df971728d988424100c74c817916eca1979 GIT binary patch literal 3403 zcmeAS@N?(olHy`uVBq!ia0y~yV738bR}L1Sh{z?w93Z7#;u=xnT$Gwvl9`{U5R#dj z$`F!Ks$i<%mYSqsWME*TU}$J%1Vly(x&~$j21QvmX+Ul4C7!;n>{pmr1x4l8+mz-4 zg*Xd5B8wRqxP?HN@zUM8KR`j2bVpxD28NCO+HqZdXMAQjaPeGm)a##I4DP>8^|Q}*osX?x zu(w4E^8SQ>2<4nWJ;;$Ch1?$dLgm)?6;Yr9_CdHMW*W(@x+ip*R06EH_T4pml(Y0_%+Z_b^VZki z+Ig-L)GH{z-FHJSJv;l^O{dMW8|Geryoiy(edpWebG3Q>oX-o7q}^hCpz*y@X6IS? ZpGWQ1{0Pup3+%oyc)I$ztaD0e0swh%>OlYi literal 0 HcmV?d00001 diff --git a/public/images/wilber-icon.png b/public/images/wilber-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa3ffaf9d36b0f6f259f5ca078b3d6b95a25820 GIT binary patch literal 765 zcmV>6by32TpIuY0*XmQ zK~y-)t&&klQ(+Xxf8Y1r+3s~#PB%9*w6s~-W|V2g2!ed99twi6_Z}mNAbJhLD4%@CgM){>zv_my4e91UQz)1F zY7`d=IIfFr+q@i4Ee;;sZ#{VQ%r#aoIC1Q#S9(ka1_qE)@p>ZFwp3Z-!ug8`A$a>{ zk|&QJuz6$1%FWIIV5~$9V7^%5&#t*smA=-9;2&?$n!AON;)lT0Q#a^x@`kB3sRh#?h#E7$uQM@ExL z|J9Lea`aA;#l=P9@i^1d(^Sf301AZy!^6Y8d-on?c#ujVo>( z&YeBY?c2AQn0!fo?koA{PY8wENhA`KN+l9Et~3ALrd+8wzz-1!2Ci6^b*3>GHtc+k z_V9Z8Vx34OSSV`zfe^|tSX1YvTC4K-;TYYK2Vu8?W2iF9u2sB3QW3uP!Q z%S0)Or>>4lrGjOdgu)xi&wY2l%`I3{Q&VyE%LCbL_I|LXCH*;*-C-!@uQ@LDmQOS_ zHxmek2(+{!lu0gc^YL?bTq$)algYeV?L-MU{R92|j^iAzR;z8mHlV|GT|bc4T7S|t vJ?r!NMpLQO9sUQ@ANm6Du4DnYzYqKb!z}cot&$4S00000NkvXXu0mjfX#j7g literal 0 HcmV?d00001 diff --git a/public/images/wilber.png b/public/images/wilber.png new file mode 100644 index 0000000000000000000000000000000000000000..8c231836982836d8bb607ea865040aad75ad4af0 GIT binary patch literal 6340 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 + + + GIMP Development on GIMP Developer Resources + https://developer.gimp.org/index.html/ + Recent content in GIMP Development on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + Tue, 19 Jul 2022 00:00:00 +0000 + + GIMP and Standards + https://developer.gimp.org/standards.html + Wed, 20 Jul 2022 19:05:19 +0100 + + https://developer.gimp.org/standards.html + GIMP is supposed to integrate well into your workflow. Thus is needs to interoperate with other applications and your desktop. Standards are there to make this happen and so we try to follow established (and sometimes even proposed) standards. Below you will find a list with links to specifications that a GIMP developer may find useful. +&lt;varlistentry&gt; &lt;term&gt; &lt;ulink url=&quot;http://www.w3.org/Graphics/GIF/spec-gif89a.txt&quot;&gt;Graphics Interchange Format&lt;/ulink&gt; &lt;/term&gt; &lt;listitem&gt; Describes the GIF file format, used in the GIF plug-in. + + + + GIMP Plug-In Template + https://developer.gimp.org/plug-in-template.html + Wed, 20 Jul 2022 19:05:12 +0100 + + https://developer.gimp.org/plug-in-template.html + The GIMP Plug-In Template is an empty GIMP Plug-In that does nothing. It also has a GUI that allows to control how it achieves this task. But best of all, it comes with a complete setup for autoconf, automake, internationalisation and all these things you never wanted to know about. +Thanks to the GIMP Plug-In Template you don&rsquo;t need to worry about all these things. Just download the tarball, add some magic image manipulation routines and voilà, your own GIMP plug-in. + + + + Plug Ins + https://developer.gimp.org/homepage/plug-ins/ + Wed, 20 Jul 2022 19:05:09 +0100 + + https://developer.gimp.org/homepage/plug-ins/ + title: &ldquo;Plug-In Development&rdquo; description: &ldquo;Writing GIMP plug-ins&rdquo; Writing a GIMP Plug-In Part I Writing a GIMP Plug-In Part II Writing a GIMP Plug-In Part III Make good use of the GIMP 2.0 API reference, and you can also have a look at a talk about GIMP plug-in programming that Simon gave at GUADEC in Sevilla. + + + + Mailing Lists + https://developer.gimp.org/lists.html + Wed, 20 Jul 2022 19:05:03 +0100 + + https://developer.gimp.org/lists.html + There are several mailing-lists related to GIMP and www.gimp.org lists them all. + + + + Git + https://developer.gimp.org/git.html + Wed, 20 Jul 2022 19:04:57 +0100 + + https://developer.gimp.org/git.html + The GIMP source code lives in the gimp repository on the GNOME git server. For more information on the GNOME git solution, go here. +The GNOME git server hosts a couple of GIMP related repositories: + + + + Frequently Asked Questions + https://developer.gimp.org/homepage/faq/ + Wed, 20 Jul 2022 19:04:11 +0100 + + https://developer.gimp.org/homepage/faq/ + Below you will find a collection of frequently asked questions regarding development of the GIMP. +GIMP Development Who coordinates GIMP development? GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the GIMP developer mailing list. +How can I become a GIMP developer? If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. + + + + GIMP ChangeLog + https://developer.gimp.org/changelog.html + Wed, 20 Jul 2022 19:04:06 +0100 + + https://developer.gimp.org/changelog.html + The GIT repository lists all changes in detail. The list below shows the latest commits. It is generated from the RSS feed delivered by the CIA. + + + + CVS + https://developer.gimp.org/cvs.html + Tue, 19 Jul 2022 20:45:01 +0100 + + https://developer.gimp.org/cvs.html + GIMP doesn&rsquo;t use CVS any longer. The source code repository has been migrated to git. + + + + About this Site + https://developer.gimp.org/about.html + Tue, 19 Jul 2022 00:00:00 +0000 + + https://developer.gimp.org/about.html + The look of this site was borrowed from www.gimp.org. Under the hood it is based on DocBook Website. If you are curious, have a look at the Markdown source of the page you are reading. +If you want to help us with developer.gimp.org, clone the repository gimp-web-devel from git. + + + + Bug Tracking System + https://developer.gimp.org/bugs.html + Tue, 19 Jul 2022 00:00:00 +0000 + + https://developer.gimp.org/bugs.html + The GIMP project uses Gitlab&rsquo;s issues, to coordinate bug reports. Gitlab is also used for enhancement requests and the preferred way to submit patches for the GIMP is make a merge request. +On www.gimp.org you can find a document describing HOW TO Report GIMP Bugs. You can also find a document that describes How To Create and Submit a Patch. +Below is a list of links to get you started with Gitlab: + + + + + https://developer.gimp.org/homepage/screenshots/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/homepage/screenshots/ + + + + + diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..489a5b9 --- /dev/null +++ b/public/index.xml @@ -0,0 +1,189 @@ + + + + GIMP Development on GIMP Developer Resources + https://developer.gimp.org/ + Recent content in GIMP Development on GIMP Developer Resources + Hugo -- gohugo.io + en + Copyright 2003-2022 The GIMP Development Team + Tue, 19 Jul 2022 00:00:00 +0000 + + GIMP and Standards + https://developer.gimp.org/standards.html + Wed, 20 Jul 2022 19:05:19 +0100 + + https://developer.gimp.org/standards.html + GIMP is supposed to integrate well into your workflow. Thus is needs to interoperate with other applications and your desktop. Standards are there to make this happen and so we try to follow established (and sometimes even proposed) standards. Below you will find a list with links to specifications that a GIMP developer may find useful. +&lt;varlistentry&gt; &lt;term&gt; &lt;ulink url=&quot;http://www.w3.org/Graphics/GIF/spec-gif89a.txt&quot;&gt;Graphics Interchange Format&lt;/ulink&gt; &lt;/term&gt; &lt;listitem&gt; Describes the GIF file format, used in the GIF plug-in. + + + + GIMP Plug-In Template + https://developer.gimp.org/plug-in-template.html + Wed, 20 Jul 2022 19:05:12 +0100 + + https://developer.gimp.org/plug-in-template.html + The GIMP Plug-In Template is an empty GIMP Plug-In that does nothing. It also has a GUI that allows to control how it achieves this task. But best of all, it comes with a complete setup for autoconf, automake, internationalisation and all these things you never wanted to know about. +Thanks to the GIMP Plug-In Template you don&rsquo;t need to worry about all these things. Just download the tarball, add some magic image manipulation routines and voilà, your own GIMP plug-in. + + + + Plug Ins + https://developer.gimp.org/homepage/plug-ins/ + Wed, 20 Jul 2022 19:05:09 +0100 + + https://developer.gimp.org/homepage/plug-ins/ + title: &ldquo;Plug-In Development&rdquo; description: &ldquo;Writing GIMP plug-ins&rdquo; Writing a GIMP Plug-In Part I Writing a GIMP Plug-In Part II Writing a GIMP Plug-In Part III Make good use of the GIMP 2.0 API reference, and you can also have a look at a talk about GIMP plug-in programming that Simon gave at GUADEC in Sevilla. + + + + Mailing Lists + https://developer.gimp.org/lists.html + Wed, 20 Jul 2022 19:05:03 +0100 + + https://developer.gimp.org/lists.html + There are several mailing-lists related to GIMP and www.gimp.org lists them all. + + + + Git + https://developer.gimp.org/git.html + Wed, 20 Jul 2022 19:04:57 +0100 + + https://developer.gimp.org/git.html + The GIMP source code lives in the gimp repository on the GNOME git server. For more information on the GNOME git solution, go here. +The GNOME git server hosts a couple of GIMP related repositories: + + + + Frequently Asked Questions + https://developer.gimp.org/homepage/faq/ + Wed, 20 Jul 2022 19:04:11 +0100 + + https://developer.gimp.org/homepage/faq/ + Below you will find a collection of frequently asked questions regarding development of the GIMP. +GIMP Development Who coordinates GIMP development? GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the GIMP developer mailing list. +How can I become a GIMP developer? If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. + + + + GIMP ChangeLog + https://developer.gimp.org/changelog.html + Wed, 20 Jul 2022 19:04:06 +0100 + + https://developer.gimp.org/changelog.html + The GIT repository lists all changes in detail. The list below shows the latest commits. It is generated from the RSS feed delivered by the CIA. + + + + CVS + https://developer.gimp.org/cvs.html + Tue, 19 Jul 2022 20:45:01 +0100 + + https://developer.gimp.org/cvs.html + GIMP doesn&rsquo;t use CVS any longer. The source code repository has been migrated to git. + + + + About this Site + https://developer.gimp.org/about.html + Tue, 19 Jul 2022 00:00:00 +0000 + + https://developer.gimp.org/about.html + The look of this site was borrowed from www.gimp.org. Under the hood it is based on DocBook Website. If you are curious, have a look at the Markdown source of the page you are reading. +If you want to help us with developer.gimp.org, clone the repository gimp-web-devel from git. + + + + Bug Tracking System + https://developer.gimp.org/bugs.html + Tue, 19 Jul 2022 00:00:00 +0000 + + https://developer.gimp.org/bugs.html + The GIMP project uses Gitlab&rsquo;s issues, to coordinate bug reports. Gitlab is also used for enhancement requests and the preferred way to submit patches for the GIMP is make a merge request. +On www.gimp.org you can find a document describing HOW TO Report GIMP Bugs. You can also find a document that describes How To Create and Submit a Patch. +Below is a list of links to get you started with Gitlab: + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + &lt;title&gt;The First Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;First Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the first GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on &lt;quote&gt;marketing&lt;/quote&gt; in the broadest sense of the word. + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + &lt;title&gt;The Second Big Serious Meeting of GIMPCon2003&lt;/title&gt; &lt;titleabbrev&gt;Second Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the second GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. &lt;/para&gt; &lt;para&gt; The major features or API changes which it was agreed are necessary are: &lt;orderedlist&gt; &lt;listitem&gt;Complete path tool (nomis)&lt;/listitem&gt; &lt;listitem&gt;Remove libgck (Sven and mitch)&lt;/listitem&gt; &lt;listitem&gt;Finish the text tool (Sven)&lt;/listitem&gt; &lt;listitem&gt;Documentation (more on this later)&lt;/listitem&gt; &lt;listitem&gt;Web-site (again, more on this later)&lt;/listitem&gt; &lt;listitem&gt;Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2. + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ + &lt;title&gt;The Third Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;Third Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the third GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. + + + + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ + &lt;title&gt;Minutes of The GIMP Developers Conference 2003&lt;/title&gt; &lt;titleabbrev&gt;Minutes&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the GIMPCon 2003 Meetings&lt;/summary&gt; &lt;para&gt; This meeting was held in the evening of August 7th, 2003. The main issues discussed were: &lt;itemizedlist&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;foundation&quot;&gt;The GIMP foundation&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;manager&quot;&gt;Release manager&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;decisions&quot;&gt;Decision making (or lack of it)&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;general&quot;&gt;General stuff about CVS, Bugzilla&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;communication&quot;&gt;Communication&lt;/olink&gt; &lt;/listitem&gt; &lt;/itemizedlist&gt; &lt;/para&gt; &lt;para&gt; The minutes from this meeting can be found &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot;&gt;here&lt;/olink&gt;. + + + + + https://developer.gimp.org/homepage/screenshots/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/homepage/screenshots/ + + + + + How to write a GIMP plug-in + https://developer.gimp.org/writing-a-plug-in/1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/writing-a-plug-in/1/ + Written By Dave Neary +In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors. +In this part, I present a plug-in&rsquo;s basic elements. We will see how to install a plug-in and how to get data from an image and directly manipulate it. +Architecture &lt;para role=&quot;images&quot;&gt; &lt;ulink url=&quot;architecture.png&quot;&gt; &lt;mediaobject&gt; &lt;imageobject&gt; &lt;imagedata fileref=&quot;architecture-small. + + + + How to write a GIMP plug-in, part II + https://developer.gimp.org/writing-a-plug-in/2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/writing-a-plug-in/2/ + Written By Dave Neary +In the first part, I presented essential elements to build a plug-in interface with The GIMP. Now we will produce a simple but useful algorithm that we could use in our plug-in. +Introduction The algorithm we are going to implement is a simple blur. It is included in The GIMP as &ldquo;Filters-&gt;Blur-&gt;Blur&rdquo; with default parameters. +That algorithm is very simple. Each pixel in our image is replaced by a mean value of its neighbours. + + + + How to write a GIMP plug-in, part III + https://developer.gimp.org/writing-a-plug-in/3/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/writing-a-plug-in/3/ + Written By Dave Neary +In the &lt;olink targetdocent=&quot;writing-a-plug-in-2&quot;&gt;second part&lt;/olink&gt;, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. &lt;para&gt; Let's have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer's pixel value with the average value in the neighbourhood. + + + + diff --git a/public/layout.xml b/public/layout.xml new file mode 100644 index 0000000..db76e2e --- /dev/null +++ b/public/layout.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + 2003-2018 + The GIMP Development Team + + +
+ +
+Documentation + + +We felt that with pre-releases, the documentation will become +more complete. There should, however, be an effort to actively +get people writing docs. The main requirement, then, for 2.0 +pre-releases will be to have a working help framework, so that +when people hit F1 for help, they at least get a message saying +This help item does not exist yet.If you would like to +help write it, contact docs@gimp.org or some such. + + +That email address doesn't exist (yet). People interested in +helping with the documentation should have a look at the +Wiki. + + + +If documentation is going to be released as a separate package, +as now seems likely, then we will need to define the interface +between the core and the help pages reasonably quickly. The +general idea is to more or less hard-code tagnames for a +particular help topic, and get the core and help using the same +tags, and agreeing on how they be communicated. This will +presumably require a considerable amount of communication with +the help team. + +We also need to have the docs browsable online so that if people +want to browse them they can. + + +
+ +
+Web-site + + +The new site should switch over to www.gimp.org soon. There will +obviously be quite a bit of pain involved as content gets added +and we get lots of your website sucks type +feedback, but this will only befor the short term. We should +switch to mmaybe as the main site before 2.0pre1. It was +suggested to do it even earlier than that, in the region of 2 to +3 weeks time. + +It was also discussed whether it was a good idea to have a +separate coordinator for the website. + + +
+ +
+Roadmap + + +As an approximate set of ideals, it was agreed that we want +this: 2.0pre1 very soon, 2.0 soon, 2.2 next year, and GEGL +integration the end of next Summer. + +More specifically, the near-term release schedule that we agreed +was reasonable is this: + +1 or 2 developer releases (one now, more or less, and another +one in another 2 weeks). 6 weeks time (end of September 2003): +First pre-release of 2.0, including the features mentioned +above, and any other minor features that people code in the +meantime (hint, hint). Roughly 3 months later: 2.0 + +It was more or less agreed that 3 to 4 weeks was a nice +turnaround time for pre-releases, so that would imply between 4 +and 6 (inclusive) pre-releases before 2.0. + +The reason for not having a pre-release straight away was +mentioned above: to be feature complete, some features need a +little more than 2 weeks work, and people have real lives. So 6 +weeks was felt to be a reasonable amount of time to have the +path tool and the help browser in place. + + +
+ +
+Bugs + + +The developer release will also be a prelude to a bug week. We +would like people (that's you, in particular) to actively work +on bugzilla clean-up for 2.0 - bugs need to be prioritized, +unconfirmed bugs need confirming and milestoning (and if you're +feeling really helpful, fixing). The idea would more or less be +that the 2.0 milestone will be locked down for anything other +than serious bugs after this bug week, so if there are bugs that +are annoying you a lot, this is your chance to get them +considered and worked on for the 2.0 releases. + +Just to spell that out - at the end of the bug week, any bugs +reported against The GIMP in CVS will be milestoned for 2.0.x, +or even 2.2, unless they are considered blockers for the +release. If we want to get a 2.0 release soon, we need to get +lots of testing done, and lots of bugfixing done, but we also +need to choose what to do and what not to do. We felt this was a +reasonable compromise. + +It was also re-discussed whether it would make sense to have +module owners. The conclusion was that for certain components, +it makes sense to have a smaller group of people getting the bug +reports and having responsibility for them. This would be done +via mail aliases for the group of people guiding the component, +in a similar way to that which is used for (say) gtktreeview in +gtk+. + +The module owner group wouldn't have to be technical, and we +should be actively recruiting people to do this kind of work and +leave more time for programmers to program. + +This leads us on to... + + +
+ +
+Task list + + +There are lots of non-technical jobs that need doing around the +gimp-docs, website, bugzilla triage, internationalisation, +etc. Often it is quite difficult to know what needs doing, and +who to contact about getting it done. We need a list of +bite-sized tasks that people can do, including the kinds of +tasks that only take a few hours a week to do, but are ongoing +tasks. + +We used to have a TODO, and we could use that system again, if +someone were maintaining it. That could come under the remit of +the release manager to some extent, but since the mainenance of +the TODO list is mostly a non-technical task, anyone could do it +(in fact, as an example of a task, Maintaining the TODO +list would go in the TODO list). + +We might do this through Bugzilla using a keyword to allow +getting at the list easily, which would imply getting more +people looking at bugzilla regularly. Then again, if there were +a link to a bugzilla query on the webpage marked GIMP +TODO list we could get that for free. + + +
+ +
+GIMP Foundation + + +Basically, we're agreed this is a good idea to have some kind of +public face people and companies can contribute to. There is no +problem with having 2 foundations, one in Europe and one in the +US. It was more or less agreed that assigning copyright to the +foundation isn't going to happen soon (for a start, so many +plug-in authors have gone their merry way and are almost +unfindable) This may hapen in the future, but most people felt +that it would not be something they'd be happy doing personally. + +Other people said they would prefer to assign copyright to an +organism under the jurisdiction of European law rather than +under US jurisdiction. + +So, to sum up, there's no reason not to have one of +these. Daniel Rogers has agreed to do the necessary paperwork +and set up the foundation and the bank account for donations in +the US. Pretty quickly after getting that up and going, we will +need to get a board of directors and a set of by-laws. We know +lots of people who can help with this (in particular, the GNOME +foundation and the FSF). + +If someone wants to set up an equivalent in Europe, we're all +ears. Currently no-one has said they'll do it, so it's an open +point. To start, the foundation will only be a board an a bank +account - in the future, we could expand its responsibilities to +promotional work, a single point where people could go to get +speakers, a group that does press releases and so on. It was +agreed that at least in the short term it is undesirable to have +the foundation have actual control of source code, just in case +the foundation then gets sued. + +In brief, it's being set up with a very narrow remit, with the +possibility to expand later if it is felt that there is a need. + + +
+ +
+Release manager + + +The responsibilities are: + + +Follow CVS so that he can write release notes, and knows at +any given time who is working on what, and at what stage it +is + + +Follow bugzilla closely + + +Make releases regularly, according to the roadmap (or make +sure releases get made) + + +Update the roadmap to reflect reality + + +Write release notes for the releases (keep NEWS up to date) + + +Generally annoy people sending mails to the mailing lists and +sending content to the website to explain the state of play +and get people to work on stuff. + + + +Dave Neary (me) agreed to do this. He already regrets it. + +That's it folks - today, Sven and mitch are going to talk to us +about the major changes in the codebase and the general utility +stuff which exists now which has been written from scratch, +Calvin and Daniel are going to talk about GEGL and how we can +use it, and work towards having a GEGL that we can use in a +year. I'm going to lead a discussion on communication in the +GIMP, and how to maybe make it easier for people to contribute, +and jimmac is going to demonstrate what a power user really is. + +Goodbye from everyone at camp. As usual, comments are welcome on +all this stuff. While on a philosophical level, we are agreed on +the direction things should take, all the details are open to +discussion, if there's any reason to change them. + +Written by Dave Neary + diff --git a/public/gimpcon/2003/gimpcon2003-mins-1/index.html b/public/gimpcon/2003/gimpcon2003-mins-1/index.html index a1906ae..681f898 100644 --- a/public/gimpcon/2003/gimpcon2003-mins-1/index.html +++ b/public/gimpcon/2003/gimpcon2003-mins-1/index.html @@ -8,8 +8,8 @@ - · GIMP Developer Resources - + The First Big Serious Meeting of GIMPCon 2003 · GIMP Developer Resources + @@ -101,246 +101,159 @@
-

+

The First Big Serious Meeting of GIMPCon 2003

-
<title>The First Big Serious Meeting of GIMPCon 2003</title>
-<titleabbrev>First Meeting</titleabbrev>
-<summary>Minutes of the first GIMPCon 2003 Meeting</summary>
-
- - - - - - - -
<para>
-  The idea of a foundation was proposed. Lots of ideas were thrown
-  about as to what kind of remit it would have. If created, the
-  foundation would certainly have 2 things we don't have at the
-  moment - a bank account people could donate to, and a focus on
-  <quote>marketing</quote> in the broadest sense of the word.
-</para>
-
-<para>
-  Some of the issues were whether the foundation would be set up
-  in Europe or in the US (in the US it might make it easier to get
-  donations from US companies, but in Europe we're not as
-  litigious, so setting up would certainly cost less, but then we
-  probably wouldn't have NPO status in the US), whether it would
-  have any technical aspect (that is, would the foundation act as
-  a kind of steering committee for the general direction of the
-  GIMP?), and how, if the issue came up, we might pay someone.
-</para>
-
-<para>
-  This led onto a discussion of whether the foundation would be
-  responsible for setting release dates, or whether we would have
-  a separate...
-</para>
-
- - -
<para>
-  The general consensus (more on that later) was that a release
-  manager is a good thing. There do seem to be a few different
-  ideas of what the role would entail. The general idea would be
-  that the release manager would be responsible for following CVS
-  and know at what stage a given feature is at, follow bugzilla
-  making sure that bugs got milestoned for some release in order
-  of their priority, would annoy people to get commits in before
-  feature freeze dates or postpone mercilessly features which are
-  not finished.
-</para>
-
-<para>
-  It was agreed that a release schedule would be helpful to define
-  the perimeters of responsibility of the release manager -
-  basically, some way to set up large milestones to aim for with
-  things to go into those milestones. This release schedule would
-  be subject to revision, and would be no more realistic than any
-  other release schedule, but it would serve as a guide for
-  development. Dan agreed to draw up a first draft of this, and
-  we'll have something more concrete before the end of the
-  weekend.
-</para>
-
-<para>
-  The questions that came up about the release manager were things
-  like where his authority comes from, how does he decide which
-  bugs are important and which features can be postponed and so
-  on. In other words, how do decisions get made. Is the release
-  manager a benevolent dictator, or does he answer to the larger
-  developer and user community? If so, to what extent? Is backing
-  out CVS commits OK, for example?
-</para>
-
-<para>
-  So we started talking about how to get contentious decisions
-  made.
-</para>
-
- - -
<para>
-  Currently, there are two ways to get something done in the
-  GIMP. First, you can write decent code and patches for a while,
-  until you get CVS commit access, then you write whatever feature
-  you're interested in, and commit it. If no-one backs it out,
-  then it's in.
-</para>
-
-<para>
-  Second, you can bring it up on the mailing list, or in bugzilla,
-  or in IRC (more on communication later), and discuss it until
-  there is a consensus. However, we tend to be pretty bad at
-  reaching consensus on anything even slightly contentious. The
-  important questions to be answered any time a discussion like
-  this comes up are what's going to be done, and who's going to do
-  it.
-</para>
-
-<para>
-  It was agreed that beyond a certain point, there is generally
-  very little technical merit to these types of discussions. It
-  was felt that about 5 days was enough for everyone with an
-  opinion on a given matter to make that opinion known, and that
-  after that point, it would be an idea to have a summary of the
-  salient points and close the discussion. That means, the people
-  here would stop posting to the discussion. Of course, if other
-  people want to keep on flaming, they're free to do so, but
-  people will just ignore the thread.
-</para>
-
-<para>
-  At this point, the summary should sum up the various points, and
-  finish with an answer to those two questions - what gets done,
-  and who's doing it.
-</para>
-
-<para>
-  We may even have a bake-off system. If there are two competing
-  ideas for the way something should be done, currently no-one
-  tends to do it. Ideally, both people would do it and we pick the
-  best one.
-</para>
-
-<para>
-  This brings up another point, though - in general, what is
-  authority? And in particular, at what point has someone gained
-  enough standing and authority to post one of these thread-ending
-  summaries? Some discussion is going to be had on that over the
-  weekend.
-</para>
-
- - -
<para>
-  We talked about various ways of improving the way we use these
-  tools. First is whether it makes sense for us to have module
-  owners, and if so, who should they be? Should we use the system
-  of bug owners to track who is responsible for a bug at any given
-  time, or is the current scheme of bugs@gimp.org sufficient? Do
-  we need to change bugs@gimp.org to something else to avoid
-  confusion with the old bug reporting address? There were a few
-  open points in here.
-</para>
-
-<para>
-  Second, we talked about pre-release branches, and whether it
-  would be worthwhile having a mozilla style release cycle with
-  feature-freezes, followed by concurrent bug-fixing before
-  unstable releases, freeing up the branch for bigger stuff that
-  people want to start committing. In general, it was felt that
-  there was very little to be gained from that, and the current
-  system of a long-lived devel branch with self-imposed feature
-  freezes every few weeks was a better way to go.
-</para>
-
-<para>
-  We also expressed a desire to have more redundancy in the
-  non-technical aspects of The GIMP, things like the mailing lists
-  and ftp mirror lists should have more than one person with the
-  ability to change them so that if there's a problem, and that
-  person has no time to take care of it, then someone
-  will. Perhaps using a Debian or GNU style ticket system might
-  help here fro these particular tasks? In any case, everyone in a
-  given group should know everyone else in the group, and know
-  more or less that when an issue gets in, it will be handled by
-  at least one person.
-</para>
-
- - -
<para>
-  It was agreed that we need to communicate better (that's a
-  no-brainer, really). For a start, every developer should be
-  subscribed to the userlist. gimp-devel (if it doesn't disappear
-  altogether) would only be used for technical discussions of
-  implementation details - all the philosophical level discussions
-  of new features, ui changes, release mechanisms and so on should
-  be discussed on the user list.
-</para>
-
-<para>
-  Basically, we're going to talk a lot more about how the
-  developers can interface better with the users.
-</para>
-
- - -
<para>
-  Not too many of these... we will have a release manager, but we
-  need to define exactly what his/her remit will be. And who it
-  will be. We agreed that the <quote>5 days and it's dead</quote>
-  rule for threads makes sense, so that will be done.
-</para>
-
- - -
<para>
-  <orderedlist>
-    <listitem>
-      Roadmap - rough release schedule, we will have a first draft
-      today.
-    </listitem>
-    <listitem>
-      GIMP Foundation - we need to define its responsibilities,
-      set up election rules, and get this set up. The principle of
-      the foundation is more or less agreed.
-    </listitem>
-    <listitem>
-      Communication
-    </listitem>
-    <listitem>
-      Release Manager - what'll he do, who'll he be. This should
-      be short once we have discussed communication channels a
-      bit.
-    </listitem>
-    <listitem>
-      Technie stuff - Sven and mitch are going to talk to us about
-      the re-organisation of the code, GObjectification of
-      everything, and other stuff. Daniel and Calvin are going to
-      talk to us about GEGL and how they feel The GIMP could use
-      it. This will probably be a two-way discussion about what
-      kind of things we expect GEGL to furnish as well.
-    </listitem>
-    <listitem>
-      GIMP tutorials - jimmac and nomis are going to do some
-      presentations for people, which should be good.
-    </listitem>
-    <listitem>
-      Plug-in distribution - 3 years ago this was discussion, yosh
-      has been working on something as a proof-of-concept, it
-      would be nice to address this and get something in place
-      soon.
-    </listitem>
-  </orderedlist>
-</para>
-
- - - +

August 7th 2003, around 8pm

+

Discussion was led by Daniel Rogers (dsrogers) but stuff said is +for the most part anonymous. Partly because there shouldn’t be any +ad hominem attacks that way, and partly because I didn’t take down +any names.

+

Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary +(bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik +Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), +Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin +Williamson (calvin), Roman Joost (romanofski).

+

Absent but at camp: Maurits Rijk (Maurits), Branko Collin (bbc).

+

Topic discussion, in approximate chronological order:

+ +

The GIMP Foundation

+

The idea of a foundation was proposed. Lots of ideas were thrown +about as to what kind of remit it would have. If created, the +foundation would certainly have 2 things we don’t have at the +moment - a bank account people could donate to, and a focus on +marketing in the broadest sense of the word.

+

Some of the issues were whether the foundation would be set up +in Europe or in the US (in the US it might make it easier to get +donations from US companies, but in Europe we’re not as +litigious, so setting up would certainly cost less, but then we +probably wouldn’t have NPO status in the US), whether it would +have any technical aspect (that is, would the foundation act as +a kind of steering committee for the general direction of the +GIMP?), and how, if the issue came up, we might pay someone.

+

This led onto a discussion of whether the foundation would be +responsible for setting release dates, or whether we would have +a separate…

+

Release Manager

+

The general consensus (more on that later) was that a release +manager is a good thing. There do seem to be a few different +ideas of what the role would entail. The general idea would be +that the release manager would be responsible for following CVS +and know at what stage a given feature is at, follow bugzilla +making sure that bugs got milestoned for some release in order +of their priority, would annoy people to get commits in before +feature freeze dates or postpone mercilessly features which are +not finished.

+

It was agreed that a release schedule would be helpful to define +the perimeters of responsibility of the release manager - +basically, some way to set up large milestones to aim for with +things to go into those milestones. This release schedule would +be subject to revision, and would be no more realistic than any +other release schedule, but it would serve as a guide for +development. Dan agreed to draw up a first draft of this, and +we’ll have something more concrete before the end of the +weekend.

+

The questions that came up about the release manager were things +like where his authority comes from, how does he decide which +bugs are important and which features can be postponed and so +on. In other words, how do decisions get made. Is the release +manager a benevolent dictator, or does he answer to the larger +developer and user community? If so, to what extent? Is backing +out CVS commits OK, for example?

+

So we started talking about how to get contentious decisions +made.

+

Decision making (or lack of it)

+

Currently, there are two ways to get something done in the +GIMP. First, you can write decent code and patches for a while, +until you get CVS commit access, then you write whatever feature +you’re interested in, and commit it. If no-one backs it out, +then it’s in.

+

Second, you can bring it up on the mailing list, or in bugzilla, +or in IRC (more on communication later), and discuss it until +there is a consensus. However, we tend to be pretty bad at +reaching consensus on anything even slightly contentious. The +important questions to be answered any time a discussion like +this comes up are what’s going to be done, and who’s going to do +it.

+

It was agreed that beyond a certain point, there is generally +very little technical merit to these types of discussions. It +was felt that about 5 days was enough for everyone with an +opinion on a given matter to make that opinion known, and that +after that point, it would be an idea to have a summary of the +salient points and close the discussion. That means, the people +here would stop posting to the discussion. Of course, if other +people want to keep on flaming, they’re free to do so, but +people will just ignore the thread.

+

At this point, the summary should sum up the various points, and +finish with an answer to those two questions - what gets done, +and who’s doing it.

+

We may even have a bake-off system. If there are two competing +ideas for the way something should be done, currently no-one +tends to do it. Ideally, both people would do it and we pick the +best one.

+

This brings up another point, though - in general, what is +authority? And in particular, at what point has someone gained +enough standing and authority to post one of these thread-ending +summaries? Some discussion is going to be had on that over the +weekend.

+

General stuff, about Bugzilla and CVS

+

We talked about various ways of improving the way we use these +tools. First is whether it makes sense for us to have module +owners, and if so, who should they be? Should we use the system +of bug owners to track who is responsible for a bug at any given +time, or is the current scheme of bugs@gimp.org sufficient? Do +we need to change bugs@gimp.org to something else to avoid +confusion with the old bug reporting address? There were a few +open points in here.

+

Second, we talked about pre-release branches, and whether it +would be worthwhile having a mozilla style release cycle with +feature-freezes, followed by concurrent bug-fixing before +unstable releases, freeing up the branch for bigger stuff that +people want to start committing. In general, it was felt that +there was very little to be gained from that, and the current +system of a long-lived devel branch with self-imposed feature +freezes every few weeks was a better way to go.

+

We also expressed a desire to have more redundancy in the +non-technical aspects of The GIMP, things like the mailing lists +and ftp mirror lists should have more than one person with the +ability to change them so that if there’s a problem, and that +person has no time to take care of it, then someone +will. Perhaps using a Debian or GNU style ticket system might +help here fro these particular tasks? In any case, everyone in a +given group should know everyone else in the group, and know +more or less that when an issue gets in, it will be handled by +at least one person.

+

Communication

+

It was agreed that we need to communicate better (that’s a +no-brainer, really). For a start, every developer should be +subscribed to the userlist. gimp-devel (if it doesn’t disappear +altogether) would only be used for technical discussions of +implementation details - all the philosophical level discussions +of new features, ui changes, release mechanisms and so on should +be discussed on the user list.

+

Basically, we’re going to talk a lot more about how the +developers can interface better with the users.

+

Decisions

+

Not too many of these… we will have a release manager, but we +need to define exactly what his/her remit will be. And who it +will be. We agreed that the 5 days and it’s dead +rule for threads makes sense, so that will be done.

+

Future

+
    +
  1. Roadmap - rough release schedule, we will have a first draft today.
  2. +
  3. GIMP Foundation - we need to define its responsibilities, set up election rules, and get this set up. The principle of the foundation is more or less agreed.
  4. +
  5. Communication
  6. +
  7. Release Manager - what’ll he do, who’ll he be. This should be short once we have discussed communication channels a bit.
  8. +
  9. Technie stuff - Sven and mitch are going to talk to us about the re-organisation of the code, GObjectification of everything, and other stuff. Daniel and Calvin are going to talk to us about GEGL and how they feel The GIMP could use it. This will probably be a two-way discussion about what kind of things we expect GEGL to furnish as well.
  10. +
  11. GIMP tutorials - jimmac and nomis are going to do some presentations for people, which should be good.
  12. +
  13. Plug-in distribution - 3 years ago this was discussion, yosh has been working on something as a proof-of-concept, it would be nice to address this and get something in place soon.
  14. +
+

Written by Dave Neary

diff --git a/public/gimpcon/2003/gimpcon2003-mins-2/index.html b/public/gimpcon/2003/gimpcon2003-mins-2/index.html index a423f57..0b8c2a4 100644 --- a/public/gimpcon/2003/gimpcon2003-mins-2/index.html +++ b/public/gimpcon/2003/gimpcon2003-mins-2/index.html @@ -8,8 +8,8 @@ - · GIMP Developer Resources - + The Second Big Serious Meeting of GIMPCon2003 · GIMP Developer Resources + @@ -101,302 +101,173 @@
-

+

The Second Big Serious Meeting of GIMPCon2003

-
<title>The Second Big Serious Meeting of GIMPCon2003</title>
-<titleabbrev>Second Meeting</titleabbrev>
-<summary>Minutes of the second GIMPCon 2003 Meeting</summary>
-
+

August 8th 2003, around 8pm

+

Discussion was led by Daniel Rogers (dsrogers) but stuff said is +for the most part anonymous. Partly because there shouldn’t be any +ad hominem attacks that way, and partly because I didn’t take down +any names.

+

Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary +(bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik +Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), +Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin +Williamson (calvin), Roman Joost (romanofski), Maurits Rijk +(Maurits), Branko Collin (bbc).

+

Topic discussion, in approximate chronological order:

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • -
    <para>
    -  There was quite a lot of talk on what was required for a 2.0
    -  release. It was agreed that a pre-release should have feature
    -  complete versions of everything going into 2.0, for obvious
    -  reasons. These can be somewhat buggy, but they should at least
    -  support what is supported in the 1.2 equivalents.
    -</para>
    -
    -<para>
    -  The major features or API changes which it was agreed are
    -  necessary are:
    -<orderedlist>
    -  <listitem>Complete path tool (nomis)</listitem>
    -  <listitem>Remove libgck (Sven and mitch)</listitem>
    -  <listitem>Finish the text tool (Sven)</listitem>
    -  <listitem>Documentation (more on this later)</listitem>
    -  <listitem>Web-site (again, more on this later)</listitem>
    -  <listitem>Some libgimp changes which need to be made now so that
    -  we can havebinary compatibility across a 2.2 release</listitem>
    -</orderedlist>
    -</para>
    -
    +
  • +
  • +
  • +
  • -
    <para>
    -  We felt that with pre-releases, the documentation will become
    -  more complete. There should, however, be an effort to actively
    -  get people writing docs. The main requirement, then, for 2.0
    -  pre-releases will be to have a working help framework, so that
    -  when people hit F1 for help, they at least get a message saying
    -  <quote>This help item does not exist yet.If you would like to
    -  help write it, contact docs@gimp.org</quote> or some such.
    -  <footnote>
    -<para>
    -      That email address doesn't exist (yet). People interested in
    -      helping with the documentation should have a look at the
    -      <ulink url="http://wiki.gimp.org/gimp/GimpDocs">Wiki</ulink>.
    -    </para>
    -  </footnote>
    -</para>
    -
    -<para>
    -  If documentation is going to be released as a separate package,
    -  as now seems likely, then we will need to define the interface
    -  between the core and the help pages reasonably quickly. The
    -  general idea is to more or less hard-code tagnames for a
    -  particular help topic, and get the core and help using the same
    -  tags, and agreeing on how they be communicated. This will
    -  presumably require a considerable amount of communication with
    -  the help team.
    -</para>
    -
    -<para>
    -  We also need to have the docs browsable online so that if people
    -  want to browse them they can.
    -</para>
    -
    +
  • +
+

Features required for 2.0

+

There was quite a lot of talk on what was required for a 2.0 +release. It was agreed that a pre-release should have feature +complete versions of everything going into 2.0, for obvious +reasons. These can be somewhat buggy, but they should at least +support what is supported in the 1.2 equivalents.

+

The major features or API changes which it was agreed are +necessary are:

-
<para>
-  The new site should switch over to www.gimp.org soon. There will
-  obviously be quite a bit of pain involved as content gets added
-  and we get lots of <quote>your website sucks</quote> type
-  feedback, but this will only befor the short term. We should
-  switch to mmaybe as the main site before 2.0pre1. It was
-  suggested to do it even earlier than that, in the region of 2 to
-  3 weeks time.
-</para>
-
-<para>
-  It was also discussed whether it was a good idea to have a
-  separate coordinator for the website.
-</para>
-
-
<para>
-  As an approximate set of ideals, it was agreed that we want
-  this: 2.0pre1 very soon, 2.0 soon, 2.2 next year, and GEGL
-  integration the end of next Summer.
-</para>
-
-<para>
-  More specifically, the near-term release schedule that we agreed
-  was reasonable is this:
-</para>
-
-<para>
-  1 or 2 developer releases (one now, more or less, and another
-  one in another 2 weeks). 6 weeks time (end of September 2003):
-  First pre-release of 2.0, including the features mentioned
-  above, and any other minor features that people code in the
-  meantime (hint, hint). Roughly 3 months later: 2.0
-</para>
-
-<para>
-  It was more or less agreed that 3 to 4 weeks was a nice
-  turnaround time for pre-releases, so that would imply between 4
-  and 6 (inclusive) pre-releases before 2.0.
-</para>
-
-<para>
-  The reason for not having a pre-release straight away was
-  mentioned above: to be feature complete, some features need a
-  little more than 2 weeks work, and people have real lives. So 6
-  weeks was felt to be a reasonable amount of time to have the
-  path tool and the help browser in place.
-</para>
-
+

If documentation is going to be released as a separate package, +as now seems likely, then we will need to define the interface +between the core and the help pages reasonably quickly. The +general idea is to more or less hard-code tagnames for a +particular help topic, and get the core and help using the same +tags, and agreeing on how they be communicated. This will +presumably require a considerable amount of communication with +the help team.

+

We also need to have the docs browsable online so that if people +want to browse them they can. +

-
<para>
-  The developer release will also be a prelude to a bug week. We
-  would like people (that's you, in particular) to actively work
-  on bugzilla clean-up for 2.0 - bugs need to be prioritized,
-  unconfirmed bugs need confirming and milestoning (and if you're
-  feeling really helpful, fixing). The idea would more or less be
-  that the 2.0 milestone will be locked down for anything other
-  than serious bugs after this bug week, so if there are bugs that
-  are annoying you a lot, this is your chance to get them
-  considered and worked on for the 2.0 releases.
-</para>
-
-<para>
-  Just to spell that out - at the end of the bug week, any bugs
-  reported against The GIMP in CVS will be milestoned for 2.0.x,
-  or even 2.2, unless they are considered blockers for the
-  release. If we want to get a 2.0 release soon, we need to get
-  lots of testing done, and lots of bugfixing done, but we also
-  need to choose what to do and what not to do. We felt this was a
-  reasonable compromise.
-</para>
-
-<para>
-  It was also re-discussed whether it would make sense to have
-  module owners. The conclusion was that for certain components,
-  it makes sense to have a smaller group of people getting the bug
-  reports and having responsibility for them. This would be done
-  via mail aliases for the group of people guiding the component,
-  in a similar way to that which is used for (say) gtktreeview in
-  gtk+.
-</para>
-
-<para>
-  The module owner group wouldn't have to be technical, and we
-  should be actively recruiting people to do this kind of work and
-  leave more time for programmers to program.
-</para>
-
-<para>
-  This leads us on to...
-</para>
-
+

It was also discussed whether it was a good idea to have a +separate coordinator for the website. +

-
<para>
-  There are lots of non-technical jobs that need doing around the
-  gimp-docs, website, bugzilla triage, internationalisation,
-  etc. Often it is quite difficult to know what needs doing, and
-  who to contact about getting it done. We need a list of
-  bite-sized tasks that people can do, including the kinds of
-  tasks that only take a few hours a week to do, but are ongoing
-  tasks.
-</para>
-
-<para>
-  We used to have a TODO, and we could use that system again, if
-  someone were maintaining it. That could come under the remit of
-  the release manager to some extent, but since the mainenance of
-  the TODO list is mostly a non-technical task, anyone could do it
-  (in fact, as an example of a task, <quote>Maintaining the TODO
-  list</quote> would go in the TODO list).
-</para>
-
-<para>
-  We might do this through Bugzilla using a keyword to allow
-  getting at the list easily, which would imply getting more
-  people looking at bugzilla regularly. Then again, if there were
-  a link to a bugzilla query on the webpage marked <quote>GIMP
-  TODO list</quote> we could get that for free.
-</para>
-
-
<para>
-  Basically, we're agreed this is a good idea to have some kind of
-  public face people and companies can contribute to. There is no
-  problem with having 2 foundations, one in Europe and one in the
-  US. It was more or less agreed that assigning copyright to the
-  foundation isn't going to happen soon (for a start, so many
-  plug-in authors have gone their merry way and are almost
-  unfindable) This may hapen in the future, but most people felt
-  that it would not be something they'd be happy doing personally.
-</para>
-
-<para>
-  Other people said they would prefer to assign copyright to an
-  organism under the jurisdiction of European law rather than
-  under US jurisdiction.
-</para>
-
-<para>
-  So, to sum up, there's no reason not to have one of
-  these. Daniel Rogers has agreed to do the necessary paperwork
-  and set up the foundation and the bank account for donations in
-  the US. Pretty quickly after getting that up and going, we will
-  need to get a board of directors and a set of by-laws. We know
-  lots of people who can help with this (in particular, the GNOME
-  foundation and the FSF).
-</para>
-
-<para>
-  If someone wants to set up an equivalent in Europe, we're all
-  ears. Currently no-one has said they'll do it, so it's an open
-  point. To start, the foundation will only be a board an a bank
-  account - in the future, we could expand its responsibilities to
-  promotional work, a single point where people could go to get
-  speakers, a group that does press releases and so on. It was
-  agreed that at least in the short term it is undesirable to have
-  the foundation have actual control of source code, just in case
-  the foundation then gets sued.
-</para>
-
-<para>
-  In brief, it's being set up with a very narrow remit, with the
-  possibility to expand later if it is felt that there is a need.
-</para>
-
+

More specifically, the near-term release schedule that we agreed +was reasonable is this:

+

1 or 2 developer releases (one now, more or less, and another +one in another 2 weeks). 6 weeks time (end of September 2003): +First pre-release of 2.0, including the features mentioned +above, and any other minor features that people code in the +meantime (hint, hint). Roughly 3 months later: 2.0

+

It was more or less agreed that 3 to 4 weeks was a nice +turnaround time for pre-releases, so that would imply between 4 +and 6 (inclusive) pre-releases before 2.0.

+

The reason for not having a pre-release straight away was +mentioned above: to be feature complete, some features need a +little more than 2 weeks work, and people have real lives. So 6 +weeks was felt to be a reasonable amount of time to have the +path tool and the help browser in place. +

-
<para>
-  The responsibilities are:
-<itemizedlist>
-  <listitem>
-    Follow CVS so that he can write release notes, and knows at
-    any given time who is working on what, and at what stage it
-    is
-  </listitem>
-  <listitem>
-    Follow bugzilla closely
-  </listitem>
-  <listitem>
-    Make releases regularly, according to the roadmap (or make
-    sure releases get made)
-  </listitem>
-  <listitem>
-    Update the roadmap to reflect reality
-  </listitem>
-  <listitem>
-    Write release notes for the releases (keep NEWS up to date)
-  </listitem>
-  <listitem>
-    Generally annoy people sending mails to the mailing lists and
-    sending content to the website to explain the state of play
-    and get people to work on stuff.
-  </listitem>
-</itemizedlist>
-</para>
-
-<para>
-  Dave Neary (me) agreed to do this. He already regrets it.
-</para>
-
-<para>
-  That's it folks - today, Sven and mitch are going to talk to us
-  about the major changes in the codebase and the general utility
-  stuff which exists now which has been written from scratch,
-  Calvin and Daniel are going to talk about GEGL and how we can
-  use it, and work towards having a GEGL that we can use in a
-  year. I'm going to lead a discussion on communication in the
-  GIMP, and how to maybe make it easier for people to contribute,
-  and jimmac is going to demonstrate what a power user really is.
-</para>
-
-<para>
-  Goodbye from everyone at camp. As usual, comments are welcome on
-  all this stuff. While on a philosophical level, we are agreed on
-  the direction things should take, all the details are open to
-  discussion, if there's any reason to change them.
-</para>
-
+ +

Just to spell that out - at the end of the bug week, any bugs +reported against The GIMP in CVS will be milestoned for 2.0.x, +or even 2.2, unless they are considered blockers for the +release. If we want to get a 2.0 release soon, we need to get +lots of testing done, and lots of bugfixing done, but we also +need to choose what to do and what not to do. We felt this was a +reasonable compromise.

+

It was also re-discussed whether it would make sense to have +module owners. The conclusion was that for certain components, +it makes sense to have a smaller group of people getting the bug +reports and having responsibility for them. This would be done +via mail aliases for the group of people guiding the component, +in a similar way to that which is used for (say) gtktreeview in +gtk+.

+

The module owner group wouldn’t have to be technical, and we +should be actively recruiting people to do this kind of work and +leave more time for programmers to program.

+

This leads us on to… +

+ + + +

We used to have a TODO, and we could use that system again, if +someone were maintaining it. That could come under the remit of +the release manager to some extent, but since the mainenance of +the TODO list is mostly a non-technical task, anyone could do it +(in fact, as an example of a task, Maintaining the TODO +list would go in the TODO list).

+

We might do this through Bugzilla using a keyword to allow +getting at the list easily, which would imply getting more +people looking at bugzilla regularly. Then again, if there were +a link to a bugzilla query on the webpage marked GIMP +TODO list we could get that for free. +

+ + + +

Other people said they would prefer to assign copyright to an +organism under the jurisdiction of European law rather than +under US jurisdiction.

+

So, to sum up, there’s no reason not to have one of +these. Daniel Rogers has agreed to do the necessary paperwork +and set up the foundation and the bank account for donations in +the US. Pretty quickly after getting that up and going, we will +need to get a board of directors and a set of by-laws. We know +lots of people who can help with this (in particular, the GNOME +foundation and the FSF).

+

If someone wants to set up an equivalent in Europe, we’re all +ears. Currently no-one has said they’ll do it, so it’s an open +point. To start, the foundation will only be a board an a bank +account - in the future, we could expand its responsibilities to +promotional work, a single point where people could go to get +speakers, a group that does press releases and so on. It was +agreed that at least in the short term it is undesirable to have +the foundation have actual control of source code, just in case +the foundation then gets sued.

+

In brief, it’s being set up with a very narrow remit, with the +possibility to expand later if it is felt that there is a need. +

+

Dave Neary (me) agreed to do this. He already regrets it.

+

That’s it folks - today, Sven and mitch are going to talk to us +about the major changes in the codebase and the general utility +stuff which exists now which has been written from scratch, +Calvin and Daniel are going to talk about GEGL and how we can +use it, and work towards having a GEGL that we can use in a +year. I’m going to lead a discussion on communication in the +GIMP, and how to maybe make it easier for people to contribute, +and jimmac is going to demonstrate what a power user really is.

+

Goodbye from everyone at camp. As usual, comments are welcome on +all this stuff. While on a philosophical level, we are agreed on +the direction things should take, all the details are open to +discussion, if there’s any reason to change them.

+

Written by Dave Neary

diff --git a/public/gimpcon/2003/index.html b/public/gimpcon/2003/index.html index 6072e42..ae8467b 100644 --- a/public/gimpcon/2003/index.html +++ b/public/gimpcon/2003/index.html @@ -103,13 +103,13 @@
diff --git a/public/gimpcon/2003/index.xml b/public/gimpcon/2003/index.xml index ffd7c84..cd0bd62 100644 --- a/public/gimpcon/2003/index.xml +++ b/public/gimpcon/2003/index.xml @@ -9,38 +9,42 @@ Copyright 2003-2022 The GIMP Development Team - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ Mon, 01 Jan 0001 00:00:00 +0000 - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ - &lt;title&gt;The First Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;First Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the first GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on &lt;quote&gt;marketing&lt;/quote&gt; in the broadest sense of the word. + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ + &lt;title&gt;The Third Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;Third Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the third GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ Mon, 01 Jan 0001 00:00:00 +0000 - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ - &lt;title&gt;The Second Big Serious Meeting of GIMPCon2003&lt;/title&gt; &lt;titleabbrev&gt;Second Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the second GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. &lt;/para&gt; &lt;para&gt; The major features or API changes which it was agreed are necessary are: &lt;orderedlist&gt; &lt;listitem&gt;Complete path tool (nomis)&lt;/listitem&gt; &lt;listitem&gt;Remove libgck (Sven and mitch)&lt;/listitem&gt; &lt;listitem&gt;Finish the text tool (Sven)&lt;/listitem&gt; &lt;listitem&gt;Documentation (more on this later)&lt;/listitem&gt; &lt;listitem&gt;Web-site (again, more on this later)&lt;/listitem&gt; &lt;listitem&gt;Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2. + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ + &lt;title&gt;Minutes of The GIMP Developers Conference 2003&lt;/title&gt; &lt;titleabbrev&gt;Minutes&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the GIMPCon 2003 Meetings&lt;/summary&gt; &lt;para&gt; This meeting was held in the evening of August 7th, 2003. The main issues discussed were: &lt;itemizedlist&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;foundation&quot;&gt;The GIMP foundation&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;manager&quot;&gt;Release manager&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;decisions&quot;&gt;Decision making (or lack of it)&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;general&quot;&gt;General stuff about CVS, Bugzilla&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;communication&quot;&gt;Communication&lt;/olink&gt; &lt;/listitem&gt; &lt;/itemizedlist&gt; &lt;/para&gt; &lt;para&gt; The minutes from this meeting can be found &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot;&gt;here&lt;/olink&gt;. - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ + The First Big Serious Meeting of GIMPCon 2003 + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ Mon, 01 Jan 0001 00:00:00 +0000 - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ - &lt;title&gt;The Third Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;Third Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the third GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + August 7th 2003, around 8pm +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn&rsquo;t be any ad hominem attacks that way, and partly because I didn&rsquo;t take down any names. +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski). - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ + The Second Big Serious Meeting of GIMPCon2003 + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ Mon, 01 Jan 0001 00:00:00 +0000 - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins/ - &lt;title&gt;Minutes of The GIMP Developers Conference 2003&lt;/title&gt; &lt;titleabbrev&gt;Minutes&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the GIMPCon 2003 Meetings&lt;/summary&gt; &lt;para&gt; This meeting was held in the evening of August 7th, 2003. The main issues discussed were: &lt;itemizedlist&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;foundation&quot;&gt;The GIMP foundation&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;manager&quot;&gt;Release manager&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;decisions&quot;&gt;Decision making (or lack of it)&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;general&quot;&gt;General stuff about CVS, Bugzilla&lt;/olink&gt; &lt;/listitem&gt; &lt;listitem&gt; &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot; localinfo=&quot;communication&quot;&gt;Communication&lt;/olink&gt; &lt;/listitem&gt; &lt;/itemizedlist&gt; &lt;/para&gt; &lt;para&gt; The minutes from this meeting can be found &lt;olink targetdocent=&quot;gimpcon2003-mins-1&quot;&gt;here&lt;/olink&gt;. + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + August 8th 2003, around 8pm +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn&rsquo;t be any ad hominem attacks that way, and partly because I didn&rsquo;t take down any names. +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski), Maurits Rijk (Maurits), Branko Collin (bbc). diff --git a/public/index.xml b/public/index.xml index 68dc84c..c3dbbb4 100644 --- a/public/index.xml +++ b/public/index.xml @@ -107,24 +107,6 @@ Below is a list of links to get you started with Gitlab: GIMP doesn&rsquo;t use CVS any longer. The source code repository has been migrated to git. - - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ - &lt;title&gt;The First Big Serious Meeting of GIMPCon 2003&lt;/title&gt; &lt;titleabbrev&gt;First Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the first GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on &lt;quote&gt;marketing&lt;/quote&gt; in the broadest sense of the word. - - - - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ - &lt;title&gt;The Second Big Serious Meeting of GIMPCon2003&lt;/title&gt; &lt;titleabbrev&gt;Second Meeting&lt;/titleabbrev&gt; &lt;summary&gt;Minutes of the second GIMPCon 2003 Meeting&lt;/summary&gt; &lt;para&gt; There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. &lt;/para&gt; &lt;para&gt; The major features or API changes which it was agreed are necessary are: &lt;orderedlist&gt; &lt;listitem&gt;Complete path tool (nomis)&lt;/listitem&gt; &lt;listitem&gt;Remove libgck (Sven and mitch)&lt;/listitem&gt; &lt;listitem&gt;Finish the text tool (Sven)&lt;/listitem&gt; &lt;listitem&gt;Documentation (more on this later)&lt;/listitem&gt; &lt;listitem&gt;Web-site (again, more on this later)&lt;/listitem&gt; &lt;listitem&gt;Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2. - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ @@ -186,5 +168,27 @@ In the &lt;olink targetdocent=&quot;writing-a-plug-in-2&quot;&gt Here are a few screenshots of the development version. More should be added&hellip; + + The First Big Serious Meeting of GIMPCon 2003 + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + August 7th 2003, around 8pm +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn&rsquo;t be any ad hominem attacks that way, and partly because I didn&rsquo;t take down any names. +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski). + + + + The Second Big Serious Meeting of GIMPCon2003 + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ + August 8th 2003, around 8pm +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn&rsquo;t be any ad hominem attacks that way, and partly because I didn&rsquo;t take down any names. +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski), Maurits Rijk (Maurits), Branko Collin (bbc). + + diff --git a/public/sitemap.xml b/public/sitemap.xml index fe9b90d..801ad39 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -37,10 +37,6 @@ https://developer.gimp.org/index.html/ 2022-07-19T00:00:00+00:00 - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ - - https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-3/ @@ -67,6 +63,10 @@ https://developer.gimp.org/screenshots.html https://developer.gimp.org/tags/ + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ + + https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ https://developer.gimp.org/writing-a-plug-in/ -- GitLab From d1d33ee8e20eae789f8644e7f774dcee71c43360 Mon Sep 17 00:00:00 2001 From: robin-swift Date: Sat, 23 Jul 2022 23:31:14 +0100 Subject: [PATCH 5/8] writing a plug in translation --- content/writing-a-plug-in/1.md | 642 ++++------ content/writing-a-plug-in/2.md | 764 ++++++------ content/writing-a-plug-in/3.md | 1628 +++++++++++-------------- public/index.xml | 28 +- public/sitemap.xml | 10 +- public/writing-a-plug-in/1/index.html | 531 +++----- public/writing-a-plug-in/2/index.html | 698 +++++------ public/writing-a-plug-in/3/index.html | 1536 ++++++++++------------- public/writing-a-plug-in/index.html | 4 +- public/writing-a-plug-in/index.xml | 31 +- 10 files changed, 2545 insertions(+), 3327 deletions(-) diff --git a/content/writing-a-plug-in/1.md b/content/writing-a-plug-in/1.md index 084676e..e8581c1 100644 --- a/content/writing-a-plug-in/1.md +++ b/content/writing-a-plug-in/1.md @@ -1,19 +1,18 @@ ---- -title: "How to write a GIMP plug-in" -abbrev: "Writing A Plug-In" -description: "Write your own" ---- ++++ +title = "How to write a GIMP plug-in" +abbrev = "Writing A Plug-In" +description = "Write your own" +author = "Dave Neary" ++++ -Written By Dave Neary +Written By [Dave Neary](mailto:bolsh@NOSPAM.gimp.org). In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors. -
-Introduction +## Introduction - New developers are often intimidated by The GIMP size and its reputation. They think that writing a plug-in would be a difficult task. The goal of these articles is to dumb this @@ -25,19 +24,8 @@ directly manipulate it. ## Architecture - - - - - - - - Architecture - - - Architecture - - +architecture.png +[architecture.png](Architecture) The GIMP script interface is centered on the Procedural database (PDB). At startup, The GIMP looks into a predefined set of @@ -62,369 +50,249 @@ first plug-in, a "Hello, world!". ## Compiling the plug-in - - To be able to compile simple plug-ins for The GIMP, one needs - libgimp headers, as well as an associated utility named - gimptool. - - - - With that utility, one can install a plug-in either in a private - directory (~/.gimp-2.0/plug-ins), or in the global plug-in - directory. - - - - Syntax is - - - - - - - - This utility, with other options, can also be used to install - scripts, or uninstall plug-ins. - -
- -
- Behaviour - - - A GIMP plug-in can typically behave three different ways. It can - take image data, modify it, and send back the modified image, - like edge detection. It can generate an image and send it back, - like some script-fus, or file reading plug-ins like jpeg. Or it - can get an image, and process it without modifying its data, - like a file saver plug-in. - -
- -
- Essentials - - - - - - - This header makes all basic plug-in elements available to us. - - - - - - - - This structure has to have that name. It contains four pointers - to functions, which will be called at set times of the plug-in - life. init and quit are optional, and thus can hold NULL values, - but the last two functions, query and run, are mandatory. - - - - The init() function is called each time The GIMP starts up. This - function is not typically used. Some plug-ins use it to make a - secondary search that is not done by the core. This function is - not used by any standard GIMP plug-in, but could be useful for - example for a plug-in that would like to register some procedure - conditionally on some files presence. - - - - The quit() function is not used much either. It is called when - The GIMP is about to be closed, to allow it to free some - resources. It is used in the script-fu plug-in. - - - - The query() function is called the first time the plug-in is - present, and then each time the plug-in changes. - - - - The run() function is the plug-in's centrepiece. It is called - when the plug-in is asked to run. It gets the plug-in name (as a - plug-in can register several procedures), input parameters, and - a pointer to output parameters, then determines if it is - launched in a interactive way or by a script, and does all the - plug-in processing. Its prototype is - - - - - - -
- -
- MAIN () - - - MAIN is a C macro that holds a bit of dark magic to initialise - arguments. It also calls the appropriate PLUG_IN_INFO function - depending on the timing. Your plug-in needs it. - -
- -
- The query() function - - - query() deals with the procedure registration and input - arguments definition. These informations are saved to speed up - startup time, and refreshed only when the plug-in is modified. - - - - For our "Hello, world!" plug-in, the query function will look - like this: - - - - /Filters/Misc"); - } - ]]> - - - - GimpParamDef contains three things - the parameter type, its - name, and a string describing the parameter. - - - - gimp_install_procedure declares the procedure name, some - description and help strings, menu path where the plug-in should - sit, image types handled by the plug-in, and at the end, input - and output parameters number, as well as the parameters - descriptors. - - - - "RGB*, GRAY*" declares the image types handled. It can be RGB, - INDEXED or GRAY, with or without Alpha. So "RGB*, GRAY*" - describes RGB, RGBA, GRAY or GRAY image type. - - - - GIMP_PLUGIN declares this procedure to be external, and not to - be executed in The GIMP core. - - - - By adding a stub run function now, we can check that our plug-in - has all the essential elements, and test that it registers - itself in the PDB with the "Xtns->Plug-in Details" plug-in. - - - - - - - - - - Plug-in details - - - Plug-in details - - - - - - - - - - - Our plug-in is in the menus - - - Our plug-in is in the menus - - -
- -
- The run() function - - - The other required function for PLUG_IN_INFO is run. The core of - the plug-in stands there. - - - - Output values (return_vals in the prototype) must have at least - one value associated - the plug-in status. Typically, this - parameter will hold "GIMP_PDB_SUCCESS". - -
- -
- Run-modes - - - One can run a plug-in in several different ways, it can be run - from a GIMP menu if The GIMP is run interactively, or from a - script or a batch, or from the "Filters->Repeat Last" shortcut. - - - - The "run_mode" input parameter can hold one of these values: - "GIMP_RUN_INTERACTIVE", "GIMP_RUN_NONINTERACTIVE" or - "GIMP_RUN_WITH_LAST_VALS". - - - - "GIMP_RUN_INTERACTIVE" is typically the only case where one - creates an options dialog. Otherwise, one directly calls the - processing with values from input parameters or from memory. - - - - For our test plug-in, we will simply display a dialog containing - a "Hello, world!" message. Thankfully, this is really easy with - GTK+. Our run function could be: - - - - - - - - Now, when we run our plug-in, there is action: - - - - - - - - - Hello, world! - - - - - - Have a look at the full hello.c plug-in code. - -
- -
- Next part - - - In next part - we will go on, making a more useful plug-in that will get its - hands on image data. We will see how to use The GIMP image - architecture to make the plug-in perform better, processing the - image tile by tile. - -
- -
- - - - - - - - Creative Commons License - - - - - - - This work is licensed under a Creative - Commons Attribution-NonCommercial-ShareAlike 2.5 - License. - -
- - +To be able to compile simple plug-ins for The GIMP, one needs +libgimp headers, as well as an associated utility named +gimptool. + +With that utility, one can install a plug-in either in a private +directory (`~/.gimp-2.0/plug-ins`), or in the global plug-in +directory. + +Syntax is + +``` +gimptool-2.0 --install plugin.c or gimptool-2.0 --install-admin plugin.c +``` + +This utility, with other options, can also be used to install +scripts, or uninstall plug-ins. + +## Behaviour + +A GIMP plug-in can typically behave three different ways. It can +take image data, modify it, and send back the modified image, +like edge detection. It can generate an image and send it back, +like some script-fus, or file reading plug-ins like jpeg. Or it +can get an image, and process it without modifying its data, +like a file saver plug-in. + +## Essentials + +``` +#include +``` + +This header makes all basic plug-in elements available to us. + +``` +GimpPlugInInfo PLUG_IN_INFO = { + init, + quit, + query, + run +}; +``` + +This structure has to have that name. It contains four pointers +to functions, which will be called at set times of the plug-in +life. init and quit are optional, and thus can hold NULL values, +but the last two functions, query and run, are mandatory. + +The init() function is called each time The GIMP starts up. This +function is not typically used. Some plug-ins use it to make a +secondary search that is not done by the core. This function is +not used by any standard GIMP plug-in, but could be useful for +example for a plug-in that would like to register some procedure +conditionally on some files presence. + +The quit() function is not used much either. It is called when +The GIMP is about to be closed, to allow it to free some +resources. It is used in the script-fu plug-in. + +The query() function is called the first time the plug-in is +present, and then each time the plug-in changes. + +The run() function is the plug-in's centrepiece. It is called +when the plug-in is asked to run. It gets the plug-in name (as a +plug-in can register several procedures), input parameters, and +a pointer to output parameters, then determines if it is +launched in a interactive way or by a script, and does all the +plug-in processing. Its prototype is + +``` +void run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals); +``` + +## MAIN () + +MAIN is a C macro that holds a bit of dark magic to initialise +arguments. It also calls the appropriate PLUG_IN_INFO function +depending on the timing. Your plug-in needs it. + +## The query() function + +`query()` deals with the procedure registration and input +arguments definition. These informations are saved to speed up +startup time, and refreshed only when the plug-in is modified. + +For our "Hello, world!" plug-in, the query function will look +like this: + +``` +static void +query (void) +{ + static GimpParamDef args[] = { + { + GIMP_PDB_INT32, + "run-mode", + "Run mode" + }, + { + GIMP_PDB_IMAGE, + "image", + "Input image" + }, + { + GIMP_PDB_DRAWABLE, + "drawable", + "Input drawable" + } + }; + + gimp_install_procedure ( + "plug-in-hello", + "Hello, world!", + "Displays \"Hello, world!\" in a dialog", + "David Neary", + "Copyright David Neary", + "2004", + "_Hello world...", + "RGB*, GRAY*", + GIMP_PLUGIN, + G_N_ELEMENTS (args), 0, + args, NULL); + + gimp_plugin_menu_register ("plug-in-hello", + "/Filters/Misc"); +} +``` + +GimpParamDef contains three things - the parameter type, its +name, and a string describing the parameter. + +`gimp_install_procedure` declares the procedure name, some +description and help strings, menu path where the plug-in should +sit, image types handled by the plug-in, and at the end, input +and output parameters number, as well as the parameters +descriptors. + +"`RGB*, GRAY*`" declares the image types handled. It can be `RGB`, +`INDEXED` or `GRAY`, with or without Alpha. So "`RGB*, GRAY*`" +describes RGB, `RGBA`, `GRAY` or `GRAY` image type. + +GIMP_PLUGIN declares this procedure to be external, and not to +be executed in The GIMP core. + +By adding a stub run function now, we can check that our plug-in +has all the essential elements, and test that it registers +itself in the PDB with the "`Xtns->Plug-in Details`" plug-in. + +plug-in-details.png +plug-in-details-small.png +Plug-in details + +plug-in-menu.png +plug-in-menu-small.png +Our plug-in is in the menus + +## The run() function + +The other required function for PLUG_IN_INFO is run. The core of +the plug-in stands there. + +Output values (return_vals in the prototype) must have at least +one value associated - the plug-in status. Typically, this +parameter will hold "`GIMP_PDB_SUCCESS`". + +## Run-modes + +One can run a plug-in in several different ways, it can be run +from a GIMP menu if The GIMP is run interactively, or from a +script or a batch, or from the "Filters->Repeat Last" shortcut. + +The "`run_mode`" input parameter can hold one of these values: +"`GIMP_RUN_INTERACTIVE`", "`GIMP_RUN_NONINTERACTIVE`" or +"`GIMP_RUN_WITH_LAST_VALS`". + +"`GIMP_RUN_INTERACTIVE`" is typically the only case where one +creates an options dialog. Otherwise, one directly calls the +processing with values from input parameters or from memory. + +For our test plug-in, we will simply display a dialog containing +a "Hello, world!" message. Thankfully, this is really easy with +GTK+. Our run function could be: + +``` +static void +run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals) +{ +static GimpParam values[1]; +GimpPDBStatusType status = GIMP_PDB_SUCCESS; +GimpRunMode run_mode; + +/* Setting mandatory output values */ +*nreturn_vals = 1; +*return_vals = values; + +values[0].type = GIMP_PDB_STATUS; +values[0].data.d_status = status; + +/* Getting run_mode - we won't display a dialog if + * we are in NONINTERACTIVE mode */ +run_mode = param[0].data.d_int32; + +if (run_mode != GIMP_RUN_NONINTERACTIVE) + g_message("Hello, world!\n"); +} +``` + +Now, when we run our plug-in, there is action: + +[hello.png](Hello, world!) + +Have a look at the full [hello.c](hello.c) plug-in code. + +## Next part + +In next part +we will go on, making a more useful plug-in that will get its +hands on image data. We will see how to use The GIMP image +architecture to make the plug-in perform better, processing the +image tile by tile. + + + + + + + + +Creative Commons License + + + + +This work is licensed under a Creative +Commons Attribution-NonCommercial-ShareAlike 2.5 +License. diff --git a/content/writing-a-plug-in/2.md b/content/writing-a-plug-in/2.md index 92a8b8e..6d959bc 100644 --- a/content/writing-a-plug-in/2.md +++ b/content/writing-a-plug-in/2.md @@ -1,13 +1,14 @@ ---- -title: "How to write a GIMP plug-in, part II" -abbrev: "Part II" -description: "Write your own" ---- ++++ +title = "How to write a GIMP plug-in, part II" +abbrev = "Part II" +description = "Write your own" +author = "Dave Neary" ++++ -Written By Dave Neary +Written By [Dave Neary](mailto:bolsh@NOSPAM.gimp.org). -In the first -part, I presented essential elements to build a plug-in +In the [first part](writing-a-plug-in/1), +I presented essential elements to build a plug-in interface with The GIMP. Now we will produce a simple but useful algorithm that we could use in our plug-in. @@ -24,8 +25,8 @@ figure 1), in that case the center value will be replaced with 5, the mean of the 9 numbers in its neighbourhood. With this method, edge differences are splatted, giving a -blurred result. One can choose another radius, using a (2r + 1) -x (2r + 1) matrix. +blurred result. One can choose another radius, using a `(2r + 1) +x (2r + 1)` matrix. ## Image structure @@ -52,128 +53,92 @@ word "drawable" is often used in GIMP internal structures. A raw data. So : layers, layer masks, selections are all "drawables". - - - - - - - - Drawables - - - Drawables - +GimpImage.png +GimpImage-small.png +Drawables ## Accessing the data - - To get a GimpDrawable from its identifier, we need the - gimp_drawable_get() function: - - - - - - - - From this structure, one can access drawable data through a - GimpPixelRgn structure, and one can check the drawable type - (RGB, gray level). The full listing of functions available for a - GimpDrawable can be found in - the API. - - - - Two very important functions for plug-ins are - gimp_drawable_mask_bounds() and gimp_pixel_rgn_init(). The first - gives the active selection limits on the drawable, and the - second initialises the GimpPixelRgn we will use to access the - data. - - - - As soon as we have a well initialised GimpPixelRgn, we can - access the image data in several different ways, by pixel, by - rectangle, by row or by column. The best method will depend on - the algorithm one plans to use. Moreover, The GIMP uses a - tile-based architecture, and loading or unloading data is - expensive, so we should not use it more than necessary. - - - - - - - - - - Tiles - - - Tiles - - - - - The main functions to get and set image data are: - - - - - - - - There is also another way to access image data (it's even used - more often), that allows to manage data at the tile level. We - will look at it in detail later. - -
- +To get a GimpDrawable from its identifier, we need the +`gimp_drawable_get()` function: + +``` +GimpDrawable *gimp_drawable_get (gint32 drawable_id); +``` + +From this structure, one can access drawable data through a +GimpPixelRgn structure, and one can check the drawable type +(RGB, gray level). The full listing of functions available for a +GimpDrawable can be found in +the API. + +Two very important functions for plug-ins are +gimp_drawable_mask_bounds() and gimp_pixel_rgn_init(). The first +gives the active selection limits on the drawable, and the +second initialises the GimpPixelRgn we will use to access the +data. + +As soon as we have a well initialised GimpPixelRgn, we can +access the image data in several different ways, by pixel, by +rectangle, by row or by column. The best method will depend on +the algorithm one plans to use. Moreover, The GIMP uses a +tile-based architecture, and loading or unloading data is +expensive, so we should not use it more than necessary. + + + +Tiles + +The main functions to get and set image data are: + +``` +void gimp_pixel_rgn_get_pixel (GimpPixelRgn *pr, + guchar *buf, + gint x, + gint y); +void gimp_pixel_rgn_get_row (GimpPixelRgn *pr, + guchar *buf, + gint x, + gint y, + gint width); +void gimp_pixel_rgn_get_col (GimpPixelRgn *pr, + guchar *buf, + gint x, + gint y, + gint height); +void gimp_pixel_rgn_get_rect (GimpPixelRgn *pr, + guchar *buf, + gint x, + gint y, + gint width, + gint height); +void gimp_pixel_rgn_set_pixel (GimpPixelRgn *pr, + const guchar *buf, + gint x, + gint y); +void gimp_pixel_rgn_set_row (GimpPixelRgn *pr, + const guchar *buf, + gint x, + gint y, + gint width); +void gimp_pixel_rgn_set_col (GimpPixelRgn *pr, + const guchar *buf, + gint x, + gint y, + gint height); +void gimp_pixel_rgn_set_rect (GimpPixelRgn *pr, + const guchar *buf, + gint x, + gint y, + gint width, + gint height); +``` + +There is also another way to access image data (it's even used +more often), that allows to manage data at the tile level. We +will look at it in detail later. + ## Updating the image At last, a plug-in that has modified a drawable data must flush @@ -182,8 +147,8 @@ the display must be updated. This is done with the following function: ``` - gimp_displays_flush (); - gimp_drawable_detach (drawable); +gimp_displays_flush (); +gimp_drawable_detach (drawable); ``` ## Implementing blur() @@ -192,48 +157,48 @@ To be able to try out several different processing methods, we will delegate the job to a blur() function. Our run() is below. ``` - static void - run (const gchar *name, - gint nparams, - const GimpParam *param, - gint *nreturn_vals, - GimpParam **return_vals) - { - static GimpParam values[1]; - GimpPDBStatusType status = GIMP_PDB_SUCCESS; - GimpRunMode run_mode; - GimpDrawable *drawable; - - /* Setting mandatory output values */ - *nreturn_vals = 1; - *return_vals = values; - - values[0].type = GIMP_PDB_STATUS; - values[0].data.d_status = status; - - /* Getting run_mode - we won't display a dialog if - * we are in NONINTERACTIVE mode */ - run_mode = param[0].data.d_int32; - - /* Get the specified drawable */ - drawable = gimp_drawable_get (param[2].data.d_drawable); - - gimp_progress_init ("My Blur..."); - - /* Let's time blur - * - * GTimer timer = g_timer_new time (); - */ - - blur (drawable); - - /* g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer)); - * g_timer_destroy (timer); - */ - - gimp_displays_flush (); - gimp_drawable_detach (drawable); - } +static void +run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals) +{ + static GimpParam values[1]; + GimpPDBStatusType status = GIMP_PDB_SUCCESS; + GimpRunMode run_mode; + GimpDrawable *drawable; + + /* Setting mandatory output values */ + *nreturn_vals = 1; + *return_vals = values; + + values[0].type = GIMP_PDB_STATUS; + values[0].data.d_status = status; + + /* Getting run_mode - we won't display a dialog if + * we are in NONINTERACTIVE mode */ + run_mode = param[0].data.d_int32; + + /* Get the specified drawable */ + drawable = gimp_drawable_get (param[2].data.d_drawable); + + gimp_progress_init ("My Blur..."); + + /* Let's time blur + * + * GTimer timer = g_timer_new time (); + */ + + blur (drawable); + + /* g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer)); + * g_timer_destroy (timer); + */ + + gimp_displays_flush (); + gimp_drawable_detach (drawable); +} ``` There are a few lines here that need to be explained a bit more. @@ -270,108 +235,108 @@ parameters, and to write data, one uses TRUE and TRUE. Other combinations are possible but seldom used. ``` - static void - blur (GimpDrawable *drawable) - { - gint i, j, k, channels; - gint x1, y1, x2, y2; - GimpPixelRgn rgn_in, rgn_out; - guchar output[4]; - - /* Gets upper left and lower right coordinates, - * and layers number in the image */ - gimp_drawable_mask_bounds (drawable->drawable_id, - &x1, &y1, - &x2, &y2); - channels = gimp_drawable_bpp (drawable->drawable_id); - - /* Initialises two PixelRgns, one to read original data, - * and the other to write output data. That second one will - * be merged at the end by the call to - * gimp_drawable_merge_shadow() */ - gimp_pixel_rgn_init (&rgn_in, - drawable, - x1, y1, - x2 - x1, y2 - y1, - FALSE, FALSE); - gimp_pixel_rgn_init (&rgn_out, - drawable, - x1, y1, - x2 - x1, y2 - y1, - TRUE, TRUE); - - for (i = x1; i < x2; i++) - { - for (j = y1; j < y2; j++) - { - guchar pixel[9][4]; - - /* Get nine pixels */ - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[0], - MAX (i - 1, x1), - MAX (j - 1, y1)); - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[1], - MAX (i - 1, x1), - j); - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[2], - MAX (i - 1, x1), - MIN (j + 1, y2 - 1)); - - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[3], - i, - MAX (j - 1, y1)); - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[4], - i, - j); - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[5], - i, - MIN (j + 1, y2 - 1)); - - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[6], - MIN (i + 1, x2 - 1), - MAX (j - 1, y1)); - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[7], - MIN (i + 1, x2 - 1), - j); - gimp_pixel_rgn_get_pixel (&rgn_in, - pixel[8], - MIN (i + 1, x2 - 1), - MIN (j + 1, y2 - 1)); - - /* For each layer, compute the average of the - * nine */ - for (k = 0; k < channels; k++) - { - int tmp, sum = 0; - for (tmp = 0; tmp < 9; tmp++) - sum += pixel[tmp][k]; - output[k] = sum / 9; - } - - gimp_pixel_rgn_set_pixel (&rgn_out, - output, - i, j); - } - - if (i % 10 == 0) - gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1)); - } - - /* Update the modified region */ - gimp_drawable_flush (drawable); - gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); - gimp_drawable_update (drawable->drawable_id, - x1, y1, - x2 - x1, y2 - y1); - } +static void +blur (GimpDrawable *drawable) +{ + gint i, j, k, channels; + gint x1, y1, x2, y2; + GimpPixelRgn rgn_in, rgn_out; + guchar output[4]; + + /* Gets upper left and lower right coordinates, + * and layers number in the image */ + gimp_drawable_mask_bounds (drawable->drawable_id, + &x1, &y1, + &x2, &y2); + channels = gimp_drawable_bpp (drawable->drawable_id); + + /* Initialises two PixelRgns, one to read original data, + * and the other to write output data. That second one will + * be merged at the end by the call to + * gimp_drawable_merge_shadow() */ + gimp_pixel_rgn_init (&rgn_in, + drawable, + x1, y1, + x2 - x1, y2 - y1, + FALSE, FALSE); + gimp_pixel_rgn_init (&rgn_out, + drawable, + x1, y1, + x2 - x1, y2 - y1, + TRUE, TRUE); + + for (i = x1; i < x2; i++) + { + for (j = y1; j < y2; j++) + { + guchar pixel[9][4]; + + /* Get nine pixels */ + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[0], + MAX (i - 1, x1), + MAX (j - 1, y1)); + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[1], + MAX (i - 1, x1), + j); + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[2], + MAX (i - 1, x1), + MIN (j + 1, y2 - 1)); + + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[3], + i, + MAX (j - 1, y1)); + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[4], + i, + j); + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[5], + i, + MIN (j + 1, y2 - 1)); + + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[6], + MIN (i + 1, x2 - 1), + MAX (j - 1, y1)); + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[7], + MIN (i + 1, x2 - 1), + j); + gimp_pixel_rgn_get_pixel (&rgn_in, + pixel[8], + MIN (i + 1, x2 - 1), + MIN (j + 1, y2 - 1)); + + /* For each layer, compute the average of the + * nine */ + for (k = 0; k < channels; k++) + { + int tmp, sum = 0; + for (tmp = 0; tmp < 9; tmp++) + sum += pixel[tmp][k]; + output[k] = sum / 9; + } + + gimp_pixel_rgn_set_pixel (&rgn_out, + output, + i, j); + } + + if (i % 10 == 0) + gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1)); + } + + /* Update the modified region */ + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + x1, y1, + x2 - x1, y2 - y1); +} ``` ## Row processing @@ -386,137 +351,122 @@ gimp_pixel_rgn_(get|set)_row() the result is far better. We reduce the timing for the 300x300 selection from 760 seconds to 6 seconds. blur() V2 is below: - - drawable_id, - &x1, &y1, - &x2, &y2); - channels = gimp_drawable_bpp (drawable->drawable_id); - - gimp_pixel_rgn_init (&rgn_in, - drawable, - x1, y1, - x2 - x1, y2 - y1, - FALSE, FALSE); - gimp_pixel_rgn_init (&rgn_out, - drawable, - x1, y1, - x2 - x1, y2 - y1, - TRUE, TRUE); - - /* Initialise enough memory for row1, row2, row3, outrow */ - row1 = g_new (guchar, channels * (x2 - x1)); - row2 = g_new (guchar, channels * (x2 - x1)); - row3 = g_new (guchar, channels * (x2 - x1)); - outrow = g_new (guchar, channels * (x2 - x1)); - - for (i = y1; i < y2; i++) - { - /* Get row i-1, i, i+1 */ - gimp_pixel_rgn_get_row (&rgn_in, - row1, - x1, MAX (y1, i - 1), - x2 - x1); - gimp_pixel_rgn_get_row (&rgn_in, - row2, - x1, i, - x2 - x1); - gimp_pixel_rgn_get_row (&rgn_in, - row3, - x1, MIN (y2 - 1, i + 1), - x2 - x1); - - for (j = x1; j < x2; j++) - { - /* For each layer, compute the average of the nine - * pixels */ - for (k = 0; k < channels; k++) - { - int sum = 0; - sum = row1[channels * MAX ((j - 1 - x1), 0) + k] + - row1[channels * (j - x1) + k] + - row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] + - row2[channels * MAX ((j - 1 - x1), 0) + k] + - row2[channels * (j - x1) + k] + - row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] + - row3[channels * MAX ((j - 1 - x1), 0) + k] + - row3[channels * (j - x1) + k] + - row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k]; - outrow[channels * (j - x1) + k] = sum / 9; - } - - } - - gimp_pixel_rgn_set_row (&rgn_out, - outrow, - x1, i, - x2 - x1); - - if (i % 10 == 0) - gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1)); - } +``` +static void +blur (GimpDrawable *drawable) +{ + gint i, j, k, channels; + gint x1, y1, x2, y2; + GimpPixelRgn rgn_in, rgn_out; + guchar *row1, *row2, *row3; + guchar *outrow; + + gimp_drawable_mask_bounds (drawable->drawable_id, + &x1, &y1, + &x2, &y2); + channels = gimp_drawable_bpp (drawable->drawable_id); + + gimp_pixel_rgn_init (&rgn_in, + drawable, + x1, y1, + x2 - x1, y2 - y1, + FALSE, FALSE); + gimp_pixel_rgn_init (&rgn_out, + drawable, + x1, y1, + x2 - x1, y2 - y1, + TRUE, TRUE); + + /* Initialise enough memory for row1, row2, row3, outrow */ + row1 = g_new (guchar, channels * (x2 - x1)); + row2 = g_new (guchar, channels * (x2 - x1)); + row3 = g_new (guchar, channels * (x2 - x1)); + outrow = g_new (guchar, channels * (x2 - x1)); + + for (i = y1; i < y2; i++) + { + /* Get row i-1, i, i+1 */ + gimp_pixel_rgn_get_row (&rgn_in, + row1, + x1, MAX (y1, i - 1), + x2 - x1); + gimp_pixel_rgn_get_row (&rgn_in, + row2, + x1, i, + x2 - x1); + gimp_pixel_rgn_get_row (&rgn_in, + row3, + x1, MIN (y2 - 1, i + 1), + x2 - x1); + + for (j = x1; j < x2; j++) + { + /* For each layer, compute the average of the nine + * pixels */ + for (k = 0; k < channels; k++) + { + int sum = 0; + sum = row1[channels * MAX ((j - 1 - x1), 0) + k] + + row1[channels * (j - x1) + k] + + row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] + + row2[channels * MAX ((j - 1 - x1), 0) + k] + + row2[channels * (j - x1) + k] + + row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] + + row3[channels * MAX ((j - 1 - x1), 0) + k] + + row3[channels * (j - x1) + k] + + row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k]; + outrow[channels * (j - x1) + k] = sum / 9; + } + + } + + gimp_pixel_rgn_set_row (&rgn_out, + outrow, + x1, i, + x2 - x1); + + if (i % 10 == 0) + gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1)); + } + + g_free (row1); + g_free (row2); + g_free (row3); + g_free (outrow); + + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + x1, y1, + x2 - x1, y2 - y1); +} +``` + +Have a look at the [slow](myblur1.c) or [fast](myblur2.c) blur complete code. + +## Next part + +In [next part](writing-a-plug-in/3), +we will see how to process the image tile by tile. We will also +have a look at preferences, by modifying our algorithm so it can +take an input parameter. + + + + + + + + + +Creative Commons License + + + + +This work is licensed under a Creative +Commons Attribution-NonCommercial-ShareAlike 2.5 +License. - g_free (row1); - g_free (row2); - g_free (row3); - g_free (outrow); - - gimp_drawable_flush (drawable); - gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); - gimp_drawable_update (drawable->drawable_id, - x1, y1, - x2 - x1, y2 - y1); - } - ]]> - - - - Have a look at the slow or - fast blur complete code. - -
- -
- Next part - - - In next part, - we will see how to process the image tile by tile. We will also - have a look at preferences, by modifying our algorithm so it can - take an input parameter. - -
- -
- - - - - - - - Creative Commons License - - - - - - - This work is licensed under a Creative - Commons Attribution-NonCommercial-ShareAlike 2.5 - License. - -
- -
diff --git a/content/writing-a-plug-in/3.md b/content/writing-a-plug-in/3.md index 620bb43..233d834 100644 --- a/content/writing-a-plug-in/3.md +++ b/content/writing-a-plug-in/3.md @@ -1,895 +1,747 @@ ---- -title: "How to write a GIMP plug-in, part III" -abbrev: "Part III" -description: "Write your own" ---- - -Written By Dave Neary - - In the second - part, I told you about manipulating image data by pixel or - row. This time, I will go farther and process data by tile, which - will improve our plug-in performance. I will also update our - algorithm to take larger radius into account, and build a - graphical interface to allow changing that parameter. -
- -
- Introduction - - - Let's have a look at our simple algorithm: for each pixel, - generate a (2r+1)x(2r+1) neighbourhood and for each layer, - replace the layer's pixel value with the average value in the - neighbourhood. - - - - It's a bit more complex than that - we have to be careful near - image borders for example, but this algorithm makes a blur - effect that is not so bad in general. - - - - But until now, we wrote the algorithm for a 3x3 neighbourhood. - Time has come to generalise this part and to introduce the - radius as a parameter. - - - - First, a word on tiles. - -
- -
- Tile management - - - A tile is an image data block with a 64x64 size. Usually, tiles - are sent to the plug-in on demand one by one, by shared memory. - Of course this process needs huge resources and should be - avoided. - - - - Usually, one doesn't need any particular cache, each tile is - sent when one needs it and freed when one asks for another one. - Nevertheless, we can tell our plug-in to keep a tile cache to - avoid this constant round trip, by calling the function: - - - - - - - - In the second part example, we called gimp_pixel_rgn_get_row() - and gimp_pixel_rgn_set_row() but without using any cache. - - - - The number of tiles in a tile row will be the layer width - divided by the tile width, plus one. So, for a layer width of - 65, we will cache two tiles. As we usually also process shadow - tiles, we can double that number to compute the ideal cache size - for our plug-in. - - - - width / - gimp_tile_width () + 1)); - ]]> - - - - With the cache, our slow plug-in becomes fast. On a 300x300 - selection, our last blur took 3 seconds, but on a 2000x1500 - selection it was much slower - 142 seconds. - - - - Adding the above line of code, things are getting better: 11 - seconds. We still lose transition time when we reach tile - borders, we can go down to 10 seconds when multiplying by 4 - instead of 2 (meaning we cache two tiles rows), but the more - tiles we cache, the more hard disk access we make, which reduce - the time gain at a point. - -
- -
- Algorithm generalisation - - - We can modify the algorithm to take a parameter into account: - radius. With a radius of 3, the neighbourhood of a pixel will be - 7x7, instead of 3x3 with a radius of 1. To achieve this I modify - the previous algorithm: - - allocate space for 2r+1 tile rows - initialise this rows array, taking care of - borders - for each tile row - - for each pixel in the tile row - - compute the neighbourhood average, taking - care of borders - - - get a new tile row and cycle rows - - - - - - - This algorithm is more complex than the last one, because the - average computing will be a O(r²) algorithm. - - - - The modified code to get this behaviour is below. Most of the - work is done in the process_row function. init_mem and shuffle - are there to keep the blur code clean and small. - ++++ +title = "How to write a GIMP plug-in, part III" +abbrev = "Part III" +description = "Write your own" +date = "2022-07-23" +author = "Dave Neary" ++++ + +Written By [Dave Neary](mailto:bolsh@NOSPAM.gimp.org). + +In the [second part](writing-a-plug-in/2), +I told you about manipulating image data by pixel or +row. This time, I will go farther and process data by tile, which +will improve our plug-in performance. I will also update our +algorithm to take larger radius into account, and build a +graphical interface to allow changing that parameter. + +## Introduction + +Let's have a look at our simple algorithm: for each pixel, +generate a `(2r+1)x(2r+1)` neighbourhood and for each layer, +replace the layer's pixel value with the average value in the +neighbourhood. + +It's a bit more complex than that - we have to be careful near +image borders for example, but this algorithm makes a blur +effect that is not so bad in general. + +But until now, we wrote the algorithm for a 3x3 neighbourhood. +Time has come to generalise this part and to introduce the +radius as a parameter. + +First, a word on tiles. + +## Tile management + +A tile is an image data block with a 64x64 size. Usually, tiles +are sent to the plug-in on demand one by one, by shared memory. +Of course this process needs huge resources and should be +avoided. + +Usually, one doesn't need any particular cache, each tile is +sent when one needs it and freed when one asks for another one. +Nevertheless, we can tell our plug-in to keep a tile cache to +avoid this constant round trip, by calling the function: ``` - drawable_id, - &x1, &y1, - &x2, &y2); - width = x2 - x1; - height = y2 - y1; - - channels = gimp_drawable_bpp (drawable->drawable_id); - - /* Allocate a big enough tile cache */ - gimp_tile_cache_ntiles (2 * (drawable->width / - gimp_tile_width () + 1)); - - /* Initialises two PixelRgns, one to read original data, - * and the other to write output data. That second one will - * be merged at the end by the call to - * gimp_drawable_merge_shadow() */ - gimp_pixel_rgn_init (&rgn_in, - drawable, - x1, y1, - width, height, - FALSE, FALSE); - gimp_pixel_rgn_init (&rgn_out, - drawable, - x1, y1, - width, height, - TRUE, TRUE); - - /* Allocate memory for input and output tile rows */ - init_mem (&row, &outrow, width * channels); - - for (ii = -radius; ii <= radius; ii++) - { - gimp_pixel_rgn_get_row (&rgn_in, - row[radius + ii], - x1, y1 + CLAMP (ii, 0, height - 1), - width); - } - - for (i = 0; i < height; i++) - { - /* To be done for each tile row */ - process_row (row, - outrow, - x1, y1, - width, height, - channels, - i); - gimp_pixel_rgn_set_row (&rgn_out, - outrow, - x1, i + y1, - width); - /* shift tile rows to insert the new one at the end */ - shuffle (&rgn_in, - row, - x1, y1, - width, height, - i); - if (i % 10 == 0) - gimp_progress_update ((gdouble) i / (gdouble) height); - } - - /* We could also put that in a separate function but it's - * rather simple */ - for (ii = 0; ii < 2 * radius + 1; ii++) - g_free (row[ii]); - - g_free (row); - g_free (outrow); - - /* Update the modified region */ - gimp_drawable_flush (drawable); - gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); - gimp_drawable_update (drawable->drawable_id, - x1, y1, - width, height); - } - - static void - init_mem (guchar ***row, - guchar **outrow, - gint num_bytes) - { - gint i; - - /* Allocate enough memory for row and outrow */ - *row = g_new (char *, (2 * radius + 1)); - - for (i = -radius; i <= radius; i++) - (*row)[i + radius] = g_new (guchar, num_bytes); - - *outrow = g_new (guchar, num_bytes); - } - - static void - process_row (guchar **row, - guchar *outrow, - gint x1, - gint y1, - gint width, - gint height, - gint channels, - gint i) - { - gint j; - - for (j = 0; j < width; j++) - { - gint k, ii, jj; - gint left = (j - radius), - right = (j + radius); - - /* For each layer, compute the average of the - * (2r+1)x(2r+1) pixels */ - for (k = 0; k < channels; k++) - { - gint sum = 0; - - for (ii = 0; ii < 2 * radius + 1; ii++) - for (jj = left; jj <= right; jj++) - sum += row[ii][channels * CLAMP (jj, 0, width - 1) + k]; - - outrow[channels * j + k] = - sum / (4 * radius * radius + 4 * radius + 1); - } - } - } - - static void - shuffle (GimpPixelRgn *rgn_in, - guchar **row, - gint x1, - gint y1, - gint width, - gint height, - gint ypos) - { - gint i; - guchar *tmp_row; - - /* Get tile row (i + radius + 1) into row[0] */ - gimp_pixel_rgn_get_row (rgn_in, - row[0], - x1, MIN (ypos + radius + y1, y1 + height - 1), - width); - - /* Permute row[i] with row[i-1] and row[0] with row[2r] */ - tmp_row = row[0]; - for (i = 1; i < 2 * radius + 1; i++) - row[i - 1] = row[i]; - row[2 * radius] = tmp_row; - } - ]]> - -
- -
- Adding a graphical interface and saving parameters - - - To let the user modify the radius, or let a non-interactive - script give it as a parameter, we now need to get back to our - run() function and settle some simple things. - - - - First we create a structure to allow saving and returning - options. Usually one does this even for plug-ins with only one - parameter. - - - - - - - - Next, we modify the run() function so that execution modes are - taken into account. In interactive mode and repeat last filter - mode, we try to get the last values used by the gimp_get_data() - function, which takes a unique data identifier as its first - input parameter. Usually, one uses the procedure's name. - - - - Finally, in interactive mode, we add a few lines that will build - the graphical interface allowing options modification. - - - - - -
- -
- The graphical interface - - - I won't detail GTK+ programming as this is done very well in - other places. Our first try will be very simple. We will use the - utility widget of GIMP, the GimpDialog, to create a window with - a header, a numeric control of type GtkSpinButton (associated - with a GtkAdjustment) and its label, nicely framed in a - GtkFrame. - - - - In the following parts, in order to show how easy one can do - such things, I will add a preview in the dialog to show real - time effects of the parameters. - - - - Our final dialog will look like this (tree generated with - Glade): - - - - - - - - - - Glade tree - - - Glade tree - - - - - In The GIMP 2.2, there is a number of widgets that come bundled - with parameters that allow a coherent behaviour, consistent with - GNOME Human Interface Guidelines. GimpPreview also appeared in - 2.2. Let's make a first try without it: - - - - - - - - - Blur dialog - - - - - - vbox), main_vbox); - gtk_widget_show (main_vbox); - - frame = gtk_frame_new (NULL); - gtk_widget_show (frame); - gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (frame), 6); - - alignment = gtk_alignment_new (0.5, 0.5, 1, 1); - gtk_widget_show (alignment); - gtk_container_add (GTK_CONTAINER (frame), alignment); - gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6); - - main_hbox = gtk_hbox_new (FALSE, 0); - gtk_widget_show (main_hbox); - gtk_container_add (GTK_CONTAINER (alignment), main_hbox); - - radius_label = gtk_label_new_with_mnemonic ("_Radius:"); - gtk_widget_show (radius_label); - gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6); - gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT); - - spinbutton_adj = gtk_adjustment_new (3, 1, 16, 1, 5, 5); - spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); - gtk_widget_show (spinbutton); - gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 6); - gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); - - frame_label = gtk_label_new ("Modify radius"); - gtk_widget_show (frame_label); - gtk_frame_set_label_widget (GTK_FRAME (frame), frame_label); - gtk_label_set_use_markup (GTK_LABEL (frame_label), TRUE); - - g_signal_connect (spinbutton_adj, "value_changed", - G_CALLBACK (gimp_int_adjustment_update), - &bvals.radius); - gtk_widget_show (dialog); - - run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); - - gtk_widget_destroy (dialog); - - return run; - } - ]]> - -
- -
- Adding a GimpPreview - - - Adding a GimpPreview is quite easy. First we create a GtkWidget - with gimp_drawable_preview_new(), then we attach an invalidated - signal to it, which will call the blur function to update the - preview. We also add a second parameter to MyBlurVals to - remember the activation state of the preview. - - - - A method to update easily the preview is to add a preview - parameter in the blur function, and if preview is not NULL, to - take GimpPreview limits. So when we call blur from run(), we set - the preview parameter to NULL. - - - - To take GimpPreview limits, we use gimp_preview_get_position() - and gimp_preview_get_size(), so we can generate only what will - be displayed. - - - - To achieve this the right way we'll tune some of the code - we - don't need to update the progress bar while generating the - preview, and we should tell at GimpPixelRgn init time that the - tiles should not be sent back to the core. - - - - Finally, we display the updated preview with the - gimp_drawable_preview_draw_region() function. We get a dialog - box that shows us in real time the plug-in effects. Moreover, - thanks to the GIMP core, our plug-in already takes selections - into account. - - - - - - - - - - Blur dialog, improved - - - Blur dialog, improved - - - - - - - - - - - Blur a selection - - - Blur a selection - - - - - Here are the two functions in their last version: - - - - width / + gimp_tile_width () + 1)); +``` + +With the cache, our slow plug-in becomes fast. On a 300x300 +selection, our last blur took 3 seconds, but on a 2000x1500 +selection it was much slower - 142 seconds. + +Adding the above line of code, things are getting better: 11 +seconds. We still lose transition time when we reach tile +borders, we can go down to 10 seconds when multiplying by 4 +instead of 2 (meaning we cache two tiles rows), but the more +tiles we cache, the more hard disk access we make, which reduce +the time gain at a point. + +## Algorithm generalisation + +We can modify the algorithm to take a parameter into account: +radius. With a radius of 3, the neighbourhood of a pixel will be +7x7, instead of 3x3 with a radius of 1. To achieve this I modify +the previous algorithm: + +* allocate space for 2r+1 tile rows +* initialise this rows array, taking care of borders +* for each tile row + * for each pixel in the tile row + * compute the neighbourhood average, taking care of borders +* get a new tile row and cycle rows + +This algorithm is more complex than the last one, because the +average computing will be a O(r²) algorithm. + +The modified code to get this behaviour is below. Most of the +work is done in the process_row function. init_mem and shuffle +are there to keep the blur code clean and small. + +``` +static void blur (GimpDrawable *drawable); + +static void init_mem (guchar ***row, + guchar **outrow, + gint num_bytes); +static void process_row (guchar **row, + guchar *outrow, + gint x1, + gint y1, + gint width, + gint height, + gint channels, + gint i); +static void shuffle (GimpPixelRgn *rgn_in, + guchar **row, + gint x1, + gint y1, + gint width, + gint height, + gint ypos); + +/* The radius is still a constant, we'll change that when the + * graphical interface will be built. */ +static gint radius = 3; +... + +static void +blur (GimpDrawable *drawable) +{ + gint i, ii, channels; + gint x1, y1, x2, y2; + GimpPixelRgn rgn_in, rgn_out; + guchar **row; + guchar *outrow; + gint width, height; + + gimp_progress_init ("My Blur..."); + + /* Gets upper left and lower right coordinates, + * and layers number in the image */ + gimp_drawable_mask_bounds (drawable->drawable_id, + &x1, &y1, + &x2, &y2); + width = x2 - x1; + height = y2 - y1; + + channels = gimp_drawable_bpp (drawable->drawable_id); + + /* Allocate a big enough tile cache */ + gimp_tile_cache_ntiles (2 * (drawable->width / + gimp_tile_width () + 1)); + + /* Initialises two PixelRgns, one to read original data, + * and the other to write output data. That second one will + * be merged at the end by the call to + * gimp_drawable_merge_shadow() */ + gimp_pixel_rgn_init (&rgn_in, + drawable, + x1, y1, + width, height, + FALSE, FALSE); + gimp_pixel_rgn_init (&rgn_out, + drawable, + x1, y1, + width, height, + TRUE, TRUE); + + /* Allocate memory for input and output tile rows */ + init_mem (&row, &outrow, width * channels); + + for (ii = -radius; ii <= radius; ii++) + { + gimp_pixel_rgn_get_row (&rgn_in, + row[radius + ii], + x1, y1 + CLAMP (ii, 0, height - 1), + width); + } + + for (i = 0; i < height; i++) + { + /* To be done for each tile row */ + process_row (row, + outrow, + x1, y1, + width, height, + channels, + i); + gimp_pixel_rgn_set_row (&rgn_out, + outrow, + x1, i + y1, + width); + /* shift tile rows to insert the new one at the end */ + shuffle (&rgn_in, + row, + x1, y1, + width, height, + i); + if (i % 10 == 0) + gimp_progress_update ((gdouble) i / (gdouble) height); + } + + /* We could also put that in a separate function but it's + * rather simple */ + for (ii = 0; ii < 2 * radius + 1; ii++) + g_free (row[ii]); + + g_free (row); + g_free (outrow); + + /* Update the modified region */ + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + x1, y1, + width, height); +} + +static void +init_mem (guchar ***row, + guchar **outrow, + gint num_bytes) +{ + gint i; + + /* Allocate enough memory for row and outrow */ + *row = g_new (char *, (2 * radius + 1)); + + for (i = -radius; i <= radius; i++) + (*row)[i + radius] = g_new (guchar, num_bytes); + + *outrow = g_new (guchar, num_bytes); +} + +static void +process_row (guchar **row, + guchar *outrow, + gint x1, + gint y1, + gint width, + gint height, + gint channels, + gint i) +{ + gint j; + + for (j = 0; j < width; j++) + { + gint k, ii, jj; + gint left = (j - radius), + right = (j + radius); + + /* For each layer, compute the average of the + * (2r+1)x(2r+1) pixels */ + for (k = 0; k < channels; k++) { - gimp_drawable_mask_bounds (drawable->drawable_id, - &x1, &y1, - &x2, &y2); - width = x2 - x1; - height = y2 - y1; + gint sum = 0; + + for (ii = 0; ii < 2 * radius + 1; ii++) + for (jj = left; jj <= right; jj++) + sum += row[ii][channels * CLAMP (jj, 0, width - 1) + k]; + + outrow[channels * j + k] = + sum / (4 * radius * radius + 4 * radius + 1); } + } +} + +static void +shuffle (GimpPixelRgn *rgn_in, + guchar **row, + gint x1, + gint y1, + gint width, + gint height, + gint ypos) +{ + gint i; + guchar *tmp_row; + + /* Get tile row (i + radius + 1) into row[0] */ + gimp_pixel_rgn_get_row (rgn_in, + row[0], + x1, MIN (ypos + radius + y1, y1 + height - 1), + width); + + /* Permute row[i] with row[i-1] and row[0] with row[2r] */ + tmp_row = row[0]; + for (i = 1; i < 2 * radius + 1; i++) + row[i - 1] = row[i]; + row[2 * radius] = tmp_row; +} +``` + +## Adding a graphical interface and saving parameters + +To let the user modify the radius, or let a non-interactive +script give it as a parameter, we now need to get back to our +run() function and settle some simple things. + +First we create a structure to allow saving and returning +options. Usually one does this even for plug-ins with only one +parameter. + +``` +typedef struct +{ + gint radius; +} MyBlurVals; + + +/* Set up default values for options */ +static MyBlurVals bvals = +{ + 3 /* radius */ +}; +``` + +Next, we modify the run() function so that execution modes are +taken into account. In interactive mode and repeat last filter +mode, we try to get the last values used by the gimp_get_data() +function, which takes a unique data identifier as its first +input parameter. Usually, one uses the procedure's name. + +Finally, in interactive mode, we add a few lines that will build +the graphical interface allowing options modification. + + +``` +static void +run (const gchar *name, + gint nparams, + const GimpParam *param, + gint *nreturn_vals, + GimpParam **return_vals) +{ + static GimpParam values[1]; + GimpPDBStatusType status = GIMP_PDB_SUCCESS; + GimpRunMode run_mode; + GimpDrawable *drawable; + + /* Setting mandatory output values */ + *nreturn_vals = 1; + *return_vals = values; + + values[0].type = GIMP_PDB_STATUS; + values[0].data.d_status = status; + + /* Getting run_mode - we won't display a dialog if + * we are in NONINTERACTIVE mode */ + run_mode = param[0].data.d_int32; + + /* Get the specified drawable */ + drawable = gimp_drawable_get (param[2].data.d_drawable); + + switch (run_mode) + { + case GIMP_RUN_INTERACTIVE: + /* Get options last values if needed */ + gimp_get_data ("plug-in-myblur", &bvals); + + /* Display the dialog */ + if (! blur_dialog (drawable)) + return; + break; + + case GIMP_RUN_NONINTERACTIVE: + if (nparams != 4) + status = GIMP_PDB_CALLING_ERROR; + if (status == GIMP_PDB_SUCCESS) + bvals.radius = param[3].data.d_int32; + break; + + case GIMP_RUN_WITH_LAST_VALS: + /* Get options last values if needed */ + gimp_get_data ("plug-in-myblur", &bvals); + break; + + default: + break; + } + + blur (drawable); + + gimp_displays_flush (); + gimp_drawable_detach (drawable); + + /* Finally, set options in the core */ + if (run_mode == GIMP_RUN_INTERACTIVE) + gimp_set_data ("plug-in-myblur", &bvals, sizeof (MyBlurVals)); + + return; +} +``` + +## The graphical interface + +I won't detail GTK+ programming as this is done very well in +other places. Our first try will be very simple. We will use the +utility widget of GIMP, the GimpDialog, to create a window with +a header, a numeric control of type GtkSpinButton (associated +with a GtkAdjustment) and its label, nicely framed in a +GtkFrame. + +In the following parts, in order to show how easy one can do +such things, I will add a preview in the dialog to show real +time effects of the parameters. + +Our final dialog will look like this (tree generated with +Glade): + +glade-tree.png +glade-tree-small.png +Glade tree + +In The GIMP 2.2, there is a number of widgets that come bundled +with parameters that allow a coherent behaviour, consistent with +GNOME Human Interface Guidelines. GimpPreview also appeared in +2.2. Let's make a first try without it: + +blur_dialog1.png +Blur dialog + +``` +static gboolean +blur_dialog (GimpDrawable *drawable) +{ + GtkWidget *dialog; + GtkWidget *main_vbox; + GtkWidget *main_hbox; + GtkWidget *frame; + GtkWidget *radius_label; + GtkWidget *alignment; + GtkWidget *spinbutton; + GtkObject *spinbutton_adj; + GtkWidget *frame_label; + gboolean run; + + gimp_ui_init ("myblur", FALSE); + + dialog = gimp_dialog_new ("My blur", "myblur", + NULL, 0, + gimp_standard_help_func, "plug-in-myblur", + + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + + NULL); + + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox); + gtk_widget_show (main_vbox); + + frame = gtk_frame_new (NULL); + gtk_widget_show (frame); + gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (frame), 6); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6); + + main_hbox = gtk_hbox_new (FALSE, 0); + gtk_widget_show (main_hbox); + gtk_container_add (GTK_CONTAINER (alignment), main_hbox); + + radius_label = gtk_label_new_with_mnemonic ("_Radius:"); + gtk_widget_show (radius_label); + gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6); + gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT); + + spinbutton_adj = gtk_adjustment_new (3, 1, 16, 1, 5, 5); + spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0); + gtk_widget_show (spinbutton); + gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 6); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE); + + frame_label = gtk_label_new ("Modify radius"); + gtk_widget_show (frame_label); + gtk_frame_set_label_widget (GTK_FRAME (frame), frame_label); + gtk_label_set_use_markup (GTK_LABEL (frame_label), TRUE); + + g_signal_connect (spinbutton_adj, "value_changed", + G_CALLBACK (gimp_int_adjustment_update), + &bvals.radius); + gtk_widget_show (dialog); + + run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); + + gtk_widget_destroy (dialog); + + return run; +} +``` + +## Adding a GimpPreview + +Adding a GimpPreview is quite easy. First we create a GtkWidget +with `gimp_drawable_preview_new()`, then we attach an invalidated +signal to it, which will call the blur function to update the +preview. We also add a second parameter to MyBlurVals to +remember the activation state of the preview. + +A method to update easily the preview is to add a preview +parameter in the blur function, and if preview is not NULL, to +take GimpPreview limits. So when we call blur from run(), we set +the preview parameter to NULL. + +To take GimpPreview limits, we use gimp_preview_get_position() +and `gimp_preview_get_size()`, so we can generate only what will +be displayed. + +To achieve this the right way we'll tune some of the code - we +don't need to update the progress bar while generating the +preview, and we should tell at GimpPixelRgn init time that the +tiles should not be sent back to the core. + +Finally, we display the updated preview with the +gimp_drawable_preview_draw_region() function. We get a dialog +box that shows us in real time the plug-in effects. Moreover, +thanks to the GIMP core, our plug-in already takes selections +into account. + + + +Blur dialog, improved + + + +Blur a selection + +Here are the two functions in their last version: + +``` +static void +blur (GimpDrawable *drawable, + GimpPreview *preview) +{ + gint i, ii, channels; + gint x1, y1, x2, y2; + GimpPixelRgn rgn_in, rgn_out; + guchar **row; + guchar *outrow; + gint width, height; + + if (!preview) + gimp_progress_init ("My Blur..."); + + /* Gets upper left and lower right coordinates, + * and layers number in the image */ + if (preview) + { + gimp_preview_get_position (preview, &x1, &y1); + gimp_preview_get_size (preview, &width, &height); + x2 = x1 + width; + y2 = y1 + height; + } + else + { + gimp_drawable_mask_bounds (drawable->drawable_id, + &x1, &y1, + &x2, &y2); + width = x2 - x1; + height = y2 - y1; + } + + channels = gimp_drawable_bpp (drawable->drawable_id); + + /* Allocate a big enough tile cache */ + gimp_tile_cache_ntiles (2 * (drawable->width / + gimp_tile_width () + 1)); + + /* Initialises two PixelRgns, one to read original data, + * and the other to write output data. That second one will + * be merged at the end by the call to + * gimp_drawable_merge_shadow() */ + gimp_pixel_rgn_init (&rgn_in, + drawable, + x1, y1, + width, height, + FALSE, FALSE); + gimp_pixel_rgn_init (&rgn_out, + drawable, + x1, y1, + width, height, + preview == NULL, TRUE); + + /* Allocate memory for input and output tile rows */ + init_mem (&row, &outrow, width * channels); + + for (ii = -bvals.radius; ii <= bvals.radius; ii++) + { + gimp_pixel_rgn_get_row (&rgn_in, + row[bvals.radius + ii], + x1, y1 + CLAMP (ii, 0, height - 1), + width); + } + + for (i = 0; i < height; i++) + { + /* To be done for each tile row */ + process_row (row, + outrow, + x1, y1, + width, height, + channels, + i); + gimp_pixel_rgn_set_row (&rgn_out, + outrow, + x1, i + y1, + width); + /* shift tile rows to insert the new one at the end */ + shuffle (&rgn_in, + row, + x1, y1, + width, height, + i); + if (i % 10 == 0 && !preview) + gimp_progress_update ((gdouble) i / (gdouble) height); + } + + for (ii = 0; ii < 2 * bvals.radius + 1; ii++) + g_free (row[ii]); + + g_free (row); + g_free (outrow); + + /* Update the modified region */ + if (preview) + { + gimp_drawable_preview_draw_region (GIMP_DRAWABLE_PREVIEW (preview), + &rgn_out); + } + else + { + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + x1, y1, + width, height); + } +} + +static gboolean +blur_dialog (GimpDrawable *drawable) +{ + GtkWidget *dialog; + GtkWidget *main_vbox; + GtkWidget *main_hbox; + GtkWidget *preview; + GtkWidget *frame; + GtkWidget *radius_label; + GtkWidget *alignment; + GtkWidget *spinbutton; + GtkObject *spinbutton_adj; + GtkWidget *frame_label; + gboolean run; + + gimp_ui_init ("myblur", FALSE); + + dialog = gimp_dialog_new ("My blur", "myblur", + NULL, 0, + gimp_standard_help_func, "plug-in-myblur", + + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + + NULL); + + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox); + gtk_widget_show (main_vbox); + + preview = gimp_drawable_preview_new (drawable, &bvals.preview); + gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0); + gtk_widget_show (preview); + + frame = gimp_frame_new ("Blur radius"); + gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6); + + main_hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12); + gtk_widget_show (main_hbox); + gtk_container_add (GTK_CONTAINER (alignment), main_hbox); + + radius_label = gtk_label_new_with_mnemonic ("_Radius:"); + gtk_widget_show (radius_label); + gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6); + gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT); + + spinbutton = gimp_spin_button_new (&spinbutton_adj, bvals.radius, + 1, 32, 1, 1, 1, 5, 0); + gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 0); + gtk_widget_show (spinbutton); + + g_signal_connect_swapped (preview, "invalidated", + G_CALLBACK (blur), + drawable); + g_signal_connect_swapped (spinbutton_adj, "value_changed", + G_CALLBACK (gimp_preview_invalidate), + preview); + + blur (drawable, GIMP_PREVIEW (preview)); + + g_signal_connect (spinbutton_adj, "value_changed", + G_CALLBACK (gimp_int_adjustment_update), + &bvals.radius); + gtk_widget_show (dialog); + + run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); + + gtk_widget_destroy (dialog); + + return run; +} +``` + +Have a look at the tiled, +UI or +preview blur complete code. + +## Conclusion + +In these articles, we saw basic concepts for several aspects of +a GIMP plug-in. We messed with image data treatment through a +simple algorithm, and followed a path that showed us how to +avoid performance problems. Finally, we generalised the +algorithm and added parameters to it, and we used some GIMP +widgets to make a nice user interface. + +## Thanks + +Thanks to my wife Anne and to David Odin (preview master) for +helping me while I was writing this article. + + + +Creative Commons License - channels = gimp_drawable_bpp (drawable->drawable_id); - - /* Allocate a big enough tile cache */ - gimp_tile_cache_ntiles (2 * (drawable->width / - gimp_tile_width () + 1)); - - /* Initialises two PixelRgns, one to read original data, - * and the other to write output data. That second one will - * be merged at the end by the call to - * gimp_drawable_merge_shadow() */ - gimp_pixel_rgn_init (&rgn_in, - drawable, - x1, y1, - width, height, - FALSE, FALSE); - gimp_pixel_rgn_init (&rgn_out, - drawable, - x1, y1, - width, height, - preview == NULL, TRUE); - - /* Allocate memory for input and output tile rows */ - init_mem (&row, &outrow, width * channels); - - for (ii = -bvals.radius; ii <= bvals.radius; ii++) - { - gimp_pixel_rgn_get_row (&rgn_in, - row[bvals.radius + ii], - x1, y1 + CLAMP (ii, 0, height - 1), - width); - } - - for (i = 0; i < height; i++) - { - /* To be done for each tile row */ - process_row (row, - outrow, - x1, y1, - width, height, - channels, - i); - gimp_pixel_rgn_set_row (&rgn_out, - outrow, - x1, i + y1, - width); - /* shift tile rows to insert the new one at the end */ - shuffle (&rgn_in, - row, - x1, y1, - width, height, - i); - if (i % 10 == 0 && !preview) - gimp_progress_update ((gdouble) i / (gdouble) height); - } - - for (ii = 0; ii < 2 * bvals.radius + 1; ii++) - g_free (row[ii]); - - g_free (row); - g_free (outrow); - - /* Update the modified region */ - if (preview) - { - gimp_drawable_preview_draw_region (GIMP_DRAWABLE_PREVIEW (preview), - &rgn_out); - } - else - { - gimp_drawable_flush (drawable); - gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); - gimp_drawable_update (drawable->drawable_id, - x1, y1, - width, height); - } - } - - static gboolean - blur_dialog (GimpDrawable *drawable) - { - GtkWidget *dialog; - GtkWidget *main_vbox; - GtkWidget *main_hbox; - GtkWidget *preview; - GtkWidget *frame; - GtkWidget *radius_label; - GtkWidget *alignment; - GtkWidget *spinbutton; - GtkObject *spinbutton_adj; - GtkWidget *frame_label; - gboolean run; - - gimp_ui_init ("myblur", FALSE); - - dialog = gimp_dialog_new ("My blur", "myblur", - NULL, 0, - gimp_standard_help_func, "plug-in-myblur", - - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - - NULL); - - main_vbox = gtk_vbox_new (FALSE, 6); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox); - gtk_widget_show (main_vbox); - - preview = gimp_drawable_preview_new (drawable, &bvals.preview); - gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0); - gtk_widget_show (preview); - - frame = gimp_frame_new ("Blur radius"); - gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); - gtk_widget_show (frame); - - alignment = gtk_alignment_new (0.5, 0.5, 1, 1); - gtk_widget_show (alignment); - gtk_container_add (GTK_CONTAINER (frame), alignment); - gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6); - - main_hbox = gtk_hbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12); - gtk_widget_show (main_hbox); - gtk_container_add (GTK_CONTAINER (alignment), main_hbox); - - radius_label = gtk_label_new_with_mnemonic ("_Radius:"); - gtk_widget_show (radius_label); - gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6); - gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT); - - spinbutton = gimp_spin_button_new (&spinbutton_adj, bvals.radius, - 1, 32, 1, 1, 1, 5, 0); - gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 0); - gtk_widget_show (spinbutton); - - g_signal_connect_swapped (preview, "invalidated", - G_CALLBACK (blur), - drawable); - g_signal_connect_swapped (spinbutton_adj, "value_changed", - G_CALLBACK (gimp_preview_invalidate), - preview); - - blur (drawable, GIMP_PREVIEW (preview)); - - g_signal_connect (spinbutton_adj, "value_changed", - G_CALLBACK (gimp_int_adjustment_update), - &bvals.radius); - gtk_widget_show (dialog); - - run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); - - gtk_widget_destroy (dialog); - - return run; - } - ]]> - - - - Have a look at the tiled, - UI or - preview blur complete code. - -
- -
- Conclusion - - - In these articles, we saw basic concepts for several aspects of - a GIMP plug-in. We messed with image data treatment through a - simple algorithm, and followed a path that showed us how to - avoid performance problems. Finally, we generalised the - algorithm and added parameters to it, and we used some GIMP - widgets to make a nice user interface. - -
- -
- Thanks - - - Thanks to my wife Anne and to David Odin (preview master) for - helping me while I was writing this article. - -
- -
- - - - - - - - Creative Commons License - - - - - - - This work is licensed under a Creative - Commons Attribution-NonCommercial-ShareAlike 2.5 - License. - -
+This work is licensed under a Creative +Commons Attribution-NonCommercial-ShareAlike 2.5 +License. diff --git a/public/index.xml b/public/index.xml index c3dbbb4..76dda6b 100644 --- a/public/index.xml +++ b/public/index.xml @@ -8,6 +8,17 @@ en Copyright 2003-2022 The GIMP Development Team Tue, 19 Jul 2022 00:00:00 +0000 + + How to write a GIMP plug-in, part III + https://developer.gimp.org/writing-a-plug-in/3/ + Sat, 23 Jul 2022 00:00:00 +0000 + + https://developer.gimp.org/writing-a-plug-in/3/ + Written By Dave Neary. +In the second part, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. +Introduction Let&rsquo;s have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer&rsquo;s pixel value with the average value in the neighbourhood. + + Frequently Asked Questions https://developer.gimp.org/faq.html @@ -131,10 +142,9 @@ Below is a list of links to get you started with Gitlab: Mon, 01 Jan 0001 00:00:00 +0000 https://developer.gimp.org/writing-a-plug-in/1/ - Written By Dave Neary + Written By Dave Neary. In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors. -In this part, I present a plug-in&rsquo;s basic elements. We will see how to install a plug-in and how to get data from an image and directly manipulate it. -Architecture &lt;para role=&quot;images&quot;&gt; &lt;ulink url=&quot;architecture.png&quot;&gt; &lt;mediaobject&gt; &lt;imageobject&gt; &lt;imagedata fileref=&quot;architecture-small. +Introduction New developers are often intimidated by The GIMP size and its reputation. They think that writing a plug-in would be a difficult task. The goal of these articles is to dumb this feeling down, by showing how easily one can make a C plug-in. @@ -143,22 +153,12 @@ Architecture &lt;para role=&quot;images&quot;&gt; &lt;ulink Mon, 01 Jan 0001 00:00:00 +0000 https://developer.gimp.org/writing-a-plug-in/2/ - Written By Dave Neary + Written By Dave Neary. In the first part, I presented essential elements to build a plug-in interface with The GIMP. Now we will produce a simple but useful algorithm that we could use in our plug-in. Introduction The algorithm we are going to implement is a simple blur. It is included in The GIMP as &ldquo;Filters-&gt;Blur-&gt;Blur&rdquo; with default parameters. That algorithm is very simple. Each pixel in our image is replaced by a mean value of its neighbours. - - How to write a GIMP plug-in, part III - https://developer.gimp.org/writing-a-plug-in/3/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://developer.gimp.org/writing-a-plug-in/3/ - Written By Dave Neary -In the &lt;olink targetdocent=&quot;writing-a-plug-in-2&quot;&gt;second part&lt;/olink&gt;, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. &lt;para&gt; Let's have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer's pixel value with the average value in the neighbourhood. - - Screenshots https://developer.gimp.org/screenshots.html diff --git a/public/sitemap.xml b/public/sitemap.xml index 801ad39..a9fda31 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -2,6 +2,12 @@ + https://developer.gimp.org/writing-a-plug-in/3/ + 2022-07-23T00:00:00+00:00 + + https://developer.gimp.org/writing-a-plug-in/ + 2022-07-23T00:00:00+00:00 + https://developer.gimp.org/faq.html 2022-07-20T00:00:00+00:00 @@ -57,8 +63,6 @@ https://developer.gimp.org/writing-a-plug-in/1/ https://developer.gimp.org/writing-a-plug-in/2/ - - https://developer.gimp.org/writing-a-plug-in/3/ https://developer.gimp.org/screenshots.html @@ -67,7 +71,5 @@ https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-1/ https://developer.gimp.org/gimpcon/2003/gimpcon2003-mins-2/ - - https://developer.gimp.org/writing-a-plug-in/ diff --git a/public/writing-a-plug-in/1/index.html b/public/writing-a-plug-in/1/index.html index e8bb0fd..4d98f52 100644 --- a/public/writing-a-plug-in/1/index.html +++ b/public/writing-a-plug-in/1/index.html @@ -103,30 +103,21 @@

How to write a GIMP plug-in

-

Written By Dave Neary

+

Written By Dave Neary.

In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors.

- - +

Introduction

+

New developers are often intimidated by The GIMP size and its +reputation. They think that writing a plug-in would be a +difficult task. The goal of these articles is to dumb this +feeling down, by showing how easily one can make a C plug-in.

In this part, I present a plug-in’s basic elements. We will see how to install a plug-in and how to get data from an image and directly manipulate it.

Architecture

-
<para role="images">
-  <ulink url="architecture.png">
-    <mediaobject>
-      <imageobject>
-        <imagedata fileref="architecture-small.png"/>
-      </imageobject>
-      <textobject>
-        <phrase>Architecture</phrase>
-      </textobject>
-    </mediaobject>
-    Architecture
-  </ulink>
-</para>
-
+

architecture.png +architecture.png

The GIMP script interface is centered on the Procedural database (PDB). At startup, The GIMP looks into a predefined set of places for scripts and plug-ins, and asks each new script to @@ -144,343 +135,183 @@ be called as a normal one.

This was the introduction - now, we will look closer at our first plug-in, a “Hello, world!”.

Compiling the plug-in

-
<para>
-  To be able to compile simple plug-ins for The GIMP, one needs
-  libgimp headers, as well as an associated utility named
-  gimptool.
-</para>
-
-<para>
-  With that utility, one can install a plug-in either in a private
-  directory (~/.gimp-2.0/plug-ins), or in the global plug-in
-  directory.
-</para>
-
-<para>
-  Syntax is
-</para>
-
-<programlisting>
-<![CDATA[
-   gimptool-2.0 --install plugin.c or gimptool-2.0 --install-admin plugin.c
- ]]>
-</programlisting>
-
-<para>
-  This utility, with other options, can also be used to install
-  scripts, or uninstall plug-ins.
-</para>
-
- - -
<para>
-  A GIMP plug-in can typically behave three different ways. It can
-  take image data, modify it, and send back the modified image,
-  like edge detection. It can generate an image and send it back,
-  like some script-fus, or file reading plug-ins like jpeg. Or it
-  can get an image, and process it without modifying its data,
-  like a file saver plug-in.
-</para>
-
- - -
<programlisting>
-<![CDATA[
-  #include &lt;libgimp/gimp.h&gt;
- ]]>
-</programlisting>
-
-<para>
-  This header makes all basic plug-in elements available to us.
-</para>
-
-<programlisting>
-<![CDATA[
-  GimpPlugInInfo PLUG_IN_INFO = {
-    init,
-    quit,
-    query,
-    run
-  };
- ]]>
-</programlisting>
-
-<para>
-  This structure has to have that name. It contains four pointers
-  to functions, which will be called at set times of the plug-in
-  life. init and quit are optional, and thus can hold NULL values,
-  but the last two functions, query and run, are mandatory.
-</para>
-
-<para>
-  The init() function is called each time The GIMP starts up. This
-  function is not typically used. Some plug-ins use it to make a
-  secondary search that is not done by the core. This function is
-  not used by any standard GIMP plug-in, but could be useful for
-  example for a plug-in that would like to register some procedure
-  conditionally on some files presence.
-</para>
-
-<para>
-  The quit() function is not used much either. It is called when
-  The GIMP is about to be closed, to allow it to free some
-  resources. It is used in the script-fu plug-in.
-</para>
-
-<para>
-  The query() function is called the first time the plug-in is
-  present, and then each time the plug-in changes.
-</para>
-
-<para>
-  The run() function is the plug-in's centrepiece. It is called
-  when the plug-in is asked to run. It gets the plug-in name (as a
-  plug-in can register several procedures), input parameters, and
-  a pointer to output parameters, then determines if it is
-  launched in a interactive way or by a script, and does all the
-  plug-in processing. Its prototype is
-</para>
-
-<programlisting>
-<![CDATA[
-  void run (const gchar      *name,
-            gint              nparams,
-            const GimpParam  *param,
-            gint             *nreturn_vals,
-            GimpParam       **return_vals);
- ]]>
-</programlisting>
-
- - -
<para>
-  MAIN is a C macro that holds a bit of dark magic to initialise
-  arguments.  It also calls the appropriate PLUG_IN_INFO function
-  depending on the timing. Your plug-in needs it.
-</para>
-
- - -
<para>
-  query() deals with the procedure registration and input
-  arguments definition.  These informations are saved to speed up
-  startup time, and refreshed only when the plug-in is modified.
-</para>
-
-<para>
-  For our "Hello, world!" plug-in, the query function will look
-  like this:
-</para>
-
-<programlisting>
-<![CDATA[
-  static void
-  query (void)
+

To be able to compile simple plug-ins for The GIMP, one needs +libgimp headers, as well as an associated utility named +gimptool.

+

With that utility, one can install a plug-in either in a private +directory (~/.gimp-2.0/plug-ins), or in the global plug-in +directory.

+

Syntax is

+
gimptool-2.0 --install plugin.c or gimptool-2.0 --install-admin plugin.c
+

This utility, with other options, can also be used to install +scripts, or uninstall plug-ins.

+

Behaviour

+

A GIMP plug-in can typically behave three different ways. It can +take image data, modify it, and send back the modified image, +like edge detection. It can generate an image and send it back, +like some script-fus, or file reading plug-ins like jpeg. Or it +can get an image, and process it without modifying its data, +like a file saver plug-in.

+

Essentials

+
#include <libgimp/gimp.h>
+

This header makes all basic plug-in elements available to us.

+
GimpPlugInInfo PLUG_IN_INFO = {
+	init,
+	quit,
+	query,
+	run
+};
+

This structure has to have that name. It contains four pointers +to functions, which will be called at set times of the plug-in +life. init and quit are optional, and thus can hold NULL values, +but the last two functions, query and run, are mandatory.

+

The init() function is called each time The GIMP starts up. This +function is not typically used. Some plug-ins use it to make a +secondary search that is not done by the core. This function is +not used by any standard GIMP plug-in, but could be useful for +example for a plug-in that would like to register some procedure +conditionally on some files presence.

+

The quit() function is not used much either. It is called when +The GIMP is about to be closed, to allow it to free some +resources. It is used in the script-fu plug-in.

+

The query() function is called the first time the plug-in is +present, and then each time the plug-in changes.

+

The run() function is the plug-in’s centrepiece. It is called +when the plug-in is asked to run. It gets the plug-in name (as a +plug-in can register several procedures), input parameters, and +a pointer to output parameters, then determines if it is +launched in a interactive way or by a script, and does all the +plug-in processing. Its prototype is

+
void run (const gchar      *name,
+        gint              nparams,
+        const GimpParam  *param,
+        gint             *nreturn_vals,
+        GimpParam       **return_vals);
+

MAIN ()

+

MAIN is a C macro that holds a bit of dark magic to initialise +arguments. It also calls the appropriate PLUG_IN_INFO function +depending on the timing. Your plug-in needs it.

+

The query() function

+

query() deals with the procedure registration and input +arguments definition. These informations are saved to speed up +startup time, and refreshed only when the plug-in is modified.

+

For our “Hello, world!” plug-in, the query function will look +like this:

+
static void
+query (void)
+{
+  static GimpParamDef args[] = {
     {
-      static GimpParamDef args[] = {
-        {
-          GIMP_PDB_INT32,
-          "run-mode",
-          "Run mode"
-        },
-        {
-          GIMP_PDB_IMAGE,
-          "image",
-          "Input image"
-        },
-        {
-          GIMP_PDB_DRAWABLE,
-          "drawable",
-          "Input drawable"
-        }
-      };
-
-      gimp_install_procedure (
-        "plug-in-hello",
-        "Hello, world!",
-        "Displays \"Hello, world!\" in a dialog",
-        "David Neary",
-        "Copyright David Neary",
-        "2004",
-        "_Hello world...",
-        "RGB*, GRAY*",
-        GIMP_PLUGIN,
-        G_N_ELEMENTS (args), 0,
-        args, NULL);
-
-        gimp_plugin_menu_register ("plug-in-hello",
-                                   "<Image>/Filters/Misc"); 
+      GIMP_PDB_INT32,
+      "run-mode",
+      "Run mode"
+    },
+    {
+      GIMP_PDB_IMAGE,
+      "image",
+      "Input image"
+    },
+    {
+      GIMP_PDB_DRAWABLE,
+      "drawable",
+      "Input drawable"
     }
- ]]>
-</programlisting>
-
-<para>
-  GimpParamDef contains three things - the parameter type, its
-  name, and a string describing the parameter.
-</para>
-
-<para>
-  gimp_install_procedure declares the procedure name, some
-  description and help strings, menu path where the plug-in should
-  sit, image types handled by the plug-in, and at the end, input
-  and output parameters number, as well as the parameters
-  descriptors.
-</para>
-
-<para>
-  "RGB*, GRAY*" declares the image types handled. It can be RGB,
-  INDEXED or GRAY, with or without Alpha. So "RGB*, GRAY*"
-  describes RGB, RGBA, GRAY or GRAY image type.
-</para>
-
-<para>
-  GIMP_PLUGIN declares this procedure to be external, and not to
-  be executed in The GIMP core.
-</para>
-
-<para>
-  By adding a stub run function now, we can check that our plug-in
-  has all the essential elements, and test that it registers
-  itself in the PDB with the "Xtns->Plug-in Details" plug-in.
-</para>
-
-<para role="images">
-  <ulink url="plug-in-details.png">
-    <mediaobject>
-      <imageobject>
-        <imagedata fileref="plug-in-details-small.png"/>
-      </imageobject>
-      <textobject>
-        <phrase>Plug-in details</phrase>
-      </textobject>
-    </mediaobject>
-    Plug-in details
-  </ulink>
-</para>
-
-<para role="images">
-  <ulink url="plug-in-menu.png">
-    <mediaobject>
-      <imageobject>
-        <imagedata fileref="plug-in-menu-small.png"/>
-      </imageobject>
-      <textobject>
-        <phrase>Our plug-in is in the menus</phrase>
-      </textobject>
-    </mediaobject>
-    Our plug-in is in the menus
-  </ulink>
-</para>
-
- - -
<para>
-  The other required function for PLUG_IN_INFO is run. The core of
-  the plug-in stands there.
-</para>
-
-<para>
-  Output values (return_vals in the prototype) must have at least
-  one value associated - the plug-in status. Typically, this
-  parameter will hold "GIMP_PDB_SUCCESS".
-</para>
-
- - -
<para>
-  One can run a plug-in in several different ways, it can be run
-  from a GIMP menu if The GIMP is run interactively, or from a
-  script or a batch, or from the "Filters->Repeat Last" shortcut.
-</para>
-
-<para>
-  The "run_mode" input parameter can hold one of these values:
-  "GIMP_RUN_INTERACTIVE", "GIMP_RUN_NONINTERACTIVE" or
-  "GIMP_RUN_WITH_LAST_VALS".
-</para>
-
-<para>
-  "GIMP_RUN_INTERACTIVE" is typically the only case where one
-  creates an options dialog. Otherwise, one directly calls the
-  processing with values from input parameters or from memory.
-</para>
-
-<para>
-  For our test plug-in, we will simply display a dialog containing
-  a "Hello, world!" message. Thankfully, this is really easy with
-  GTK+. Our run function could be:
-</para>
-
-<programlisting>
-<![CDATA[
-  static void
-  run (const gchar      *name,
-       gint              nparams,
-       const GimpParam  *param,
-       gint             *nreturn_vals,
-       GimpParam       **return_vals)
-  {
-    static GimpParam  values[1];
-    GimpPDBStatusType status = GIMP_PDB_SUCCESS;
-    GimpRunMode       run_mode;
-
-    /* Setting mandatory output values */
-    *nreturn_vals = 1;
-    *return_vals  = values;
-
-    values[0].type = GIMP_PDB_STATUS;
-    values[0].data.d_status = status;
-
-    /* Getting run_mode - we won't display a dialog if 
-     * we are in NONINTERACTIVE mode */
-    run_mode = param[0].data.d_int32;
-
-    if (run_mode != GIMP_RUN_NONINTERACTIVE)
-      g_message("Hello, world!\n");
-  }
- ]]>
-</programlisting>
-
-<para>
-  Now, when we run our plug-in, there is action:
-</para>
-
-<para role="images">
-  <mediaobject>
-    <imageobject>
-      <imagedata fileref="hello.png"/>
-    </imageobject>
-    <textobject>
-      <phrase>Hello, world!</phrase>
-    </textobject>
-  </mediaobject>
-</para>
+  };
 
-<para>
-  Have a look at the full <ulink url="hello.c">hello.c</ulink> plug-in code.
-</para>
-
- - -
<para>
-  In <olink targetdocent="writing-a-plug-in-2">next part</olink>
-  we will go on, making a more useful plug-in that will get its
-  hands on image data. We will see how to use The GIMP image
-  architecture to make the plug-in perform better, processing the
-  image tile by tile.
-</para>
-
- - -
<para>
-  This work is licensed under a <ulink
-  url="http://creativecommons.org/licenses/by-nc-sa/2.5/">Creative
-  Commons Attribution-NonCommercial-ShareAlike 2.5
-  License</ulink>.
-</para>
-
- + gimp_install_procedure ( + "plug-in-hello", + "Hello, world!", + "Displays \"Hello, world!\" in a dialog", + "David Neary", + "Copyright David Neary", + "2004", + "_Hello world...", + "RGB*, GRAY*", + GIMP_PLUGIN, + G_N_ELEMENTS (args), 0, + args, NULL); + + gimp_plugin_menu_register ("plug-in-hello", + "<Image>/Filters/Misc"); +} +

GimpParamDef contains three things - the parameter type, its +name, and a string describing the parameter.

+

gimp_install_procedure declares the procedure name, some +description and help strings, menu path where the plug-in should +sit, image types handled by the plug-in, and at the end, input +and output parameters number, as well as the parameters +descriptors.

+

RGB*, GRAY*” declares the image types handled. It can be RGB, +INDEXED or GRAY, with or without Alpha. So “RGB*, GRAY*” +describes RGB, RGBA, GRAY or GRAY image type.

+

GIMP_PLUGIN declares this procedure to be external, and not to +be executed in The GIMP core.

+

By adding a stub run function now, we can check that our plug-in +has all the essential elements, and test that it registers +itself in the PDB with the “Xtns->Plug-in Details” plug-in.

+

plug-in-details.png +plug-in-details-small.png +Plug-in details

+

plug-in-menu.png +plug-in-menu-small.png +Our plug-in is in the menus

+

The run() function

+

The other required function for PLUG_IN_INFO is run. The core of +the plug-in stands there.

+

Output values (return_vals in the prototype) must have at least +one value associated - the plug-in status. Typically, this +parameter will hold “GIMP_PDB_SUCCESS”.

+

Run-modes

+

One can run a plug-in in several different ways, it can be run +from a GIMP menu if The GIMP is run interactively, or from a +script or a batch, or from the “Filters->Repeat Last” shortcut.

+

The “run_mode” input parameter can hold one of these values: +“GIMP_RUN_INTERACTIVE”, “GIMP_RUN_NONINTERACTIVE” or +“GIMP_RUN_WITH_LAST_VALS”.

+

GIMP_RUN_INTERACTIVE” is typically the only case where one +creates an options dialog. Otherwise, one directly calls the +processing with values from input parameters or from memory.

+

For our test plug-in, we will simply display a dialog containing +a “Hello, world!” message. Thankfully, this is really easy with +GTK+. Our run function could be:

+
static void
+run (const gchar      *name,
+   gint              nparams,
+   const GimpParam  *param,
+   gint             *nreturn_vals,
+   GimpParam       **return_vals)
+{
+static GimpParam  values[1];
+GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+GimpRunMode       run_mode;
+
+/* Setting mandatory output values */
+*nreturn_vals = 1;
+*return_vals  = values;
+
+values[0].type = GIMP_PDB_STATUS;
+values[0].data.d_status = status;
+
+/* Getting run_mode - we won't display a dialog if 
+ * we are in NONINTERACTIVE mode */
+run_mode = param[0].data.d_int32;
+
+if (run_mode != GIMP_RUN_NONINTERACTIVE)
+  g_message("Hello, world!\n");
+}
+

Now, when we run our plug-in, there is action:

+

[hello.png](Hello, world!)

+

Have a look at the full hello.c plug-in code.

+

Next part

+

In next part +we will go on, making a more useful plug-in that will get its +hands on image data. We will see how to use The GIMP image +architecture to make the plug-in perform better, processing the +image tile by tile.

+

This work is licensed under a Creative +Commons Attribution-NonCommercial-ShareAlike 2.5 +License.

diff --git a/public/writing-a-plug-in/2/index.html b/public/writing-a-plug-in/2/index.html index e1796e1..f80c908 100644 --- a/public/writing-a-plug-in/2/index.html +++ b/public/writing-a-plug-in/2/index.html @@ -103,9 +103,9 @@

How to write a GIMP plug-in, part II

-

Written By Dave Neary

-

In the first -part, I presented essential elements to build a plug-in +

Written By Dave Neary.

+

In the first part, +I presented essential elements to build a plug-in interface with The GIMP. Now we will produce a simple but useful algorithm that we could use in our plug-in.

Introduction

@@ -118,8 +118,7 @@ look at the simplest case where the neighbourhood is 3x3 (see figure 1), in that case the center value will be replaced with 5, the mean of the 9 numbers in its neighbourhood.

With this method, edge differences are splatted, giving a -blurred result. One can choose another radius, using a (2r + 1) -x (2r + 1) matrix.

+blurred result. One can choose another radius, using a (2r + 1) x (2r + 1) matrix.

Image structure

Last month, we wrote a run() function that did nothing useful. Let’s look again at run() prototype:

@@ -138,179 +137,126 @@ word “drawable” is often used in GIMP internal structures. A “drawable” is an object where you can get, and sometimes modify, raw data. So : layers, layer masks, selections are all “drawables”.

-
<para role="images">
-  <ulink url="GimpImage.png">
-    <mediaobject>
-      <imageobject>
-        <imagedata fileref="GimpImage-small.png"/>
-      </imageobject>
-      <textobject>
-        <phrase>Drawables</phrase>
-      </textobject>
-    </mediaobject>
-    Drawables
-  </ulink>
-
+

GimpImage.png +GimpImage-small.png +Drawables

Accessing the data

-
<para>
-  To get a GimpDrawable from its identifier, we need the
-  gimp_drawable_get() function:
-</para>
-
-<programlisting>
-<![CDATA[
-  GimpDrawable *gimp_drawable_get (gint32 drawable_id);
- ]]>
-</programlisting>
-
-<para>
-  From this structure, one can access drawable data through a
-  GimpPixelRgn structure, and one can check the drawable type
-  (RGB, gray level). The full listing of functions available for a
-  GimpDrawable can be found <ulink
-  url="http://developer.gimp.org/api/2.0/libgimp/libgimp-gimpdrawable.html">in
-  the API</ulink>.
-</para>
-
-<para>
-  Two very important functions for plug-ins are
-  gimp_drawable_mask_bounds() and gimp_pixel_rgn_init(). The first
-  gives the active selection limits on the drawable, and the
-  second initialises the GimpPixelRgn we will use to access the
-  data.
-</para>
-
-<para>
-  As soon as we have a well initialised GimpPixelRgn, we can
-  access the image data in several different ways, by pixel, by
-  rectangle, by row or by column. The best method will depend on
-  the algorithm one plans to use. Moreover, The GIMP uses a
-  tile-based architecture, and loading or unloading data is
-  expensive, so we should not use it more than necessary.
-</para>
-
-<para role="images">
-  <ulink url="tiles.png">
-    <mediaobject>
-      <imageobject>
-        <imagedata fileref="tiles-small.png"/>
-      </imageobject>
-      <textobject>
-        <phrase>Tiles</phrase>
-      </textobject>
-    </mediaobject>
-    Tiles
-  </ulink>
-</para>
-
-<para>
-  The main functions to get and set image data are:
-</para>
-
-<programlisting>
-<![CDATA[
-  void gimp_pixel_rgn_get_pixel (GimpPixelRgn *pr,
-                                 guchar       *buf,
-                                 gint          x,
-                                 gint          y);
-  void gimp_pixel_rgn_get_row   (GimpPixelRgn *pr,
-                                 guchar       *buf,
-                                 gint          x,
-                                 gint          y,
-                                 gint          width);
-  void gimp_pixel_rgn_get_col   (GimpPixelRgn *pr,
-                                 guchar       *buf,
-                                 gint          x,
-                                 gint          y,
-                                 gint          height);
-  void gimp_pixel_rgn_get_rect  (GimpPixelRgn *pr,
-                                 guchar       *buf,
-                                 gint          x,
-                                 gint          y,
-                                 gint          width,
-                                 gint          height);
-  void gimp_pixel_rgn_set_pixel (GimpPixelRgn *pr,
-                                 const guchar *buf,
-                                 gint          x,
-                                 gint          y);
-  void gimp_pixel_rgn_set_row   (GimpPixelRgn *pr,
-                                 const guchar *buf,
-                                 gint          x,
-                                 gint          y,
-                                 gint          width);
-  void gimp_pixel_rgn_set_col   (GimpPixelRgn *pr,
-                                 const guchar *buf,
-                                 gint          x,
-                                 gint          y,
-                                 gint          height);
-  void gimp_pixel_rgn_set_rect  (GimpPixelRgn *pr,
-                                 const guchar *buf,
-                                 gint          x,
-                                 gint          y,
-                                 gint          width,
-                                 gint          height);
- ]]>
-</programlisting>
-
-<para>
-  There is also another way to access image data (it's even used
-  more often), that allows to manage data at the tile level. We
-  will look at it in detail later.
-</para>
-
+

To get a GimpDrawable from its identifier, we need the +gimp_drawable_get() function:

+
GimpDrawable *gimp_drawable_get (gint32 drawable_id);
+

From this structure, one can access drawable data through a +GimpPixelRgn structure, and one can check the drawable type +(RGB, gray level). The full listing of functions available for a +GimpDrawable can be found in +the API.

+

Two very important functions for plug-ins are +gimp_drawable_mask_bounds() and gimp_pixel_rgn_init(). The first +gives the active selection limits on the drawable, and the +second initialises the GimpPixelRgn we will use to access the +data.

+

As soon as we have a well initialised GimpPixelRgn, we can +access the image data in several different ways, by pixel, by +rectangle, by row or by column. The best method will depend on +the algorithm one plans to use. Moreover, The GIMP uses a +tile-based architecture, and loading or unloading data is +expensive, so we should not use it more than necessary.

+

The main functions to get and set image data are:

+
void gimp_pixel_rgn_get_pixel (GimpPixelRgn *pr,
+                             guchar       *buf,
+                             gint          x,
+                             gint          y);
+void gimp_pixel_rgn_get_row   (GimpPixelRgn *pr,
+                             guchar       *buf,
+                             gint          x,
+                             gint          y,
+                             gint          width);
+void gimp_pixel_rgn_get_col   (GimpPixelRgn *pr,
+                             guchar       *buf,
+                             gint          x,
+                             gint          y,
+                             gint          height);
+void gimp_pixel_rgn_get_rect  (GimpPixelRgn *pr,
+                             guchar       *buf,
+                             gint          x,
+                             gint          y,
+                             gint          width,
+                             gint          height);
+void gimp_pixel_rgn_set_pixel (GimpPixelRgn *pr,
+                             const guchar *buf,
+                             gint          x,
+                             gint          y);
+void gimp_pixel_rgn_set_row   (GimpPixelRgn *pr,
+                             const guchar *buf,
+                             gint          x,
+                             gint          y,
+                             gint          width);
+void gimp_pixel_rgn_set_col   (GimpPixelRgn *pr,
+                             const guchar *buf,
+                             gint          x,
+                             gint          y,
+                             gint          height);
+void gimp_pixel_rgn_set_rect  (GimpPixelRgn *pr,
+                             const guchar *buf,
+                             gint          x,
+                             gint          y,
+                             gint          width,
+                             gint          height);
+

There is also another way to access image data (it’s even used +more often), that allows to manage data at the tile level. We +will look at it in detail later.

Updating the image

At last, a plug-in that has modified a drawable data must flush it to send data to the core, and to tell the application that the display must be updated. This is done with the following function:

-
  gimp_displays_flush ();
-  gimp_drawable_detach (drawable);
+
gimp_displays_flush ();
+gimp_drawable_detach (drawable);
 

Implementing blur()

To be able to try out several different processing methods, we will delegate the job to a blur() function. Our run() is below.

-
      static void
-      run (const gchar      *name,
-           gint              nparams,
-           const GimpParam  *param,
-           gint             *nreturn_vals,
-           GimpParam       **return_vals)
-      {
-        static GimpParam  values[1];
-        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
-        GimpRunMode       run_mode;
-        GimpDrawable     *drawable;
-
-        /* Setting mandatory output values */
-        *nreturn_vals = 1;
-        *return_vals  = values;
-
-        values[0].type = GIMP_PDB_STATUS;
-        values[0].data.d_status = status;
-
-        /* Getting run_mode - we won't display a dialog if 
-         * we are in NONINTERACTIVE mode */
-        run_mode = param[0].data.d_int32;
-
-        /*  Get the specified drawable  */
-        drawable = gimp_drawable_get (param[2].data.d_drawable);
-
-        gimp_progress_init ("My Blur...");
-
-        /* Let's time blur
-         *
-         *   GTimer timer = g_timer_new time ();
-         */
-
-        blur (drawable);
-
-        /*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
-         *   g_timer_destroy (timer);
-         */
-
-        gimp_displays_flush ();
-        gimp_drawable_detach (drawable);
-      }
+
static void
+run (const gchar      *name,
+   gint              nparams,
+   const GimpParam  *param,
+   gint             *nreturn_vals,
+   GimpParam       **return_vals)
+{
+	static GimpParam  values[1];
+	GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+	GimpRunMode       run_mode;
+	GimpDrawable     *drawable;
+
+	/* Setting mandatory output values */
+	*nreturn_vals = 1;
+	*return_vals  = values;
+
+	values[0].type = GIMP_PDB_STATUS;
+	values[0].data.d_status = status;
+
+	/* Getting run_mode - we won't display a dialog if 
+	 * we are in NONINTERACTIVE mode */
+	run_mode = param[0].data.d_int32;
+
+	/*  Get the specified drawable  */
+	drawable = gimp_drawable_get (param[2].data.d_drawable);
+
+	gimp_progress_init ("My Blur...");
+
+	/* Let's time blur
+	 *
+	 *   GTimer timer = g_timer_new time ();
+	 */
+
+	blur (drawable);
+
+	/*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
+	 *   g_timer_destroy (timer);
+	 */
+
+	gimp_displays_flush ();
+	gimp_drawable_detach (drawable);
+}
 

There are a few lines here that need to be explained a bit more. The call to gimp_progress_init() initialises a progress measurement for our plug-in. Later, if we call @@ -340,108 +286,108 @@ be tagged “dirty” and sent to the core to be merged. Most of the time, to read data, one uses FALSE and FALSE for these two parameters, and to write data, one uses TRUE and TRUE. Other combinations are possible but seldom used.

-
      static void
-      blur (GimpDrawable *drawable)
-      {
-        gint         i, j, k, channels;
-        gint         x1, y1, x2, y2;
-        GimpPixelRgn rgn_in, rgn_out;
-        guchar       output[4];
-
-        /* Gets upper left and lower right coordinates,
-         * and layers number in the image */
-        gimp_drawable_mask_bounds (drawable->drawable_id,
-                                   &x1, &y1,
-                                   &x2, &y2);
-        channels = gimp_drawable_bpp (drawable->drawable_id);
-
-        /* Initialises two PixelRgns, one to read original data,
-         * and the other to write output data. That second one will
-         * be merged at the end by the call to
-         * gimp_drawable_merge_shadow() */
-        gimp_pixel_rgn_init (&rgn_in,
-                             drawable,
-                             x1, y1,
-                             x2 - x1, y2 - y1, 
-                             FALSE, FALSE);
-        gimp_pixel_rgn_init (&rgn_out,
-                             drawable,
-                             x1, y1,
-                             x2 - x1, y2 - y1, 
-                             TRUE, TRUE);
-
-        for (i = x1; i < x2; i++)
-          {
-            for (j = y1; j < y2; j++)
-              {
-                guchar pixel[9][4];
-
-                /* Get nine pixels */
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[0],
-                                          MAX (i - 1, x1),
-                                          MAX (j - 1, y1));
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[1],
-                                          MAX (i - 1, x1),
-                                          j);
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[2],
-                                          MAX (i - 1, x1),
-                                          MIN (j + 1, y2 - 1));
-
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[3],
-                                          i,
-                                          MAX (j - 1, y1));
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[4],
-                                          i,
-                                          j);
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[5],
-                                          i,
-                                          MIN (j + 1, y2 - 1));
-
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[6],
-                                          MIN (i + 1, x2 - 1),
-                                          MAX (j - 1, y1));
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[7],
-                                          MIN (i + 1, x2 - 1),
-                                          j);
-                gimp_pixel_rgn_get_pixel (&rgn_in,
-                                          pixel[8],
-                                          MIN (i + 1, x2 - 1),
-                                          MIN (j + 1, y2 - 1));
-
-                /* For each layer, compute the average of the
-                 * nine */
-                for (k = 0; k < channels; k++)
-                  {
-                    int tmp, sum = 0;
-                    for (tmp = 0; tmp < 9; tmp++)
-                      sum += pixel[tmp][k];
-                    output[k] = sum / 9;
-                  }
-
-                gimp_pixel_rgn_set_pixel (&rgn_out,
-                                          output,
-                                          i, j);
-              }
-
-            if (i % 10 == 0)
-              gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1));
-          }
-
-        /*  Update the modified region */
-        gimp_drawable_flush (drawable);
-        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
-        gimp_drawable_update (drawable->drawable_id,
-                              x1, y1,
-                              x2 - x1, y2 - y1);
-      }
+
static void
+blur (GimpDrawable *drawable)
+{
+  gint         i, j, k, channels;
+  gint         x1, y1, x2, y2;
+  GimpPixelRgn rgn_in, rgn_out;
+  guchar       output[4];
+
+  /* Gets upper left and lower right coordinates,
+   * and layers number in the image */
+  gimp_drawable_mask_bounds (drawable->drawable_id,
+                             &x1, &y1,
+                             &x2, &y2);
+  channels = gimp_drawable_bpp (drawable->drawable_id);
+
+  /* Initialises two PixelRgns, one to read original data,
+   * and the other to write output data. That second one will
+   * be merged at the end by the call to
+   * gimp_drawable_merge_shadow() */
+  gimp_pixel_rgn_init (&rgn_in,
+                       drawable,
+                       x1, y1,
+                       x2 - x1, y2 - y1, 
+                       FALSE, FALSE);
+  gimp_pixel_rgn_init (&rgn_out,
+                       drawable,
+                       x1, y1,
+                       x2 - x1, y2 - y1, 
+                       TRUE, TRUE);
+
+  for (i = x1; i < x2; i++)
+    {
+      for (j = y1; j < y2; j++)
+        {
+          guchar pixel[9][4];
+
+          /* Get nine pixels */
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[0],
+                                    MAX (i - 1, x1),
+                                    MAX (j - 1, y1));
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[1],
+                                    MAX (i - 1, x1),
+                                    j);
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[2],
+                                    MAX (i - 1, x1),
+                                    MIN (j + 1, y2 - 1));
+
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[3],
+                                    i,
+                                    MAX (j - 1, y1));
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[4],
+                                    i,
+                                    j);
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[5],
+                                    i,
+                                    MIN (j + 1, y2 - 1));
+
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[6],
+                                    MIN (i + 1, x2 - 1),
+                                    MAX (j - 1, y1));
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[7],
+                                    MIN (i + 1, x2 - 1),
+                                    j);
+          gimp_pixel_rgn_get_pixel (&rgn_in,
+                                    pixel[8],
+                                    MIN (i + 1, x2 - 1),
+                                    MIN (j + 1, y2 - 1));
+
+          /* For each layer, compute the average of the
+           * nine */
+          for (k = 0; k < channels; k++)
+            {
+              int tmp, sum = 0;
+              for (tmp = 0; tmp < 9; tmp++)
+                sum += pixel[tmp][k];
+              output[k] = sum / 9;
+            }
+
+          gimp_pixel_rgn_set_pixel (&rgn_out,
+                                    output,
+                                    i, j);
+        }
+
+      if (i % 10 == 0)
+        gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1));
+    }
+
+  /*  Update the modified region */
+  gimp_drawable_flush (drawable);
+  gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
+  gimp_drawable_update (drawable->drawable_id,
+                        x1, y1,
+                        x2 - x1, y2 - y1);
+}
 

Row processing

Our function has a bug drawback: performance. On a 300x300 selection, with the timing code uncommented, blur() took 12 @@ -451,124 +397,104 @@ compare, on the same selection, Gaussian blur took 3 seconds.

gimp_pixel_rgn_(get|set)_row() the result is far better. We reduce the timing for the 300x300 selection from 760 seconds to 6 seconds. blur() V2 is below:

-
<programlisting>
-<![CDATA[
-  static void
-  blur (GimpDrawable *drawable)
-  {
-    gint         i, j, k, channels;
-    gint         x1, y1, x2, y2;
-    GimpPixelRgn rgn_in, rgn_out;
-    guchar      *row1, *row2, *row3;
-    guchar      *outrow;
-
-    gimp_drawable_mask_bounds (drawable->drawable_id,
-                               &x1, &y1,
-                               &x2, &y2);
-    channels = gimp_drawable_bpp (drawable->drawable_id);
-
-    gimp_pixel_rgn_init (&rgn_in,
-                         drawable,
-                         x1, y1,
-                         x2 - x1, y2 - y1, 
-                         FALSE, FALSE);
-    gimp_pixel_rgn_init (&rgn_out,
-                         drawable,
-                         x1, y1,
-                         x2 - x1, y2 - y1,
-                         TRUE, TRUE);
-
-    /* Initialise enough memory for row1, row2, row3, outrow */
-    row1 = g_new (guchar, channels * (x2 - x1));
-    row2 = g_new (guchar, channels * (x2 - x1));
-    row3 = g_new (guchar, channels * (x2 - x1));
-    outrow = g_new (guchar, channels * (x2 - x1));
-
-    for (i = y1; i < y2; i++)
-      {
-        /* Get row i-1, i, i+1 */
-        gimp_pixel_rgn_get_row (&rgn_in,
-                                row1,
-                                x1, MAX (y1, i - 1),
-                                x2 - x1);
-        gimp_pixel_rgn_get_row (&rgn_in,
-                                row2,
-                                x1, i,
-                                x2 - x1);
-        gimp_pixel_rgn_get_row (&rgn_in,
-                                row3,
-                                x1, MIN (y2 - 1, i + 1),
-                                x2 - x1);
-
-        for (j = x1; j < x2; j++)
-          {
-            /* For each layer, compute the average of the nine
-             * pixels */
-            for (k = 0; k < channels; k++)
-              {
-                int sum = 0;
-                sum = row1[channels * MAX ((j - 1 - x1), 0) + k]           +
-                      row1[channels * (j - x1) + k]                        +
-                      row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
-                      row2[channels * MAX ((j - 1 - x1), 0) + k]           +
-                      row2[channels * (j - x1) + k]                        +
-                      row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
-                      row3[channels * MAX ((j - 1 - x1), 0) + k]           +
-                      row3[channels * (j - x1) + k]                        +
-                      row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k];
-                outrow[channels * (j - x1) + k] = sum / 9;
-              }
-
-         }
-
-         gimp_pixel_rgn_set_row (&rgn_out,
-                                 outrow,
-                                 x1, i,
-                                 x2 - x1);
-
-         if (i % 10 == 0)
-              gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1));
-    }
-
-    g_free (row1);
-    g_free (row2);
-    g_free (row3);
-    g_free (outrow);
-
-    gimp_drawable_flush (drawable);
-    gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
-    gimp_drawable_update (drawable->drawable_id,
-                          x1, y1,
-                          x2 - x1, y2 - y1);
+
static void
+blur (GimpDrawable *drawable)
+{
+  gint         i, j, k, channels;
+  gint         x1, y1, x2, y2;
+  GimpPixelRgn rgn_in, rgn_out;
+  guchar      *row1, *row2, *row3;
+  guchar      *outrow;
+
+  gimp_drawable_mask_bounds (drawable->drawable_id,
+                             &x1, &y1,
+                             &x2, &y2);
+  channels = gimp_drawable_bpp (drawable->drawable_id);
+
+  gimp_pixel_rgn_init (&rgn_in,
+                       drawable,
+                       x1, y1,
+                       x2 - x1, y2 - y1, 
+                       FALSE, FALSE);
+  gimp_pixel_rgn_init (&rgn_out,
+                       drawable,
+                       x1, y1,
+                       x2 - x1, y2 - y1,
+                       TRUE, TRUE);
+
+  /* Initialise enough memory for row1, row2, row3, outrow */
+  row1 = g_new (guchar, channels * (x2 - x1));
+  row2 = g_new (guchar, channels * (x2 - x1));
+  row3 = g_new (guchar, channels * (x2 - x1));
+  outrow = g_new (guchar, channels * (x2 - x1));
+
+  for (i = y1; i < y2; i++)
+    {
+      /* Get row i-1, i, i+1 */
+      gimp_pixel_rgn_get_row (&rgn_in,
+                              row1,
+                              x1, MAX (y1, i - 1),
+                              x2 - x1);
+      gimp_pixel_rgn_get_row (&rgn_in,
+                              row2,
+                              x1, i,
+                              x2 - x1);
+      gimp_pixel_rgn_get_row (&rgn_in,
+                              row3,
+                              x1, MIN (y2 - 1, i + 1),
+                              x2 - x1);
+
+      for (j = x1; j < x2; j++)
+        {
+          /* For each layer, compute the average of the nine
+           * pixels */
+          for (k = 0; k < channels; k++)
+            {
+              int sum = 0;
+              sum = row1[channels * MAX ((j - 1 - x1), 0) + k]           +
+                    row1[channels * (j - x1) + k]                        +
+                    row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
+                    row2[channels * MAX ((j - 1 - x1), 0) + k]           +
+                    row2[channels * (j - x1) + k]                        +
+                    row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
+                    row3[channels * MAX ((j - 1 - x1), 0) + k]           +
+                    row3[channels * (j - x1) + k]                        +
+                    row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k];
+              outrow[channels * (j - x1) + k] = sum / 9;
+            }
+
+       }
+
+       gimp_pixel_rgn_set_row (&rgn_out,
+                               outrow,
+                               x1, i,
+                               x2 - x1);
+
+       if (i % 10 == 0)
+            gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1));
   }
- ]]>
-</programlisting>
-
-<para>
-  Have a look at the <ulink url="myblur1.c">slow</ulink> or
-  <ulink url="myblur2.c">fast</ulink> blur complete code.
-</para>
-
- - -
<para>
-  In <olink targetdocent="writing-a-plug-in-3">next part</olink>,
-  we will see how to process the image tile by tile. We will also
-  have a look at preferences, by modifying our algorithm so it can
-  take an input parameter.
-</para>
-
- - -
<para>
-  This work is licensed under a <ulink
-  url="http://creativecommons.org/licenses/by-nc-sa/2.5/">Creative
-  Commons Attribution-NonCommercial-ShareAlike 2.5
-  License</ulink>.
-</para>
-
- + + g_free (row1); + g_free (row2); + g_free (row3); + g_free (outrow); + + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + x1, y1, + x2 - x1, y2 - y1); +} +

Have a look at the slow or fast blur complete code.

+

Next part

+

In next part, +we will see how to process the image tile by tile. We will also +have a look at preferences, by modifying our algorithm so it can +take an input parameter.

+

This work is licensed under a Creative +Commons Attribution-NonCommercial-ShareAlike 2.5 +License.

diff --git a/public/writing-a-plug-in/3/index.html b/public/writing-a-plug-in/3/index.html index 3aa9aa6..9efbe22 100644 --- a/public/writing-a-plug-in/3/index.html +++ b/public/writing-a-plug-in/3/index.html @@ -102,888 +102,676 @@

How to write a GIMP plug-in, part III

- -

Written By Dave Neary

-
In the <olink targetdocent="writing-a-plug-in-2">second
-part</olink>, I told you about manipulating image data by pixel or
+  
+  

Written By Dave Neary.

+

In the second part, +I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a -graphical interface to allow changing that parameter. -

- - -
<para>
-  Let's have a look at our simple algorithm: for each pixel,
-  generate a (2r+1)x(2r+1) neighbourhood and for each layer,
-  replace the layer's pixel value with the average value in the
-  neighbourhood.
-</para>
-
-<para>
-  It's a bit more complex than that - we have to be careful near
-  image borders for example, but this algorithm makes a blur
-  effect that is not so bad in general.
-</para>
-
-<para>
-  But until now, we wrote the algorithm for a 3x3 neighbourhood.
-  Time has come to generalise this part and to introduce the
-  radius as a parameter.
-</para>
-
-<para>
-  First, a word on tiles.
-</para>
-
+graphical interface to allow changing that parameter.

+

Introduction

+

Let’s have a look at our simple algorithm: for each pixel, +generate a (2r+1)x(2r+1) neighbourhood and for each layer, +replace the layer’s pixel value with the average value in the +neighbourhood.

+

It’s a bit more complex than that - we have to be careful near +image borders for example, but this algorithm makes a blur +effect that is not so bad in general.

+

But until now, we wrote the algorithm for a 3x3 neighbourhood. +Time has come to generalise this part and to introduce the +radius as a parameter.

+

First, a word on tiles.

+

Tile management

+

A tile is an image data block with a 64x64 size. Usually, tiles +are sent to the plug-in on demand one by one, by shared memory. +Of course this process needs huge resources and should be +avoided.

+

Usually, one doesn’t need any particular cache, each tile is +sent when one needs it and freed when one asks for another one. +Nevertheless, we can tell our plug-in to keep a tile cache to +avoid this constant round trip, by calling the function:

+
gimp_tile_cache_ntiles (gulong ntiles);
+

In the second part example, we called gimp_pixel_rgn_get_row() +and gimp_pixel_rgn_set_row() but without using any cache.

+

The number of tiles in a tile row will be the layer width +divided by the tile width, plus one. So, for a layer width of +65, we will cache two tiles. As we usually also process shadow +tiles, we can double that number to compute the ideal cache size +for our plug-in.

+
gimp_tile_cache_ntiles (2 * (drawable->width / 
+                        gimp_tile_width () + 1));
+

With the cache, our slow plug-in becomes fast. On a 300x300 +selection, our last blur took 3 seconds, but on a 2000x1500 +selection it was much slower - 142 seconds.

+

Adding the above line of code, things are getting better: 11 +seconds. We still lose transition time when we reach tile +borders, we can go down to 10 seconds when multiplying by 4 +instead of 2 (meaning we cache two tiles rows), but the more +tiles we cache, the more hard disk access we make, which reduce +the time gain at a point.

+

Algorithm generalisation

+

We can modify the algorithm to take a parameter into account: +radius. With a radius of 3, the neighbourhood of a pixel will be +7x7, instead of 3x3 with a radius of 1. To achieve this I modify +the previous algorithm:

+
    +
  • allocate space for 2r+1 tile rows
  • +
  • initialise this rows array, taking care of borders
  • +
  • for each tile row +
      +
    • for each pixel in the tile row
    • +
    • compute the neighbourhood average, taking care of borders
    • +
    +
  • +
  • get a new tile row and cycle rows
  • +
+

This algorithm is more complex than the last one, because the +average computing will be a O(r²) algorithm.

+

The modified code to get this behaviour is below. Most of the +work is done in the process_row function. init_mem and shuffle +are there to keep the blur code clean and small.

+
static void blur        (GimpDrawable *drawable);
+
+static void init_mem    (guchar     ***row,
+                         guchar      **outrow,
+                         gint          num_bytes);
+static void process_row (guchar      **row,
+                         guchar       *outrow,
+                         gint          x1,
+                         gint          y1,
+                         gint          width,
+                         gint          height,
+                         gint          channels,
+                         gint          i);
+static void shuffle     (GimpPixelRgn *rgn_in,
+                         guchar      **row,
+                         gint          x1,
+                         gint          y1,
+                         gint          width,
+                         gint          height,
+                         gint          ypos);
+
+/* The radius is still a constant, we'll change that when the
+ * graphical interface will be built. */
+static gint radius = 3;
+...
+
+static void
+blur (GimpDrawable *drawable)
+{
+  gint         i, ii, channels;
+  gint         x1, y1, x2, y2;
+  GimpPixelRgn rgn_in, rgn_out;
+  guchar     **row;
+  guchar      *outrow;
+  gint         width, height;
+
+  gimp_progress_init ("My Blur...");
+
+  /* Gets upper left and lower right coordinates,
+   * and layers number in the image */
+  gimp_drawable_mask_bounds (drawable->drawable_id,
+                             &x1, &y1,
+                             &x2, &y2);
+  width  = x2 - x1;
+  height = y2 - y1;
+
+  channels = gimp_drawable_bpp (drawable->drawable_id);
+
+  /* Allocate a big enough tile cache */
+  gimp_tile_cache_ntiles (2 * (drawable->width /
+                               gimp_tile_width () + 1));
+
+  /* Initialises two PixelRgns, one to read original data,
+   * and the other to write output data. That second one will
+   * be merged at the end by the call to
+   * gimp_drawable_merge_shadow() */
+  gimp_pixel_rgn_init (&rgn_in,
+                       drawable,
+                       x1, y1,
+                       width, height, 
+                       FALSE, FALSE);
+  gimp_pixel_rgn_init (&rgn_out,
+                       drawable,
+                       x1, y1,
+                       width, height, 
+                       TRUE, TRUE);
+
+  /* Allocate memory for input and output tile rows */
+  init_mem (&row, &outrow, width * channels);
+
+  for (ii = -radius; ii <= radius; ii++)
+    {
+      gimp_pixel_rgn_get_row (&rgn_in,
+                              row[radius + ii],
+                              x1, y1 + CLAMP (ii, 0, height - 1), 
+                              width);
+    }
+
+  for (i = 0; i < height; i++)
+    {
+      /* To be done for each tile row */
+      process_row (row,
+                   outrow,
+                   x1, y1,
+                   width, height,
+                   channels,
+                   i);
+      gimp_pixel_rgn_set_row (&rgn_out,
+                              outrow,
+                              x1, i + y1,
+                              width);
+      /* shift tile rows to insert the new one at the end */
+      shuffle (&rgn_in,
+               row,
+               x1, y1,
+               width, height,
+               i);
+      if (i % 10 == 0)
+        gimp_progress_update ((gdouble) i / (gdouble) height);
+    }
+
+  /* We could also put that in a separate function but it's
+   * rather simple */
+  for (ii = 0; ii < 2 * radius + 1; ii++)
+    g_free (row[ii]);
+
+  g_free (row);
+  g_free (outrow);
+
+  /*  Update the modified region */
+  gimp_drawable_flush (drawable);
+  gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
+  gimp_drawable_update (drawable->drawable_id,
+                        x1, y1,
+                        width, height);
+}
+
+static void
+init_mem (guchar ***row,
+          guchar  **outrow,
+          gint      num_bytes)
+{
+  gint i;
+
+  /* Allocate enough memory for row and outrow */
+  *row = g_new (char *, (2 * radius + 1));
+
+  for (i = -radius; i <= radius; i++)
+    (*row)[i + radius] = g_new (guchar, num_bytes);
+
+  *outrow = g_new (guchar, num_bytes);
+}
+
+static void
+process_row (guchar **row,
+             guchar  *outrow,
+             gint     x1,
+             gint     y1,
+             gint     width,
+             gint     height,
+             gint     channels,
+             gint     i)
+{
+  gint j;
+
+  for (j = 0; j < width; j++)
+    {
+      gint k, ii, jj;
+      gint left = (j - radius),
+           right = (j + radius);
+
+      /* For each layer, compute the average of the
+       * (2r+1)x(2r+1) pixels */
+      for (k = 0; k < channels; k++)
+        {
+          gint sum = 0;
+
+          for (ii = 0; ii < 2 * radius + 1; ii++)
+            for (jj = left; jj <= right; jj++)
+              sum += row[ii][channels * CLAMP (jj, 0, width - 1) + k];
+
+          outrow[channels * j + k] =
+            sum / (4 * radius * radius + 4 * radius + 1);
+        }
+    }
+}
+
+static void
+shuffle (GimpPixelRgn *rgn_in,
+         guchar      **row,
+         gint          x1,
+         gint          y1,
+         gint          width,
+         gint          height,
+         gint          ypos)
+{
+  gint    i;
+  guchar *tmp_row;
+
+  /* Get tile row (i + radius + 1) into row[0] */
+  gimp_pixel_rgn_get_row (rgn_in,
+                          row[0],
+                          x1, MIN (ypos + radius + y1, y1 + height - 1),
+                          width);
+
+  /* Permute row[i] with row[i-1] and row[0] with row[2r] */
+  tmp_row = row[0];
+  for (i = 1; i < 2 * radius + 1; i++)
+    row[i - 1] = row[i];
+  row[2 * radius] = tmp_row;
+}
+

Adding a graphical interface and saving parameters

+

To let the user modify the radius, or let a non-interactive +script give it as a parameter, we now need to get back to our +run() function and settle some simple things.

+

First we create a structure to allow saving and returning +options. Usually one does this even for plug-ins with only one +parameter.

+
typedef struct
+{
+  gint radius;
+} MyBlurVals;
+
+
+/* Set up default values for options */
+static MyBlurVals bvals =
+{
+  3  /* radius */
+};
+

Next, we modify the run() function so that execution modes are +taken into account. In interactive mode and repeat last filter +mode, we try to get the last values used by the gimp_get_data() +function, which takes a unique data identifier as its first +input parameter. Usually, one uses the procedure’s name.

+

Finally, in interactive mode, we add a few lines that will build +the graphical interface allowing options modification.

+
static void
+run (const gchar      *name,
+     gint              nparams,
+     const GimpParam  *param,
+     gint             *nreturn_vals,
+     GimpParam       **return_vals)
+{
+  static GimpParam  values[1];
+  GimpPDBStatusType status = GIMP_PDB_SUCCESS;
+  GimpRunMode       run_mode;
+  GimpDrawable     *drawable;
+
+  /* Setting mandatory output values */
+  *nreturn_vals = 1;
+  *return_vals  = values;
+
+  values[0].type = GIMP_PDB_STATUS;
+  values[0].data.d_status = status;
+
+  /* Getting run_mode - we won't display a dialog if 
+   * we are in NONINTERACTIVE mode */
+  run_mode = param[0].data.d_int32;
+
+  /*  Get the specified drawable  */
+  drawable = gimp_drawable_get (param[2].data.d_drawable);
+
+  switch (run_mode)
+    {
+    case GIMP_RUN_INTERACTIVE:
+      /* Get options last values if needed */
+      gimp_get_data ("plug-in-myblur", &bvals);
+
+      /* Display the dialog */
+      if (! blur_dialog (drawable))
+        return;
+      break;
+
+    case GIMP_RUN_NONINTERACTIVE:
+      if (nparams != 4)
+        status = GIMP_PDB_CALLING_ERROR;
+      if (status == GIMP_PDB_SUCCESS)
+        bvals.radius = param[3].data.d_int32;
+      break;
+
+    case GIMP_RUN_WITH_LAST_VALS:
+      /*  Get options last values if needed  */
+      gimp_get_data ("plug-in-myblur", &bvals);
+      break;
+
+    default:
+      break;
+    }
+
+  blur (drawable);
+
+  gimp_displays_flush ();
+  gimp_drawable_detach (drawable);
+
+  /*  Finally, set options in the core  */
+  if (run_mode == GIMP_RUN_INTERACTIVE)
+    gimp_set_data ("plug-in-myblur", &bvals, sizeof (MyBlurVals));
+
+  return;
+}
+

The graphical interface

+

I won’t detail GTK+ programming as this is done very well in +other places. Our first try will be very simple. We will use the +utility widget of GIMP, the GimpDialog, to create a window with +a header, a numeric control of type GtkSpinButton (associated +with a GtkAdjustment) and its label, nicely framed in a +GtkFrame.

+

In the following parts, in order to show how easy one can do +such things, I will add a preview in the dialog to show real +time effects of the parameters.

+

Our final dialog will look like this (tree generated with +Glade):

+

glade-tree.png +glade-tree-small.png +Glade tree

+

In The GIMP 2.2, there is a number of widgets that come bundled +with parameters that allow a coherent behaviour, consistent with +GNOME Human Interface Guidelines. GimpPreview also appeared in +2.2. Let’s make a first try without it:

+

blur_dialog1.png +Blur dialog

+
static gboolean
+blur_dialog (GimpDrawable *drawable)
+{
+	GtkWidget *dialog;
+	GtkWidget *main_vbox;
+	GtkWidget *main_hbox;
+	GtkWidget *frame;
+	GtkWidget *radius_label;
+	GtkWidget *alignment;
+	GtkWidget *spinbutton;
+	GtkObject *spinbutton_adj;
+	GtkWidget *frame_label;
+	gboolean   run;
+
+	gimp_ui_init ("myblur", FALSE);
+
+	dialog = gimp_dialog_new ("My blur", "myblur",
+		                      NULL, 0,
+		                      gimp_standard_help_func, "plug-in-myblur",
+
+		                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		                      GTK_STOCK_OK,     GTK_RESPONSE_OK,
+
+		                      NULL);
+
+	main_vbox = gtk_vbox_new (FALSE, 6);
+	gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
+	gtk_widget_show (main_vbox);
+
+	frame = gtk_frame_new (NULL);
+	gtk_widget_show (frame);
+	gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
+	gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
+
+	alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
+	gtk_widget_show (alignment);
+	gtk_container_add (GTK_CONTAINER (frame), alignment);
+	gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6);
+
+	main_hbox = gtk_hbox_new (FALSE, 0);
+	gtk_widget_show (main_hbox);
+	gtk_container_add (GTK_CONTAINER (alignment), main_hbox);
+
+	radius_label = gtk_label_new_with_mnemonic ("_Radius:");
+	gtk_widget_show (radius_label);
+	gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6);
+	gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT);
+
+	spinbutton_adj = gtk_adjustment_new (3, 1, 16, 1, 5, 5);
+	spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
+	gtk_widget_show (spinbutton);
+	gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 6);
+	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+
+	frame_label = gtk_label_new ("<b>Modify radius</b>");
+	gtk_widget_show (frame_label);
+	gtk_frame_set_label_widget (GTK_FRAME (frame), frame_label);
+	gtk_label_set_use_markup (GTK_LABEL (frame_label), TRUE);
+
+	g_signal_connect (spinbutton_adj, "value_changed",
+		              G_CALLBACK (gimp_int_adjustment_update),
+		              &bvals.radius);
+	gtk_widget_show (dialog);
+
+	run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
+
+	gtk_widget_destroy (dialog);
+
+	return run;
+}
+

Adding a GimpPreview

+

Adding a GimpPreview is quite easy. First we create a GtkWidget +with gimp_drawable_preview_new(), then we attach an invalidated +signal to it, which will call the blur function to update the +preview. We also add a second parameter to MyBlurVals to +remember the activation state of the preview.

+

A method to update easily the preview is to add a preview +parameter in the blur function, and if preview is not NULL, to +take GimpPreview limits. So when we call blur from run(), we set +the preview parameter to NULL.

+

To take GimpPreview limits, we use gimp_preview_get_position() +and gimp_preview_get_size(), so we can generate only what will +be displayed.

+

To achieve this the right way we’ll tune some of the code - we +don’t need to update the progress bar while generating the +preview, and we should tell at GimpPixelRgn init time that the +tiles should not be sent back to the core.

+

Finally, we display the updated preview with the +gimp_drawable_preview_draw_region() function. We get a dialog +box that shows us in real time the plug-in effects. Moreover, +thanks to the GIMP core, our plug-in already takes selections +into account.

-
<para>
-  A tile is an image data block with a 64x64 size. Usually, tiles
-  are sent to the plug-in on demand one by one, by shared memory.
-  Of course this process needs huge resources and should be
-  avoided.
-</para>
-
-<para>
-  Usually, one doesn't need any particular cache, each tile is
-  sent when one needs it and freed when one asks for another one.
-  Nevertheless, we can tell our plug-in to keep a tile cache to
-  avoid this constant round trip, by calling the function:
-</para>
-
-<programlisting>
-<![CDATA[
-  gimp_tile_cache_ntiles (gulong ntiles);
- ]]>
-</programlisting>
-
-<para>
-  In the second part example, we called gimp_pixel_rgn_get_row()
-  and gimp_pixel_rgn_set_row() but without using any cache.
-</para>
-
-<para>
-  The number of tiles in a tile row will be the layer width
-  divided by the tile width, plus one. So, for a layer width of
-  65, we will cache two tiles. As we usually also process shadow
-  tiles, we can double that number to compute the ideal cache size
-  for our plug-in.
-</para>
-
-<programlisting>
-<![CDATA[
+

Here are the two functions in their last version:

+
static void
+blur (GimpDrawable *drawable,
+      GimpPreview  *preview)
+{
+  gint         i, ii, channels;
+  gint         x1, y1, x2, y2;
+  GimpPixelRgn rgn_in, rgn_out;
+  guchar     **row;
+  guchar      *outrow;
+  gint         width, height;
+
+  if (!preview)
+    gimp_progress_init ("My Blur...");
+
+  /* Gets upper left and lower right coordinates,
+   * and layers number in the image */
+  if (preview)
+  {
+    gimp_preview_get_position (preview, &x1, &y1);
+    gimp_preview_get_size (preview, &width, &height);
+    x2 = x1 + width;
+    y2 = y1 + height;
+  }
+  else
+  {
+    gimp_drawable_mask_bounds (drawable->drawable_id,
+                               &x1, &y1,
+                               &x2, &y2);
+    width = x2 - x1;
+    height = y2 - y1;
+  }
+
+  channels = gimp_drawable_bpp (drawable->drawable_id);
+
+  /* Allocate a big enough tile cache */
   gimp_tile_cache_ntiles (2 * (drawable->width / 
-                          gimp_tile_width () + 1));
- ]]>
-</programlisting>
-
-<para>
-  With the cache, our slow plug-in becomes fast. On a 300x300
-  selection, our last blur took 3 seconds, but on a 2000x1500
-  selection it was much slower - 142 seconds.
-</para>
-
-<para>
-  Adding the above line of code, things are getting better: 11
-  seconds. We still lose transition time when we reach tile
-  borders, we can go down to 10 seconds when multiplying by 4
-  instead of 2 (meaning we cache two tiles rows), but the more
-  tiles we cache, the more hard disk access we make, which reduce
-  the time gain at a point.
-</para>
-
- + gimp_tile_width () + 1)); + + /* Initialises two PixelRgns, one to read original data, + * and the other to write output data. That second one will + * be merged at the end by the call to + * gimp_drawable_merge_shadow() */ + gimp_pixel_rgn_init (&rgn_in, + drawable, + x1, y1, + width, height, + FALSE, FALSE); + gimp_pixel_rgn_init (&rgn_out, + drawable, + x1, y1, + width, height, + preview == NULL, TRUE); + + /* Allocate memory for input and output tile rows */ + init_mem (&row, &outrow, width * channels); + + for (ii = -bvals.radius; ii <= bvals.radius; ii++) + { + gimp_pixel_rgn_get_row (&rgn_in, + row[bvals.radius + ii], + x1, y1 + CLAMP (ii, 0, height - 1), + width); + } + + for (i = 0; i < height; i++) + { + /* To be done for each tile row */ + process_row (row, + outrow, + x1, y1, + width, height, + channels, + i); + gimp_pixel_rgn_set_row (&rgn_out, + outrow, + x1, i + y1, + width); + /* shift tile rows to insert the new one at the end */ + shuffle (&rgn_in, + row, + x1, y1, + width, height, + i); + if (i % 10 == 0 && !preview) + gimp_progress_update ((gdouble) i / (gdouble) height); + } + + for (ii = 0; ii < 2 * bvals.radius + 1; ii++) + g_free (row[ii]); + + g_free (row); + g_free (outrow); + + /* Update the modified region */ + if (preview) + { + gimp_drawable_preview_draw_region (GIMP_DRAWABLE_PREVIEW (preview), + &rgn_out); + } + else + { + gimp_drawable_flush (drawable); + gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); + gimp_drawable_update (drawable->drawable_id, + x1, y1, + width, height); + } +} + +static gboolean +blur_dialog (GimpDrawable *drawable) +{ + GtkWidget *dialog; + GtkWidget *main_vbox; + GtkWidget *main_hbox; + GtkWidget *preview; + GtkWidget *frame; + GtkWidget *radius_label; + GtkWidget *alignment; + GtkWidget *spinbutton; + GtkObject *spinbutton_adj; + GtkWidget *frame_label; + gboolean run; + + gimp_ui_init ("myblur", FALSE); + + dialog = gimp_dialog_new ("My blur", "myblur", + NULL, 0, + gimp_standard_help_func, "plug-in-myblur", + + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + + NULL); + + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox); + gtk_widget_show (main_vbox); + + preview = gimp_drawable_preview_new (drawable, &bvals.preview); + gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0); + gtk_widget_show (preview); + + frame = gimp_frame_new ("Blur radius"); + gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); + gtk_widget_show (frame); + + alignment = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_show (alignment); + gtk_container_add (GTK_CONTAINER (frame), alignment); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6); + + main_hbox = gtk_hbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12); + gtk_widget_show (main_hbox); + gtk_container_add (GTK_CONTAINER (alignment), main_hbox); + + radius_label = gtk_label_new_with_mnemonic ("_Radius:"); + gtk_widget_show (radius_label); + gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6); + gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT); + + spinbutton = gimp_spin_button_new (&spinbutton_adj, bvals.radius, + 1, 32, 1, 1, 1, 5, 0); + gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 0); + gtk_widget_show (spinbutton); + + g_signal_connect_swapped (preview, "invalidated", + G_CALLBACK (blur), + drawable); + g_signal_connect_swapped (spinbutton_adj, "value_changed", + G_CALLBACK (gimp_preview_invalidate), + preview); + + blur (drawable, GIMP_PREVIEW (preview)); + + g_signal_connect (spinbutton_adj, "value_changed", + G_CALLBACK (gimp_int_adjustment_update), + &bvals.radius); + gtk_widget_show (dialog); + + run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); + + gtk_widget_destroy (dialog); + + return run; +} +

Have a look at the tiled, +UI or +preview blur complete code.

+

Conclusion

+

In these articles, we saw basic concepts for several aspects of +a GIMP plug-in. We messed with image data treatment through a +simple algorithm, and followed a path that showed us how to +avoid performance problems. Finally, we generalised the +algorithm and added parameters to it, and we used some GIMP +widgets to make a nice user interface.

+

Thanks

+

Thanks to my wife Anne and to David Odin (preview master) for +helping me while I was writing this article.

-
<para>
-  We can modify the algorithm to take a parameter into account:
-  radius. With a radius of 3, the neighbourhood of a pixel will be
-  7x7, instead of 3x3 with a radius of 1. To achieve this I modify
-  the previous algorithm:
-  <itemizedlist>
-    <listitem>allocate space for 2r+1 tile rows</listitem>
-    <listitem>initialise this rows array, taking care of
-    borders</listitem>
-    <listitem>for each tile row
-      <itemizedlist>
-        <listitem>for each pixel in the tile row
-          <itemizedlist>
-            <listitem>compute the neighbourhood average, taking
-            care of borders</listitem>
-          </itemizedlist>
-        </listitem>
-        <listitem>get a new tile row and cycle rows</listitem>
-      </itemizedlist>
-    </listitem>
-  </itemizedlist>
-</para>
-
-<para>
-  This algorithm is more complex than the last one, because the
-  average computing will be a O(r²) algorithm.
-</para>
-
-<para>
-  The modified code to get this behaviour is below. Most of the
-  work is done in the process_row function. init_mem and shuffle
-  are there to keep the blur code clean and small.
-</para>
-
-
    <![CDATA[    
-      static void blur        (GimpDrawable *drawable);
-
-      static void init_mem    (guchar     ***row,
-                               guchar      **outrow,
-                               gint          num_bytes);
-      static void process_row (guchar      **row,
-                               guchar       *outrow,
-                               gint          x1,
-                               gint          y1,
-                               gint          width,
-                               gint          height,
-                               gint          channels,
-                               gint          i);
-      static void shuffle     (GimpPixelRgn *rgn_in,
-                               guchar      **row,
-                               gint          x1,
-                               gint          y1,
-                               gint          width,
-                               gint          height,
-                               gint          ypos);
-
-      /* The radius is still a constant, we'll change that when the
-       * graphical interface will be built. */
-      static gint radius = 3;
-      ...
-
-      static void
-      blur (GimpDrawable *drawable)
-      {
-        gint         i, ii, channels;
-        gint         x1, y1, x2, y2;
-        GimpPixelRgn rgn_in, rgn_out;
-        guchar     **row;
-        guchar      *outrow;
-        gint         width, height;
-
-        gimp_progress_init ("My Blur...");
-
-        /* Gets upper left and lower right coordinates,
-         * and layers number in the image */
-        gimp_drawable_mask_bounds (drawable->drawable_id,
-                                   &x1, &y1,
-                                   &x2, &y2);
-        width  = x2 - x1;
-        height = y2 - y1;
-
-        channels = gimp_drawable_bpp (drawable->drawable_id);
-
-        /* Allocate a big enough tile cache */
-        gimp_tile_cache_ntiles (2 * (drawable->width /
-                                     gimp_tile_width () + 1));
-
-        /* Initialises two PixelRgns, one to read original data,
-         * and the other to write output data. That second one will
-         * be merged at the end by the call to
-         * gimp_drawable_merge_shadow() */
-        gimp_pixel_rgn_init (&rgn_in,
-                             drawable,
-                             x1, y1,
-                             width, height, 
-                             FALSE, FALSE);
-        gimp_pixel_rgn_init (&rgn_out,
-                             drawable,
-                             x1, y1,
-                             width, height, 
-                             TRUE, TRUE);
-
-        /* Allocate memory for input and output tile rows */
-        init_mem (&row, &outrow, width * channels);
-
-        for (ii = -radius; ii <= radius; ii++)
-          {
-            gimp_pixel_rgn_get_row (&rgn_in,
-                                    row[radius + ii],
-                                    x1, y1 + CLAMP (ii, 0, height - 1), 
-                                    width);
-          }
-
-        for (i = 0; i < height; i++)
-          {
-            /* To be done for each tile row */
-            process_row (row,
-                         outrow,
-                         x1, y1,
-                         width, height,
-                         channels,
-                         i);
-            gimp_pixel_rgn_set_row (&rgn_out,
-                                    outrow,
-                                    x1, i + y1,
-                                    width);
-            /* shift tile rows to insert the new one at the end */
-            shuffle (&rgn_in,
-                     row,
-                     x1, y1,
-                     width, height,
-                     i);
-            if (i % 10 == 0)
-              gimp_progress_update ((gdouble) i / (gdouble) height);
-          }
-
-        /* We could also put that in a separate function but it's
-         * rather simple */
-        for (ii = 0; ii < 2 * radius + 1; ii++)
-          g_free (row[ii]);
-
-        g_free (row);
-        g_free (outrow);
-
-        /*  Update the modified region */
-        gimp_drawable_flush (drawable);
-        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
-        gimp_drawable_update (drawable->drawable_id,
-                              x1, y1,
-                              width, height);
-      }
-
-      static void
-      init_mem (guchar ***row,
-                guchar  **outrow,
-                gint      num_bytes)
-      {
-        gint i;
-
-        /* Allocate enough memory for row and outrow */
-        *row = g_new (char *, (2 * radius + 1));
-
-        for (i = -radius; i <= radius; i++)
-          (*row)[i + radius] = g_new (guchar, num_bytes);
-
-        *outrow = g_new (guchar, num_bytes);
-      }
-
-      static void
-      process_row (guchar **row,
-                   guchar  *outrow,
-                   gint     x1,
-                   gint     y1,
-                   gint     width,
-                   gint     height,
-                   gint     channels,
-                   gint     i)
-      {
-        gint j;
-
-        for (j = 0; j < width; j++)
-          {
-            gint k, ii, jj;
-            gint left = (j - radius),
-                 right = (j + radius);
-
-            /* For each layer, compute the average of the
-             * (2r+1)x(2r+1) pixels */
-            for (k = 0; k < channels; k++)
-              {
-                gint sum = 0;
-
-                for (ii = 0; ii < 2 * radius + 1; ii++)
-                  for (jj = left; jj <= right; jj++)
-                    sum += row[ii][channels * CLAMP (jj, 0, width - 1) + k];
-
-                outrow[channels * j + k] =
-                  sum / (4 * radius * radius + 4 * radius + 1);
-              }
-          }
-      }
-
-      static void
-      shuffle (GimpPixelRgn *rgn_in,
-               guchar      **row,
-               gint          x1,
-               gint          y1,
-               gint          width,
-               gint          height,
-               gint          ypos)
-      {
-        gint    i;
-        guchar *tmp_row;
-
-        /* Get tile row (i + radius + 1) into row[0] */
-        gimp_pixel_rgn_get_row (rgn_in,
-                                row[0],
-                                x1, MIN (ypos + radius + y1, y1 + height - 1),
-                                width);
-
-        /* Permute row[i] with row[i-1] and row[0] with row[2r] */
-        tmp_row = row[0];
-        for (i = 1; i < 2 * radius + 1; i++)
-          row[i - 1] = row[i];
-        row[2 * radius] = tmp_row;
-      }
-     ]]>
-    </programlisting>
-  </section>
-
-  <section>
-    <title>Adding a graphical interface and saving parameters</title>
-
-    <para>
-      To let the user modify the radius, or let a non-interactive
-      script give it as a parameter, we now need to get back to our
-      run() function and settle some simple things.
-    </para>
-
-    <para>
-      First we create a structure to allow saving and returning
-      options. Usually one does this even for plug-ins with only one
-      parameter.
-    </para>
-
-    <programlisting>
-    <![CDATA[
-      typedef struct
-      {
-        gint radius;
-      } MyBlurVals;
-
-
-      /* Set up default values for options */
-      static MyBlurVals bvals =
-      {
-        3  /* radius */
-      };
-     ]]>
-    </programlisting>
-
-    <para>
-      Next, we modify the run() function so that execution modes are
-      taken into account. In interactive mode and repeat last filter
-      mode, we try to get the last values used by the gimp_get_data()
-      function, which takes a unique data identifier as its first
-      input parameter. Usually, one uses the procedure's name.
-    </para>
-
-    <para>
-      Finally, in interactive mode, we add a few lines that will build
-      the graphical interface allowing options modification.
-    </para>
-
-    <programlisting>
-    <![CDATA[
-      static void
-      run (const gchar      *name,
-           gint              nparams,
-           const GimpParam  *param,
-           gint             *nreturn_vals,
-           GimpParam       **return_vals)
-      {
-        static GimpParam  values[1];
-        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
-        GimpRunMode       run_mode;
-        GimpDrawable     *drawable;
-
-        /* Setting mandatory output values */
-        *nreturn_vals = 1;
-        *return_vals  = values;
-
-        values[0].type = GIMP_PDB_STATUS;
-        values[0].data.d_status = status;
-
-        /* Getting run_mode - we won't display a dialog if 
-         * we are in NONINTERACTIVE mode */
-        run_mode = param[0].data.d_int32;
-
-        /*  Get the specified drawable  */
-        drawable = gimp_drawable_get (param[2].data.d_drawable);
-
-        switch (run_mode)
-          {
-          case GIMP_RUN_INTERACTIVE:
-            /* Get options last values if needed */
-            gimp_get_data ("plug-in-myblur", &bvals);
-
-            /* Display the dialog */
-            if (! blur_dialog (drawable))
-              return;
-            break;
-
-          case GIMP_RUN_NONINTERACTIVE:
-            if (nparams != 4)
-              status = GIMP_PDB_CALLING_ERROR;
-            if (status == GIMP_PDB_SUCCESS)
-              bvals.radius = param[3].data.d_int32;
-            break;
-
-          case GIMP_RUN_WITH_LAST_VALS:
-            /*  Get options last values if needed  */
-            gimp_get_data ("plug-in-myblur", &bvals);
-            break;
-
-          default:
-            break;
-          }
-
-        blur (drawable);
-
-        gimp_displays_flush ();
-        gimp_drawable_detach (drawable);
-
-        /*  Finally, set options in the core  */
-        if (run_mode == GIMP_RUN_INTERACTIVE)
-          gimp_set_data ("plug-in-myblur", &bvals, sizeof (MyBlurVals));
-
-        return;
-      }
-     ]]>
-    </programlisting>
-  </section>
-
-  <section>
-    <title>The graphical interface</title>
-
-    <para>
-      I won't detail GTK+ programming as this is done very well in
-      other places. Our first try will be very simple. We will use the
-      utility widget of GIMP, the GimpDialog, to create a window with
-      a header, a numeric control of type GtkSpinButton (associated
-      with a GtkAdjustment) and its label, nicely framed in a
-      GtkFrame.
-    </para>
-
-    <para>
-      In the following parts, in order to show how easy one can do
-      such things, I will add a preview in the dialog to show real
-      time effects of the parameters.
-    </para>
-
-    <para>
-      Our final dialog will look like this (tree generated with
-      Glade):
-    </para>
-
-    <para role="images">
-      <ulink url="glade-tree.png">
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="glade-tree-small.png"/>
-          </imageobject>
-          <textobject>
-            <phrase>Glade tree</phrase>
-          </textobject>
-        </mediaobject>
-        Glade tree
-      </ulink>
-    </para>
-
-    <para>
-      In The GIMP 2.2, there is a number of widgets that come bundled
-      with parameters that allow a coherent behaviour, consistent with
-      GNOME Human Interface Guidelines. GimpPreview also appeared in
-      2.2. Let's make a first try without it:
-    </para>
-
-    <para role="images">
-      <mediaobject>
-        <imageobject>
-          <imagedata fileref="blur_dialog1.png"/>
-        </imageobject>
-        <textobject>
-          <phrase>Blur dialog</phrase>
-        </textobject>
-      </mediaobject>
-    </para>
-
-    <programlisting>
-    <![CDATA[
-      static gboolean
-      blur_dialog (GimpDrawable *drawable)
-      {
-        GtkWidget *dialog;
-        GtkWidget *main_vbox;
-        GtkWidget *main_hbox;
-        GtkWidget *frame;
-        GtkWidget *radius_label;
-        GtkWidget *alignment;
-        GtkWidget *spinbutton;
-        GtkObject *spinbutton_adj;
-        GtkWidget *frame_label;
-        gboolean   run;
-
-        gimp_ui_init ("myblur", FALSE);
-
-        dialog = gimp_dialog_new ("My blur", "myblur",
-                                  NULL, 0,
-                                  gimp_standard_help_func, "plug-in-myblur",
-
-                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                  GTK_STOCK_OK,     GTK_RESPONSE_OK,
-
-                                  NULL);
-
-        main_vbox = gtk_vbox_new (FALSE, 6);
-        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
-        gtk_widget_show (main_vbox);
-
-        frame = gtk_frame_new (NULL);
-        gtk_widget_show (frame);
-        gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
-        gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
-
-        alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
-        gtk_widget_show (alignment);
-        gtk_container_add (GTK_CONTAINER (frame), alignment);
-        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6);
-
-        main_hbox = gtk_hbox_new (FALSE, 0);
-        gtk_widget_show (main_hbox);
-        gtk_container_add (GTK_CONTAINER (alignment), main_hbox);
-
-        radius_label = gtk_label_new_with_mnemonic ("_Radius:");
-        gtk_widget_show (radius_label);
-        gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6);
-        gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT);
-
-        spinbutton_adj = gtk_adjustment_new (3, 1, 16, 1, 5, 5);
-        spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
-        gtk_widget_show (spinbutton);
-        gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 6);
-        gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
-
-        frame_label = gtk_label_new ("<b>Modify radius</b>");
-        gtk_widget_show (frame_label);
-        gtk_frame_set_label_widget (GTK_FRAME (frame), frame_label);
-        gtk_label_set_use_markup (GTK_LABEL (frame_label), TRUE);
-
-        g_signal_connect (spinbutton_adj, "value_changed",
-                          G_CALLBACK (gimp_int_adjustment_update),
-                          &bvals.radius);
-        gtk_widget_show (dialog);
-
-        run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
-
-        gtk_widget_destroy (dialog);
-
-        return run;
-      }
-     ]]>
-    </programlisting>
-  </section>
-
-  <section>
-    <title>Adding a GimpPreview</title>
-
-    <para>
-      Adding a GimpPreview is quite easy. First we create a GtkWidget
-      with gimp_drawable_preview_new(), then we attach an invalidated
-      signal to it, which will call the blur function to update the
-      preview. We also add a second parameter to MyBlurVals to
-      remember the activation state of the preview.
-    </para>
-
-    <para>
-      A method to update easily the preview is to add a preview
-      parameter in the blur function, and if preview is not NULL, to
-      take GimpPreview limits. So when we call blur from run(), we set
-      the preview parameter to NULL.
-    </para>
-
-    <para>
-      To take GimpPreview limits, we use gimp_preview_get_position()
-      and gimp_preview_get_size(), so we can generate only what will
-      be displayed.
-    </para>
-
-    <para>
-      To achieve this the right way we'll tune some of the code - we
-      don't need to update the progress bar while generating the
-      preview, and we should tell at GimpPixelRgn init time that the
-      tiles should not be sent back to the core.
-    </para>
-
-    <para>
-      Finally, we display the updated preview with the
-      gimp_drawable_preview_draw_region() function. We get a dialog
-      box that shows us in real time the plug-in effects. Moreover,
-      thanks to the GIMP core, our plug-in already takes selections
-      into account.
-    </para>
-
-    <para role="images">
-      <ulink url="blur_dialog2.png">
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="blur_dialog2-small.png"/>
-          </imageobject>
-          <textobject>
-            <phrase>Blur dialog, improved</phrase>
-          </textobject>
-        </mediaobject>
-        Blur dialog, improved
-      </ulink>
-    </para>
-
-    <para role="images">
-      <ulink url="blur_select.png">
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="blur_select-small.png"/>
-          </imageobject>
-          <textobject>
-            <phrase>Blur a selection</phrase>
-          </textobject>
-        </mediaobject>
-        Blur a selection
-      </ulink>
-    </para>
-
-    <para>
-      Here are the two functions in their last version:
-    </para>
-
-    <programlisting>
-    <![CDATA[
-      static void
-      blur (GimpDrawable *drawable,
-            GimpPreview  *preview)
-      {
-        gint         i, ii, channels;
-        gint         x1, y1, x2, y2;
-        GimpPixelRgn rgn_in, rgn_out;
-        guchar     **row;
-        guchar      *outrow;
-        gint         width, height;
-
-        if (!preview)
-          gimp_progress_init ("My Blur...");
-
-        /* Gets upper left and lower right coordinates,
-         * and layers number in the image */
-        if (preview)
-        {
-          gimp_preview_get_position (preview, &x1, &y1);
-          gimp_preview_get_size (preview, &width, &height);
-          x2 = x1 + width;
-          y2 = y1 + height;
-        }
-        else
-        {
-          gimp_drawable_mask_bounds (drawable->drawable_id,
-                                     &x1, &y1,
-                                     &x2, &y2);
-          width = x2 - x1;
-          height = y2 - y1;
-        }
+

This work is licensed under a Creative +Commons Attribution-NonCommercial-ShareAlike 2.5 +License.

- channels = gimp_drawable_bpp (drawable->drawable_id); - - /* Allocate a big enough tile cache */ - gimp_tile_cache_ntiles (2 * (drawable->width / - gimp_tile_width () + 1)); - - /* Initialises two PixelRgns, one to read original data, - * and the other to write output data. That second one will - * be merged at the end by the call to - * gimp_drawable_merge_shadow() */ - gimp_pixel_rgn_init (&rgn_in, - drawable, - x1, y1, - width, height, - FALSE, FALSE); - gimp_pixel_rgn_init (&rgn_out, - drawable, - x1, y1, - width, height, - preview == NULL, TRUE); - - /* Allocate memory for input and output tile rows */ - init_mem (&row, &outrow, width * channels); - - for (ii = -bvals.radius; ii <= bvals.radius; ii++) - { - gimp_pixel_rgn_get_row (&rgn_in, - row[bvals.radius + ii], - x1, y1 + CLAMP (ii, 0, height - 1), - width); - } - - for (i = 0; i < height; i++) - { - /* To be done for each tile row */ - process_row (row, - outrow, - x1, y1, - width, height, - channels, - i); - gimp_pixel_rgn_set_row (&rgn_out, - outrow, - x1, i + y1, - width); - /* shift tile rows to insert the new one at the end */ - shuffle (&rgn_in, - row, - x1, y1, - width, height, - i); - if (i % 10 == 0 && !preview) - gimp_progress_update ((gdouble) i / (gdouble) height); - } - - for (ii = 0; ii < 2 * bvals.radius + 1; ii++) - g_free (row[ii]); - - g_free (row); - g_free (outrow); - - /* Update the modified region */ - if (preview) - { - gimp_drawable_preview_draw_region (GIMP_DRAWABLE_PREVIEW (preview), - &rgn_out); - } - else - { - gimp_drawable_flush (drawable); - gimp_drawable_merge_shadow (drawable->drawable_id, TRUE); - gimp_drawable_update (drawable->drawable_id, - x1, y1, - width, height); - } - } - - static gboolean - blur_dialog (GimpDrawable *drawable) - { - GtkWidget *dialog; - GtkWidget *main_vbox; - GtkWidget *main_hbox; - GtkWidget *preview; - GtkWidget *frame; - GtkWidget *radius_label; - GtkWidget *alignment; - GtkWidget *spinbutton; - GtkObject *spinbutton_adj; - GtkWidget *frame_label; - gboolean run; - - gimp_ui_init ("myblur", FALSE); - - dialog = gimp_dialog_new ("My blur", "myblur", - NULL, 0, - gimp_standard_help_func, "plug-in-myblur", - - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - - NULL); - - main_vbox = gtk_vbox_new (FALSE, 6); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox); - gtk_widget_show (main_vbox); - - preview = gimp_drawable_preview_new (drawable, &bvals.preview); - gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0); - gtk_widget_show (preview); - - frame = gimp_frame_new ("Blur radius"); - gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0); - gtk_widget_show (frame); - - alignment = gtk_alignment_new (0.5, 0.5, 1, 1); - gtk_widget_show (alignment); - gtk_container_add (GTK_CONTAINER (frame), alignment); - gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6); - - main_hbox = gtk_hbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12); - gtk_widget_show (main_hbox); - gtk_container_add (GTK_CONTAINER (alignment), main_hbox); - - radius_label = gtk_label_new_with_mnemonic ("_Radius:"); - gtk_widget_show (radius_label); - gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6); - gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT); - - spinbutton = gimp_spin_button_new (&spinbutton_adj, bvals.radius, - 1, 32, 1, 1, 1, 5, 0); - gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 0); - gtk_widget_show (spinbutton); - - g_signal_connect_swapped (preview, "invalidated", - G_CALLBACK (blur), - drawable); - g_signal_connect_swapped (spinbutton_adj, "value_changed", - G_CALLBACK (gimp_preview_invalidate), - preview); - - blur (drawable, GIMP_PREVIEW (preview)); - - g_signal_connect (spinbutton_adj, "value_changed", - G_CALLBACK (gimp_int_adjustment_update), - &bvals.radius); - gtk_widget_show (dialog); - - run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK); - - gtk_widget_destroy (dialog); - - return run; - } - ]]> - </programlisting> - - <para> - Have a look at the <ulink url="myblur3.c">tiled</ulink>, - <ulink url="myblur4.c">UI</ulink> or - <ulink url="myblur5.c">preview</ulink> blur complete code. - </para> - </section> - - <section> - <title>Conclusion</title> - - <para> - In these articles, we saw basic concepts for several aspects of - a GIMP plug-in. We messed with image data treatment through a - simple algorithm, and followed a path that showed us how to - avoid performance problems. Finally, we generalised the - algorithm and added parameters to it, and we used some GIMP - widgets to make a nice user interface. - </para> - </section> - - <section> - <title>Thanks</title> - - <para> - Thanks to my wife Anne and to David Odin (preview master) for - helping me while I was writing this article. - </para> - </section> - - <section> - <para role="images"> - <ulink url="http://creativecommons.org/licenses/by-nc-sa/2.5/"> - <mediaobject> - <imageobject> - <imagedata fileref="http://creativecommons.org/images/public/somerights20.gif"/> - </imageobject> - <textobject> - <phrase>Creative Commons License</phrase> - </textobject> - </mediaobject> - </ulink> - </para> - - <para> - This work is licensed under a <ulink - url="http://creativecommons.org/licenses/by-nc-sa/2.5/">Creative - Commons Attribution-NonCommercial-ShareAlike 2.5 - License</ulink>. - </para> - </section> -
diff --git a/public/writing-a-plug-in/index.html b/public/writing-a-plug-in/index.html index 148c07b..09039eb 100644 --- a/public/writing-a-plug-in/index.html +++ b/public/writing-a-plug-in/index.html @@ -103,11 +103,11 @@
diff --git a/public/writing-a-plug-in/index.xml b/public/writing-a-plug-in/index.xml index 7254ad4..e087186 100644 --- a/public/writing-a-plug-in/index.xml +++ b/public/writing-a-plug-in/index.xml @@ -6,17 +6,28 @@ Recent content in Writing-a-plug-ins on GIMP Developer Resources Hugo -- gohugo.io en - Copyright 2003-2022 The GIMP Development Team + Copyright 2003-2022 The GIMP Development Team + Sat, 23 Jul 2022 00:00:00 +0000 + + How to write a GIMP plug-in, part III + https://developer.gimp.org/writing-a-plug-in/3/ + Sat, 23 Jul 2022 00:00:00 +0000 + + https://developer.gimp.org/writing-a-plug-in/3/ + Written By Dave Neary. +In the second part, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. +Introduction Let&rsquo;s have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer&rsquo;s pixel value with the average value in the neighbourhood. + + How to write a GIMP plug-in https://developer.gimp.org/writing-a-plug-in/1/ Mon, 01 Jan 0001 00:00:00 +0000 https://developer.gimp.org/writing-a-plug-in/1/ - Written By Dave Neary + Written By Dave Neary. In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors. -In this part, I present a plug-in&rsquo;s basic elements. We will see how to install a plug-in and how to get data from an image and directly manipulate it. -Architecture &lt;para role=&quot;images&quot;&gt; &lt;ulink url=&quot;architecture.png&quot;&gt; &lt;mediaobject&gt; &lt;imageobject&gt; &lt;imagedata fileref=&quot;architecture-small. +Introduction New developers are often intimidated by The GIMP size and its reputation. They think that writing a plug-in would be a difficult task. The goal of these articles is to dumb this feeling down, by showing how easily one can make a C plug-in. @@ -25,21 +36,11 @@ Architecture &lt;para role=&quot;images&quot;&gt; &lt;ulink Mon, 01 Jan 0001 00:00:00 +0000 https://developer.gimp.org/writing-a-plug-in/2/ - Written By Dave Neary + Written By Dave Neary. In the first part, I presented essential elements to build a plug-in interface with The GIMP. Now we will produce a simple but useful algorithm that we could use in our plug-in. Introduction The algorithm we are going to implement is a simple blur. It is included in The GIMP as &ldquo;Filters-&gt;Blur-&gt;Blur&rdquo; with default parameters. That algorithm is very simple. Each pixel in our image is replaced by a mean value of its neighbours. - - How to write a GIMP plug-in, part III - https://developer.gimp.org/writing-a-plug-in/3/ - Mon, 01 Jan 0001 00:00:00 +0000 - - https://developer.gimp.org/writing-a-plug-in/3/ - Written By Dave Neary -In the &lt;olink targetdocent=&quot;writing-a-plug-in-2&quot;&gt;second part&lt;/olink&gt;, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. &lt;para&gt; Let's have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer's pixel value with the average value in the neighbourhood. - - -- GitLab From 317b64874299888e87fb9ec72e853e60ff1ee9b0 Mon Sep 17 00:00:00 2001 From: Robin Swift Date: Sun, 24 Jul 2022 12:59:09 +0000 Subject: [PATCH 6/8] pipeline setup --- .gitlab-ci.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..b24307b --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,15 @@ + + +image: registry.gitlab.com/pages/hugo/hugo_extended:latest + +variables: + GIT_SUBMODULE_STRATEGY: recursive + +pages: + script: + - hugo + artifacts: + paths: + - public + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH -- GitLab From 5ce17fa8b0ee4741d0230db4a0922fdc5a213dc0 Mon Sep 17 00:00:00 2001 From: robin-swift Date: Sun, 24 Jul 2022 14:13:06 +0100 Subject: [PATCH 7/8] fixing mangled names and adding a build script --- content/default.css | 6 +++--- scripts/make_api_docs.sh | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100755 scripts/make_api_docs.sh diff --git a/content/default.css b/content/default.css index 597c8cd..de43de1 100644 --- a/content/default.css +++ b/content/default.css @@ -4,9 +4,9 @@ * so keep a backup of this file while working with it. Niklas */ /* Copyright (C) 2002-2006 by The GIMP Web Team - Contributions by: - * Ville Pätsi (drc), Henrik Brix Andersen (brix), Carol Spears - * (carol), Niklas Mattisson (scizzo), Raphaël Quinet (raphael), - * Branko Collin (branko), Sven Neumann (neo) and Øyvind KolÃ¥s + * Ville Pätsi (drc), Henrik Brix Andersen (brix), Carol Spears + * (carol), Niklas Mattisson (scizzo), Raphaël Quinet (raphael), + * Branko Collin (branko), Sven Neumann (neo) and Øyvind Kolås * (pippin) * * This style sheet and corresponding site layout are designed to be diff --git a/scripts/make_api_docs.sh b/scripts/make_api_docs.sh new file mode 100755 index 0000000..b7c00d9 --- /dev/null +++ b/scripts/make_api_docs.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# git clone https://gitlab.gnome.org/GNOME/gimp + +function build_api_docs () { +rm -fr gimp_$1 +cp -r gimp gimp_$1 +cd gimp_$1 +git checkout $1 +aclocal +autoupdate +autoconf +libtoolize +automake --add-missing +./configure --prefix=`pwd` --enable-gtk-doc --enable-gtk-doc-app \ + --disable-python +make +make install +cd .. +} + +build_api_docs GIMP_2_7_5 +build_api_docs GIMP_2_8_8 +build_api_docs GIMP_2_9_8 +build_api_docs GIMP_2_10_32 -- GitLab From aadddc94b28cbaef9e42a2947a0271d94f226b2a Mon Sep 17 00:00:00 2001 From: robin-swift Date: Tue, 19 Jul 2022 00:44:12 +0100 Subject: [PATCH 8/8] putting wiki scrape here for safekeeping --- wiki/Algorithm_Index-20210118143033-edit.txt | 1 + wiki/Algorithms-20201031072416-show.txt | 2 + wiki/Algorithms-20201124152652-edit.txt | 1 + wiki/Algorithms-20210518041020-show.txt | 2 + wiki/Algorithms:Flood-20201026071702-edit.txt | 1 + wiki/Build:Basic-20150910223625-show.txt | 76 + ...ategory:Algorithms-20161017122944-show.txt | 14 + ...Documentation:Main-20161024003532-edit.txt | 67 + ...Documentation:Main-20180812150616-show.txt | 83 ++ ...Documentation:Main-20200811194509-edit.txt | 67 + ...Documentation:Main-20210512212113-edit.txt | 67 + ...ation:RoadmapIdeas-20150910071238-edit.txt | 48 + ...ation:RoadmapIdeas-20161024014527-show.txt | 71 + wiki/Extensions-20180812150612-show.txt | 153 ++ wiki/Extensions-20200923033421-edit.txt | 119 ++ wiki/Extensions-20210616195653-edit.txt | 119 ++ wiki/Flood_algorithm-20161017125542-show.txt | 370 +++++ wiki/Flood_algorithm-20210118151058-edit.txt | 306 ++++ ...veloper_Wiki:About-20141215232808-show.txt | 5 + ...veloper_Wiki:About-20150905122805-show.txt | 5 + ...veloper_Wiki:About-20151025020958-show.txt | 5 + ...veloper_Wiki:About-20151224135532-show.txt | 5 + ...veloper_Wiki:About-20160630081449-show.txt | 5 + ...veloper_Wiki:About-20161025044731-show.txt | 5 + ...veloper_Wiki:About-20161126033457-show.txt | 5 + ...veloper_Wiki:About-20170710173104-show.txt | 5 + ...veloper_Wiki:About-20180812150552-show.txt | 5 + ...veloper_Wiki:About-20190507091741-show.txt | 5 + ...veloper_Wiki:About-20210125182120-show.txt | 5 + ...veloper_Wiki:About-20210506011106-show.txt | 5 + ...veloper_Wiki:About-20210518052644-edit.txt | 1 + ...veloper_Wiki:About-20210818153540-show.txt | 5 + wiki/GIMP_Roadmap-20151020114621-edit.txt | 1 + wiki/GIMP_Roadmap-20161009222107-show.txt | 138 ++ wiki/Glossary-20161024174322-edit.txt | 638 ++++++++ wiki/Glossary-20161029172043-show.txt | 890 ++++++++++++ wiki/Glossary-20170710195736-show.txt | 890 ++++++++++++ wiki/Glossary-20210515121423-edit.txt | 638 ++++++++ ...ic_tablets_support-20210622010105-edit.txt | 21 + ...:API_documentation-20201124150526-edit.txt | 53 + ...:API_documentation-20210513021905-edit.txt | 53 + ...:API_documentation-20210818153228-show.txt | 59 + ...:API_documentation-20210818153245-show.txt | 59 + ...acking:Basic_build-20150912093455-show.txt | 76 + ...acking:Basic_build-20151228090519-edit.txt | 75 + ...uilding%2FLinux-20140901172111-history.txt | 5 + ...g:Building%2FLinux-20140901172119-edit.txt | 4 + ...g:Building%2FLinux-20140901175130-show.txt | 243 ++++ ...g:Building%2FLinux-20201022143903-edit.txt | 61 + ...g:Building%2FLinux-20210512194925-edit.txt | 63 + ...Building%2FWindows-20140901110311-show.txt | 388 +++++ ...Building%2FWindows-20140901122002-edit.txt | 4 + ...Building%2FWindows-20201028000025-edit.txt | 487 +++++++ ...Building%2FWindows-20210513030349-edit.txt | 489 +++++++ ...ng:Building%2Linux-20210108005109-show.txt | 74 + ...ng:Building%2Linux-20210818145611-show.txt | 77 + ...:Building%2Windows-20201108092724-show.txt | 543 +++++++ ...:Building%2Windows-20210830111407-show.txt | 545 +++++++ wiki/Hacking:Building-20150212064206-show.txt | 89 ++ wiki/Hacking:Building-20150905134141-show.txt | 89 ++ wiki/Hacking:Building-20151014043535-show.txt | 89 ++ wiki/Hacking:Building-20160112224754-show.txt | 106 ++ wiki/Hacking:Building-20160630044241-show.txt | 107 ++ wiki/Hacking:Building-20161025144126-show.txt | 107 ++ wiki/Hacking:Building-20161126033513-show.txt | 107 ++ wiki/Hacking:Building-20170710173015-show.txt | 107 ++ wiki/Hacking:Building-20180812150558-show.txt | 107 ++ wiki/Hacking:Building-20190507091730-show.txt | 113 ++ wiki/Hacking:Building-20210107042759-show.txt | 339 +++++ wiki/Hacking:Building-20210119124306-edit.txt | 285 ++++ wiki/Hacking:Building-20210420220910-show.txt | 339 +++++ wiki/Hacking:Building-20210506133726-show.txt | 339 +++++ wiki/Hacking:Building-20210620190210-edit.txt | 287 ++++ ...uilding_with_Meson-20200806151232-edit.txt | 4 + ...Snippets%2FGObject-20140901172129-show.txt | 68 + ...Snippets%2FGObject-20140901180426-edit.txt | 4 + ...Snippets%2FGObject-20201028003224-edit.txt | 64 + ...Snippets%2FGObject-20210116190613-edit.txt | 64 + ...2FMiscellaneous-20140901211444-history.txt | 5 + ...ts%2FMiscellaneous-20140901211509-edit.txt | 4 + ...ts%2FMiscellaneous-20140901212705-show.txt | 49 + ...ts%2FMiscellaneous-20161024174623-edit.txt | 39 + ...ts%2FMiscellaneous-20210124031932-edit.txt | 39 + ...ts%2FMiscellaneous-20210513093525-edit.txt | 39 + ...ets%2FScript-Fu-20140901154412-history.txt | 5 + ...ippets%2FScript-Fu-20140901161526-show.txt | 69 + ...ippets%2FScript-Fu-20161024001833-edit.txt | 67 + ...ippets%2FScript-Fu-20200923025950-edit.txt | 67 + ...ippets%2FScript-Fu-20210512200540-edit.txt | 67 + ..._Snippets%2GObject-20220210134900-show.txt | 68 + ..._Snippets%2GObject-20220210141435-show.txt | 68 + ...ets%2Miscellaneous-20180812150601-show.txt | 40 + ...nippets%2Script-Fu-20180812150602-show.txt | 69 + ...king:Code_Snippets-20200923025233-edit.txt | 1 + ...king:Code_Snippets-20210303173835-edit.txt | 1 + ...king:Code_Snippets-20210816142242-show.txt | 5 + ...cking:Debug%2FTest-20200806141144-edit.txt | 82 ++ ...acking:Debug%2Test-20201028005149-show.txt | 148 ++ ...acking:Debug%2Test-20210818164743-show.txt | 329 +++++ ...eeting_14_Mar_2011-20150911224948-edit.txt | 376 +++++ ...eeting_14_Mar_2011-20161024020553-show.txt | 390 +++++ ...eeting_19_Apr_2011-20190507091738-show.txt | 38 + ...eeting_20_Apr_2011-20200806134821-show.txt | 38 + ...eeting_20_Apr_2011-20210416105655-edit.txt | 1 + ...eeting_28_Feb_2011-20150911044138-edit.txt | 488 +++++++ ...eeting_28_Feb_2011-20161126033528-show.txt | 508 +++++++ ...eeting_28_Feb_2011-20200126023332-show.txt | 508 +++++++ ...eeting_28_Mar_2011-20150911043918-edit.txt | 57 + ...eeting_28_Mar_2011-20161024002630-show.txt | 92 ++ ...eeting_28_Mar_2011-20210417225721-edit.txt | 57 + ...king:Developer_FAQ-20170710205211-show.txt | 465 ++++++ ...king:Developer_FAQ-20201115193707-show.txt | 465 ++++++ ...king:Developer_FAQ-20201123020435-show.txt | 465 ++++++ ...king:Developer_FAQ-20210515120627-edit.txt | 381 +++++ ...king:Developer_FAQ-20211122115844-show.txt | 465 ++++++ ...Developer_Meetings-20161024020212-edit.txt | 20 + ...Developer_Meetings-20170710205256-show.txt | 23 + ...Developer_Meetings-20201124143235-edit.txt | 20 + ...Developer_Meetings-20210515163235-edit.txt | 20 + wiki/Hacking:Eclipse-20150911221746-edit.txt | 120 ++ wiki/Hacking:Eclipse-20171105101404-show.txt | 153 ++ wiki/Hacking:Eclipse-20210515112800-edit.txt | 120 ++ wiki/Hacking:Emacs-20150910222259-edit.txt | 46 + wiki/Hacking:Emacs-20161024001914-show.txt | 44 + ...lin,_Germany,_2000-20150906183933-show.txt | 13 + ...lin,_Germany,_2000-20150911224822-edit.txt | 9 + ...lin,_Germany,_2000-20161024010119-show.txt | 13 + ...lin,_Germany,_2000-20200811183201-edit.txt | 9 + ...lin,_Germany,_2003-20150906164319-show.txt | 284 ++++ ...lin,_Germany,_2003-20150910192759-edit.txt | 250 ++++ ...lin,_Germany,_2003-20161024011955-show.txt | 284 ++++ ...sand,_Norway,_2004-20150906182230-show.txt | 135 ++ ...sand,_Norway,_2004-20150911043951-edit.txt | 113 ++ ...sand,_Norway,_2004-20161024001757-show.txt | 135 ++ ...art,_Germany,_2005-20150911225818-edit.txt | 66 + ...art,_Germany,_2005-20161024014518-show.txt | 85 ++ ...Lyon,_France,_2006-20150907021633-show.txt | 182 +++ ...Lyon,_France,_2006-20150914162213-edit.txt | 153 ++ ...Lyon,_France,_2006-20161024012630-show.txt | 182 +++ ...king:GSOC%2Archive-20161109165241-show.txt | 520 +++++++ ...king:GSOC%2Archive-20180812150611-show.txt | 520 +++++++ ...ing:GSOC%2FArchive-20140901134801-show.txt | 616 ++++++++ ...:GSOC%2FArchive-20140901141912-history.txt | 5 + ...ing:GSOC%2FArchive-20140901145810-edit.txt | 4 + ...ing:GSOC%2FArchive-20161024003038-edit.txt | 431 ++++++ ...ing:GSOC%2FArchive-20210124015050-edit.txt | 431 ++++++ ...ing:GSOC%2FArchive-20210513081836-edit.txt | 431 ++++++ wiki/Hacking:GSOC-20200923035123-edit.txt | 38 + ...cking:GSOC_Archive-20151230115515-edit.txt | 1 + ...cking:GSOC_Archive-20161225035744-show.txt | 520 +++++++ ...:GSoC%22011%2Ideas-20161225100135-show.txt | 238 +++ ...:GSoC%22014%2Ideas-20210818113443-show.txt | 97 ++ ...:GSoC%22015%2Ideas-20161023235701-show.txt | 97 ++ ...SoC%2F2011%2FIdeas-20161225102144-edit.txt | 198 +++ ...SoC%2F2011%2FIdeas-20210124020722-edit.txt | 198 +++ ...SoC%2F2014%2FIdeas-20140901202248-edit.txt | 4 + ...SoC%2F2014%2FIdeas-20140901212233-show.txt | 74 + ...%2F2014%2FIdeas-20140901212825-history.txt | 5 + ...SoC%2F2014%2FIdeas-20200804085807-edit.txt | 1 + ...SoC%2F2014%2FIdeas-20210506070749-edit.txt | 1 + ...SoC%2F2015%2FIdeas-20161024015614-edit.txt | 64 + ...SoC%2F2015%2FIdeas-20200806164711-edit.txt | 64 + ...C%2FFuture%2FIdeas-20140901191025-edit.txt | 4 + ...C%2FFuture%2FIdeas-20140901193434-show.txt | 360 +++++ ...FFuture%2FIdeas-20140901194740-history.txt | 5 + ...C%2FFuture%2FIdeas-20161024002752-edit.txt | 246 ++++ ...C%2FFuture%2FIdeas-20200804084700-edit.txt | 233 +++ ...C%2FFuture%2FIdeas-20210515112335-edit.txt | 233 +++ ...SoC%2Future%2Ideas-20170710184350-show.txt | 304 ++++ wiki/Hacking:GSoC-20200923035123-edit.txt | 38 + wiki/Hacking:GSoC-20210512205259-edit.txt | 38 + wiki/Hacking:GSoC-20210818022312-show.txt | 55 + wiki/Hacking:GSoC-20210818022507-show.txt | 55 + ...ite_a_GIMP_plug-in-20150906163752-show.txt | 1289 +++++++++++++++++ ...ite_a_GIMP_plug-in-20150910163259-edit.txt | 1214 ++++++++++++++++ ...A9al,_Canada,_2007-20161024015943-show.txt | 31 + ...ics_Meeting,_Montr-20150911044159-edit.txt | 28 + ...82aw,_Poland,_2008-20161024010128-show.txt | 31 + ...82aw,_Poland,_2008-20210206164023-show.txt | 31 + ...hics_Meeting,_Wroc-20150910192647-edit.txt | 26 + ...A9al,_Canada,_2009-20161009100056-show.txt | 18 + ...ics_Meeting,_Montr-20150911044733-edit.txt | 13 + ...els,_Belgium,_2010-20150911054012-edit.txt | 11 + ...els,_Belgium,_2010-20161024013724-show.txt | 16 + ...A9al,_Canada,_2011-20161024003011-show.txt | 16 + ...ics_Meeting,_Montr-20150911044820-edit.txt | 12 + ...nna,_Austria,_2012-20150911043802-edit.txt | 20 + ...nna,_Austria,_2012-20161024013729-show.txt | 24 + ...adrid,_Spain,_2013-20150914160233-edit.txt | 98 ++ ...adrid,_Spain,_2013-20161024001809-show.txt | 127 ++ ...zig,_Germany,_2014-20150911065020-edit.txt | 68 + ...zig,_Germany,_2014-20161024020118-show.txt | 57 + ...ng_lisanet.de_fork-20161024174608-edit.txt | 313 ++++ ...ng_lisanet.de_fork-20180812150613-show.txt | 333 +++++ ...ng_lisanet.de_fork-20201028005049-edit.txt | 313 ++++ wiki/Hacking:Netbeans-20150910192804-edit.txt | 40 + wiki/Hacking:Netbeans-20161024010114-show.txt | 57 + wiki/Hacking:Patches-20161024001850-edit.txt | 60 + wiki/Hacking:Patches-20180812150605-show.txt | 81 ++ ...ng:Plugin_registry-20161024013437-edit.txt | 126 ++ ...ng:Plugin_registry-20161109163337-show.txt | 156 ++ ...ng:Plugin_registry-20180812150613-show.txt | 156 ++ ...ng:Plugin_registry-20201028003355-edit.txt | 126 ++ wiki/Hacking:Plugins-20200923041814-edit.txt | 130 ++ wiki/Hacking:Plugins-20210512211343-edit.txt | 132 ++ wiki/Hacking:Plugins-20210617154825-show.txt | 149 ++ wiki/Hacking:Plugins-20210701161100-show.txt | 149 ++ ...Hacking:Plugins_v3-20210622040546-edit.txt | 106 ++ ...ns_to_GEGL_and_GIO-20201025001535-edit.txt | 186 +++ ...ns_to_GEGL_and_GIO-20210816235742-show.txt | 203 +++ ...o_GEGL%2FUI_review-20201028005243-edit.txt | 38 + ...o_GEGL%2FUI_review-20210518054200-edit.txt | 38 + ...to_GEGL%2UI_review-20210818214334-show.txt | 42 + ...ng_filters_to_GEGL-20141226014626-show.txt | 533 +++++++ ...ng_filters_to_GEGL-20150905062156-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20151007050152-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20160112231213-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20160630022533-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20160927041606-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20161028235537-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20161120184915-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20170710172113-show.txt | 514 +++++++ ...ng_filters_to_GEGL-20180812150558-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20190507091745-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20190910220828-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20201112031545-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20201113064505-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20201129020105-edit.txt | 473 ++++++ ...ng_filters_to_GEGL-20210505211634-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20210506133935-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20210620064607-edit.txt | 473 ++++++ ...ng_filters_to_GEGL-20210818145443-show.txt | 516 +++++++ ...ng_filters_to_GEGL-20220205071048-show.txt | 516 +++++++ ...lems_and_solutions-20150212064210-show.txt | 980 +++++++++++++ ...lems_and_solutions-20150905105223-show.txt | 980 +++++++++++++ ...lems_and_solutions-20151008021106-show.txt | 980 +++++++++++++ ...lems_and_solutions-20160111063721-show.txt | 980 +++++++++++++ ...lems_and_solutions-20160630081500-show.txt | 980 +++++++++++++ ...lems_and_solutions-20161007061623-show.txt | 980 +++++++++++++ ...lems_and_solutions-20161107214435-show.txt | 980 +++++++++++++ ...lems_and_solutions-20161126033518-show.txt | 980 +++++++++++++ ...lems_and_solutions-20170710222754-show.txt | 980 +++++++++++++ ...lems_and_solutions-20190507091739-show.txt | 980 +++++++++++++ ...lems_and_solutions-20200126023318-show.txt | 1083 ++++++++++++++ ...lems_and_solutions-20210125182122-show.txt | 1242 ++++++++++++++++ ...lems_and_solutions-20210506184322-show.txt | 1242 ++++++++++++++++ ...lems_and_solutions-20210513103541-edit.txt | 1129 +++++++++++++++ ...lems_and_solutions-20210818012237-show.txt | 1258 ++++++++++++++++ wiki/Hacking:ScriptFu-20210515114158-show.txt | 343 +++++ ...acking:Source_Tree-20161024001818-edit.txt | 146 ++ ...acking:Source_Tree-20170706070708-show.txt | 228 +++ ...acking:Source_Tree-20201028001831-edit.txt | 146 ++ ...acking:Source_Tree-20210515084512-edit.txt | 146 ++ wiki/Hacking:TODO-20160927032812-show.txt | 276 ++++ wiki/Hacking:TODO-20201025000632-edit.txt | 95 ++ wiki/Hacking:TODO-20210125182125-show.txt | 113 ++ wiki/Hacking:TODO-20210518053713-edit.txt | 95 ++ wiki/Hacking:TODO-20210608113340-show.txt | 113 ++ wiki/Hacking:Tools-20161024012059-edit.txt | 10 + wiki/Hacking:Tools-20210816102059-show.txt | 15 + ...FUI_design_info-20140901130309-history.txt | 5 + ...l%2FUI_design_info-20140901130759-edit.txt | 4 + ...l%2FUI_design_info-20140901133827-show.txt | 101 ++ ...l%2FUI_design_info-20161024020045-edit.txt | 66 + ...l%2FUI_design_info-20201124151511-edit.txt | 66 + ...l%2FUI_design_info-20210514160613-edit.txt | 66 + ...ol%2UI_design_info-20180812150601-show.txt | 90 ++ ...Building%2FMac_OSX-20140901173819-show.txt | 7 + ...Building%2FMac_OSX-20140901181141-edit.txt | 4 + ...lding%2FMac_OSX-20140901181654-history.txt | 5 + ...Building%2FMac_OSX-20161024010200-edit.txt | 3 + ...Building%2FMac_OSX-20210515121756-edit.txt | 9 + ..._Building%2Mac_OSX-20180812150603-show.txt | 7 + ...cking:fast_plug-in-20150910192607-show.txt | 196 +++ wiki/Hacking:pdbgen-20150908170739-edit.txt | 1 + wiki/Hacking:pdbgen-20161024012354-show.txt | 5 + wiki/Hacking:pdbgen-20201125224303-edit.txt | 1 + ...cking:slow_plug-in-20150910163345-show.txt | 199 +++ ...cking:slow_plug-in-20151225224544-edit.txt | 198 +++ ...ndex_of_Algorithms-20161017122923-edit.txt | 17 + ...ndex_of_Algorithms-20180812150606-show.txt | 20 + wiki/LGM2014Minutes-20141108144820-edit.txt | 310 ++++ wiki/LGM2014Minutes-20150905195224-show.txt | 388 +++++ wiki/Main_Page-20141119180453-show.txt | 136 ++ wiki/Main_Page-20150905071559-show.txt | 136 ++ wiki/Main_Page-20150913213351-show.txt | 136 ++ wiki/Main_Page-20151009213806-show.txt | 136 ++ wiki/Main_Page-20160103232406-show.txt | 137 ++ wiki/Main_Page-20160626093418-show.txt | 139 ++ wiki/Main_Page-20160929124306-show.txt | 139 ++ wiki/Main_Page-20161028044801-show.txt | 139 ++ wiki/Main_Page-20161031091442-show.txt | 139 ++ wiki/Main_Page-20161218185016-show.txt | 136 ++ wiki/Main_Page-20170710173543-show.txt | 136 ++ wiki/Main_Page-20180812150552-show.txt | 137 ++ wiki/Main_Page-20190420011510-show.txt | 137 ++ wiki/Main_Page-20191230003140-show.txt | 137 ++ wiki/Main_Page-20200826181827-show.txt | 138 ++ wiki/Main_Page-20200920054719-show.txt | 138 ++ wiki/Main_Page-20201001180127-show.txt | 138 ++ wiki/Main_Page-20201112002412-show.txt | 138 ++ wiki/Main_Page-20201112032919-show.txt | 138 ++ wiki/Main_Page-20201129020153-edit.txt | 104 ++ wiki/Main_Page-20210119125058-show.txt | 138 ++ wiki/Main_Page-20210126120516-show.txt | 138 ++ wiki/Main_Page-20210327022141-show.txt | 138 ++ wiki/Main_Page-20210421081418-show.txt | 138 ++ wiki/Main_Page-20210506120257-show.txt | 138 ++ wiki/Main_Page-20210620070651-show.txt | 138 ++ wiki/Main_Page-20210629142829-show.txt | 138 ++ wiki/Main_Page-20210805174839-show.txt | 138 ++ wiki/Main_Page-20210818214336-edit.txt | 104 ++ wiki/Main_Page-20211117161308-show.txt | 138 ++ wiki/Main_Page-20220128103550-show.txt | 138 ++ wiki/Main_Page-20220207132230-show.txt | 138 ++ wiki/Main_Page-20220401065205-show.txt | 138 ++ ...oken-file-category-20200806164310-show.txt | 6 + ...-category-category-20201001194739-show.txt | 6 + ...iki:Index-category-20200918205606-show.txt | 6 + ...i:Noindex-category-20210115213859-show.txt | 6 + ...inclusion-category-20200918212331-show.txt | 6 + ...nt_tools%2Dynamics-20160625010638-show.txt | 11 + ...ics_and_imagehoses-20210508213339-show.txt | 23 + ...m:Preset_converter-20161030073809-edit.txt | 33 + ...m:Preset_converter-20161030073830-show.txt | 43 + ...ethinking_the_wiki-20141122130752-show.txt | 71 + ...ethinking_the_wiki-20141204155914-edit.txt | 63 + ...mailing_list_rules-20201021081955-edit.txt | 181 +++ ...e_deformation_tool-20150911035422-show.txt | 128 ++ ...e_deformation_tool-20150914231446-edit.txt | 92 ++ ...e_deformation_tool-20151015040112-show.txt | 128 ++ ...trom:Misc_TODO%27s-20200804084032-show.txt | 2 + ...trom:Misc_TODO%27s-20210515111646-show.txt | 2 + ...indstrom:Misc_TODO-20201126020502-edit.txt | 1 + wiki/PSD_support-20201108134519-show.txt | 160 ++ wiki/PSD_support-20220128103322-show.txt | 160 ++ ...ase:2.10_changelog-20160927041611-show.txt | 296 ++++ ...ase:2.10_changelog-20201129005639-edit.txt | 460 ++++++ ...ase:2.10_changelog-20210125182118-show.txt | 525 +++++++ ...ase:2.10_changelog-20210301093442-edit.txt | 460 ++++++ ...ase:2.10_changelog-20210511062716-edit.txt | 460 ++++++ ...ase:2.10_changelog-20220401181910-show.txt | 525 +++++++ ...ase:2.10_changelog-20220426085359-show.txt | 525 +++++++ ...elease:GIMP_2.8.10-20161023235635-edit.txt | 27 + ...elease:GIMP_2.8.10-20180812150607-show.txt | 38 + ...elease:GIMP_2.8.10-20210515091413-edit.txt | 27 + ...elease:GIMP_2.8.12-20201129013515-edit.txt | 41 + ...elease:GIMP_2.8.12-20210515135050-edit.txt | 41 + ...elease:GIMP_2.8.12-20210815113345-show.txt | 49 + ...elease:GIMP_2.8.16-20201028003736-edit.txt | 30 + ...elease:GIMP_2.8.16-20210819010728-show.txt | 36 + ...elease:GIMP_2.8.16-20210819010738-show.txt | 36 + ...eneral_Information-20201028002844-edit.txt | 87 ++ ...eneral_Information-20210617180851-edit.txt | 87 ++ ...eneral_Information-20220210134902-show.txt | 112 ++ ...eneral_Information-20220210141436-show.txt | 112 ++ wiki/Release:Misc-20161024010210-edit.txt | 769 ++++++++++ wiki/Release:Misc-20180812150607-show.txt | 782 ++++++++++ wiki/Release:Misc-20201028003120-edit.txt | 769 ++++++++++ wiki/Release:Misc-20210518052115-edit.txt | 769 ++++++++++ ...se:Packaging_Guide-20200920040235-edit.txt | 74 + wiki/Roadmap-20141226014631-show.txt | 149 ++ wiki/Roadmap-20150905134653-show.txt | 149 ++ wiki/Roadmap-20151001010703-show.txt | 149 ++ wiki/Roadmap-20151222122034-show.txt | 126 ++ wiki/Roadmap-20160707051307-show.txt | 134 ++ wiki/Roadmap-20161012092025-show.txt | 138 ++ wiki/Roadmap-20161027084101-show.txt | 138 ++ wiki/Roadmap-20170128201102-show.txt | 142 ++ wiki/Roadmap-20170629120324-show.txt | 151 ++ wiki/Roadmap-20171108145200-show.txt | 155 ++ wiki/Roadmap-20180812150133-show.txt | 167 +++ wiki/Roadmap-20190418123119-show.txt | 169 +++ wiki/Roadmap-20200126021133-show.txt | 170 +++ wiki/Roadmap-20200706141314-show.txt | 170 +++ wiki/Roadmap-20200915185522-show.txt | 170 +++ wiki/Roadmap-20201002195946-show.txt | 170 +++ wiki/Roadmap-20201016012344-show.txt | 176 +++ wiki/Roadmap-20201111075926-show.txt | 176 +++ wiki/Roadmap-20201124153015-edit.txt | 162 +++ wiki/Roadmap-20201125141741-show.txt | 176 +++ wiki/Roadmap-20210116183042-show.txt | 176 +++ wiki/Roadmap-20210206025111-show.txt | 176 +++ wiki/Roadmap-20210307135321-show.txt | 176 +++ wiki/Roadmap-20210416201952-show.txt | 176 +++ wiki/Roadmap-20210416232827-show.txt | 176 +++ wiki/Roadmap-20210506225301-show.txt | 176 +++ wiki/Roadmap-20210521221259-show.txt | 176 +++ wiki/Roadmap-20210608113336-edit.txt | 162 +++ wiki/Roadmap-20210625164241-show.txt | 176 +++ wiki/Roadmap-20210629023028-show.txt | 176 +++ wiki/Roadmap-20210813164343-show.txt | 176 +++ wiki/Roadmap-20210819095302-show.txt | 176 +++ wiki/Roadmap-20211122214656-show.txt | 176 +++ wiki/Roadmap-20220130162134-show.txt | 176 +++ wiki/Roadmap-20220202230045-show.txt | 176 +++ wiki/Roadmap-20220213173854-show.txt | 176 +++ wiki/Roadmap-20220401093845-show.txt | 182 +++ wiki/Roadmap-20220418122258-show.txt | 182 +++ ...evelopment_version-20161024013249-edit.txt | 15 + ...evelopment_version-20161109163724-show.txt | 22 + ...evelopment_version-20180812150614-show.txt | 22 + ...evelopment_version-20201001204335-edit.txt | 15 + ...tion_Search_Dialog-20160630074109-edit.txt | 210 +++ ...tion_Search_Dialog-20160630075555-show.txt | 247 ++++ ...Resource_installer-20150912233138-edit.txt | 21 + ...Resource_installer-20161024002526-show.txt | 35 + wiki/Specs:UI_Theme-20151127111343-edit.txt | 115 ++ wiki/Specs:UI_Theme-20161013200315-show.txt | 6 + wiki/Specs:Visibility-20150709030428-show.txt | 121 ++ ...Documentation:Main-20150909030525-edit.txt | 1 + ...Documentation:Main-20161024001741-show.txt | 5 + ...acking:Basic_build-20151228085159-show.txt | 7 + ...acking:Basic_build-20200919100804-edit.txt | 7 + wiki/Template:Hsk-20200806211743-show.txt | 2 + wiki/Template:No-20141117164154-show.txt | 5 + wiki/Template:Wip-20141117111219-show.txt | 5 + wiki/Template:Yes-20141117103824-show.txt | 5 + wiki/User:Akkana-20200815174829-show.txt | 7 + wiki/User:AlexiaDeath-20210227153042-show.txt | 7 + wiki/User:BatO-20200920163001-show.txt | 7 + wiki/User:Bootchk-20210115205922-show.txt | 7 + wiki/User:Drawoc-20210417223818-show.txt | 7 + wiki/User:Edj-20200923100030-show.txt | 7 + wiki/User:Enselic-20210513100057-show.txt | 7 + wiki/User:Grafxuser-20200920173119-show.txt | 7 + wiki/User:Lillolollo-20210115195722-show.txt | 7 + wiki/User:Mitch-20200806230338-show.txt | 5 + wiki/User:Owencook-20201022145607-show.txt | 7 + wiki/User:Patdavid-20150926102705-show.txt | 5 + wiki/User:Schumaml-20210117125548-show.txt | 3 + wiki/User:Scl-20210115211436-show.txt | 7 + wiki/User:Test-20210615070413-show.txt | 12 + wiki/User:ThomasManni-20210117123633-show.txt | 7 + wiki/Users:Tips-20161024112554-edit.txt | 67 + wiki/Users:Tips-20180812150616-show.txt | 98 ++ wiki/Users:Tips-20201001195447-edit.txt | 66 + wiki/WGO_Redesign-20161025045930-show.txt | 268 ++++ wiki/imgs/Blur_dialog1.png | Bin 0 -> 12295 bytes wiki/imgs/Dave_Neary.jpg | Bin 0 -> 7489 bytes wiki/imgs/Depth_of_control_point.png | Bin 0 -> 119140 bytes wiki/imgs/Gnu-head-sm.jpg | Bin 0 -> 5286 bytes wiki/imgs/Hello.png | Bin 0 -> 14753 bytes wiki/imgs/Mac_gimp_logo4.png | Bin 0 -> 11474 bytes wiki/imgs/Macosx_screenshot1_thumb.jpg | Bin 0 -> 14879 bytes wiki/imgs/Oyvind_Kolas.png | Bin 0 -> 50772 bytes wiki/imgs/People2000-small.jpg | Bin 0 -> 49236 bytes wiki/imgs/People2003-small.png | Bin 0 -> 244483 bytes wiki/imgs/Somerights20.gif | Bin 0 -> 1082 bytes wiki/imgs/Source_and_destination_pose.png | Bin 0 -> 143594 bytes wiki/imgs/Wilber.png | Bin 0 -> 5611 bytes wiki/imgs/pull.txt | 135 ++ 452 files changed, 81882 insertions(+) create mode 100644 wiki/Algorithm_Index-20210118143033-edit.txt create mode 100644 wiki/Algorithms-20201031072416-show.txt create mode 100644 wiki/Algorithms-20201124152652-edit.txt create mode 100644 wiki/Algorithms-20210518041020-show.txt create mode 100644 wiki/Algorithms:Flood-20201026071702-edit.txt create mode 100644 wiki/Build:Basic-20150910223625-show.txt create mode 100644 wiki/Category:Algorithms-20161017122944-show.txt create mode 100644 wiki/Documentation:Main-20161024003532-edit.txt create mode 100644 wiki/Documentation:Main-20180812150616-show.txt create mode 100644 wiki/Documentation:Main-20200811194509-edit.txt create mode 100644 wiki/Documentation:Main-20210512212113-edit.txt create mode 100644 wiki/Documentation:RoadmapIdeas-20150910071238-edit.txt create mode 100644 wiki/Documentation:RoadmapIdeas-20161024014527-show.txt create mode 100644 wiki/Extensions-20180812150612-show.txt create mode 100644 wiki/Extensions-20200923033421-edit.txt create mode 100644 wiki/Extensions-20210616195653-edit.txt create mode 100644 wiki/Flood_algorithm-20161017125542-show.txt create mode 100644 wiki/Flood_algorithm-20210118151058-edit.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20141215232808-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20150905122805-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20151025020958-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20151224135532-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20160630081449-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20161025044731-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20161126033457-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20170710173104-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20180812150552-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20190507091741-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20210125182120-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20210506011106-show.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20210518052644-edit.txt create mode 100644 wiki/GIMP_Developer_Wiki:About-20210818153540-show.txt create mode 100644 wiki/GIMP_Roadmap-20151020114621-edit.txt create mode 100644 wiki/GIMP_Roadmap-20161009222107-show.txt create mode 100644 wiki/Glossary-20161024174322-edit.txt create mode 100644 wiki/Glossary-20161029172043-show.txt create mode 100644 wiki/Glossary-20170710195736-show.txt create mode 100644 wiki/Glossary-20210515121423-edit.txt create mode 100644 wiki/Graphic_tablets_support-20210622010105-edit.txt create mode 100644 wiki/Hacking:API_documentation-20201124150526-edit.txt create mode 100644 wiki/Hacking:API_documentation-20210513021905-edit.txt create mode 100644 wiki/Hacking:API_documentation-20210818153228-show.txt create mode 100644 wiki/Hacking:API_documentation-20210818153245-show.txt create mode 100644 wiki/Hacking:Basic_build-20150912093455-show.txt create mode 100644 wiki/Hacking:Basic_build-20151228090519-edit.txt create mode 100644 wiki/Hacking:Building%2FLinux-20140901172111-history.txt create mode 100644 wiki/Hacking:Building%2FLinux-20140901172119-edit.txt create mode 100644 wiki/Hacking:Building%2FLinux-20140901175130-show.txt create mode 100644 wiki/Hacking:Building%2FLinux-20201022143903-edit.txt create mode 100644 wiki/Hacking:Building%2FLinux-20210512194925-edit.txt create mode 100644 wiki/Hacking:Building%2FWindows-20140901110311-show.txt create mode 100644 wiki/Hacking:Building%2FWindows-20140901122002-edit.txt create mode 100644 wiki/Hacking:Building%2FWindows-20201028000025-edit.txt create mode 100644 wiki/Hacking:Building%2FWindows-20210513030349-edit.txt create mode 100644 wiki/Hacking:Building%2Linux-20210108005109-show.txt create mode 100644 wiki/Hacking:Building%2Linux-20210818145611-show.txt create mode 100644 wiki/Hacking:Building%2Windows-20201108092724-show.txt create mode 100644 wiki/Hacking:Building%2Windows-20210830111407-show.txt create mode 100644 wiki/Hacking:Building-20150212064206-show.txt create mode 100644 wiki/Hacking:Building-20150905134141-show.txt create mode 100644 wiki/Hacking:Building-20151014043535-show.txt create mode 100644 wiki/Hacking:Building-20160112224754-show.txt create mode 100644 wiki/Hacking:Building-20160630044241-show.txt create mode 100644 wiki/Hacking:Building-20161025144126-show.txt create mode 100644 wiki/Hacking:Building-20161126033513-show.txt create mode 100644 wiki/Hacking:Building-20170710173015-show.txt create mode 100644 wiki/Hacking:Building-20180812150558-show.txt create mode 100644 wiki/Hacking:Building-20190507091730-show.txt create mode 100644 wiki/Hacking:Building-20210107042759-show.txt create mode 100644 wiki/Hacking:Building-20210119124306-edit.txt create mode 100644 wiki/Hacking:Building-20210420220910-show.txt create mode 100644 wiki/Hacking:Building-20210506133726-show.txt create mode 100644 wiki/Hacking:Building-20210620190210-edit.txt create mode 100644 wiki/Hacking:Building_with_Meson-20200806151232-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FGObject-20140901172129-show.txt create mode 100644 wiki/Hacking:Code_Snippets%2FGObject-20140901180426-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FGObject-20201028003224-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FGObject-20210116190613-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211444-history.txt create mode 100644 wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211509-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901212705-show.txt create mode 100644 wiki/Hacking:Code_Snippets%2FMiscellaneous-20161024174623-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FMiscellaneous-20210124031932-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FMiscellaneous-20210513093525-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FScript-Fu-20140901154412-history.txt create mode 100644 wiki/Hacking:Code_Snippets%2FScript-Fu-20140901161526-show.txt create mode 100644 wiki/Hacking:Code_Snippets%2FScript-Fu-20161024001833-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FScript-Fu-20200923025950-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2FScript-Fu-20210512200540-edit.txt create mode 100644 wiki/Hacking:Code_Snippets%2GObject-20220210134900-show.txt create mode 100644 wiki/Hacking:Code_Snippets%2GObject-20220210141435-show.txt create mode 100644 wiki/Hacking:Code_Snippets%2Miscellaneous-20180812150601-show.txt create mode 100644 wiki/Hacking:Code_Snippets%2Script-Fu-20180812150602-show.txt create mode 100644 wiki/Hacking:Code_Snippets-20200923025233-edit.txt create mode 100644 wiki/Hacking:Code_Snippets-20210303173835-edit.txt create mode 100644 wiki/Hacking:Code_Snippets-20210816142242-show.txt create mode 100644 wiki/Hacking:Debug%2FTest-20200806141144-edit.txt create mode 100644 wiki/Hacking:Debug%2Test-20201028005149-show.txt create mode 100644 wiki/Hacking:Debug%2Test-20210818164743-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_14_Mar_2011-20150911224948-edit.txt create mode 100644 wiki/Hacking:Dev_Meeting_14_Mar_2011-20161024020553-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_19_Apr_2011-20190507091738-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_20_Apr_2011-20200806134821-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_20_Apr_2011-20210416105655-edit.txt create mode 100644 wiki/Hacking:Dev_Meeting_28_Feb_2011-20150911044138-edit.txt create mode 100644 wiki/Hacking:Dev_Meeting_28_Feb_2011-20161126033528-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_28_Feb_2011-20200126023332-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_28_Mar_2011-20150911043918-edit.txt create mode 100644 wiki/Hacking:Dev_Meeting_28_Mar_2011-20161024002630-show.txt create mode 100644 wiki/Hacking:Dev_Meeting_28_Mar_2011-20210417225721-edit.txt create mode 100644 wiki/Hacking:Developer_FAQ-20170710205211-show.txt create mode 100644 wiki/Hacking:Developer_FAQ-20201115193707-show.txt create mode 100644 wiki/Hacking:Developer_FAQ-20201123020435-show.txt create mode 100644 wiki/Hacking:Developer_FAQ-20210515120627-edit.txt create mode 100644 wiki/Hacking:Developer_FAQ-20211122115844-show.txt create mode 100644 wiki/Hacking:Developer_Meetings-20161024020212-edit.txt create mode 100644 wiki/Hacking:Developer_Meetings-20170710205256-show.txt create mode 100644 wiki/Hacking:Developer_Meetings-20201124143235-edit.txt create mode 100644 wiki/Hacking:Developer_Meetings-20210515163235-edit.txt create mode 100644 wiki/Hacking:Eclipse-20150911221746-edit.txt create mode 100644 wiki/Hacking:Eclipse-20171105101404-show.txt create mode 100644 wiki/Hacking:Eclipse-20210515112800-edit.txt create mode 100644 wiki/Hacking:Emacs-20150910222259-edit.txt create mode 100644 wiki/Hacking:Emacs-20161024001914-show.txt create mode 100644 wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150906183933-show.txt create mode 100644 wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150911224822-edit.txt create mode 100644 wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20161024010119-show.txt create mode 100644 wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20200811183201-edit.txt create mode 100644 wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150906164319-show.txt create mode 100644 wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150910192759-edit.txt create mode 100644 wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20161024011955-show.txt create mode 100644 wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150906182230-show.txt create mode 100644 wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150911043951-edit.txt create mode 100644 wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20161024001757-show.txt create mode 100644 wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20150911225818-edit.txt create mode 100644 wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20161024014518-show.txt create mode 100644 wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150907021633-show.txt create mode 100644 wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150914162213-edit.txt create mode 100644 wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20161024012630-show.txt create mode 100644 wiki/Hacking:GSOC%2Archive-20161109165241-show.txt create mode 100644 wiki/Hacking:GSOC%2Archive-20180812150611-show.txt create mode 100644 wiki/Hacking:GSOC%2FArchive-20140901134801-show.txt create mode 100644 wiki/Hacking:GSOC%2FArchive-20140901141912-history.txt create mode 100644 wiki/Hacking:GSOC%2FArchive-20140901145810-edit.txt create mode 100644 wiki/Hacking:GSOC%2FArchive-20161024003038-edit.txt create mode 100644 wiki/Hacking:GSOC%2FArchive-20210124015050-edit.txt create mode 100644 wiki/Hacking:GSOC%2FArchive-20210513081836-edit.txt create mode 100644 wiki/Hacking:GSOC-20200923035123-edit.txt create mode 100644 wiki/Hacking:GSOC_Archive-20151230115515-edit.txt create mode 100644 wiki/Hacking:GSOC_Archive-20161225035744-show.txt create mode 100644 wiki/Hacking:GSoC%22011%2Ideas-20161225100135-show.txt create mode 100644 wiki/Hacking:GSoC%22014%2Ideas-20210818113443-show.txt create mode 100644 wiki/Hacking:GSoC%22015%2Ideas-20161023235701-show.txt create mode 100644 wiki/Hacking:GSoC%2F2011%2FIdeas-20161225102144-edit.txt create mode 100644 wiki/Hacking:GSoC%2F2011%2FIdeas-20210124020722-edit.txt create mode 100644 wiki/Hacking:GSoC%2F2014%2FIdeas-20140901202248-edit.txt create mode 100644 wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212233-show.txt create mode 100644 wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212825-history.txt create mode 100644 wiki/Hacking:GSoC%2F2014%2FIdeas-20200804085807-edit.txt create mode 100644 wiki/Hacking:GSoC%2F2014%2FIdeas-20210506070749-edit.txt create mode 100644 wiki/Hacking:GSoC%2F2015%2FIdeas-20161024015614-edit.txt create mode 100644 wiki/Hacking:GSoC%2F2015%2FIdeas-20200806164711-edit.txt create mode 100644 wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901191025-edit.txt create mode 100644 wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901193434-show.txt create mode 100644 wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901194740-history.txt create mode 100644 wiki/Hacking:GSoC%2FFuture%2FIdeas-20161024002752-edit.txt create mode 100644 wiki/Hacking:GSoC%2FFuture%2FIdeas-20200804084700-edit.txt create mode 100644 wiki/Hacking:GSoC%2FFuture%2FIdeas-20210515112335-edit.txt create mode 100644 wiki/Hacking:GSoC%2Future%2Ideas-20170710184350-show.txt create mode 100644 wiki/Hacking:GSoC-20200923035123-edit.txt create mode 100644 wiki/Hacking:GSoC-20210512205259-edit.txt create mode 100644 wiki/Hacking:GSoC-20210818022312-show.txt create mode 100644 wiki/Hacking:GSoC-20210818022507-show.txt create mode 100644 wiki/Hacking:How_to_write_a_GIMP_plug-in-20150906163752-show.txt create mode 100644 wiki/Hacking:How_to_write_a_GIMP_plug-in-20150910163259-edit.txt create mode 100644 wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2007-20161024015943-show.txt create mode 100644 wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr-20150911044159-edit.txt create mode 100644 wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20161024010128-show.txt create mode 100644 wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20210206164023-show.txt create mode 100644 wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc-20150910192647-edit.txt create mode 100644 wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2009-20161009100056-show.txt create mode 100644 wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr-20150911044733-edit.txt create mode 100644 wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20150911054012-edit.txt create mode 100644 wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20161024013724-show.txt create mode 100644 wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2011-20161024003011-show.txt create mode 100644 wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr-20150911044820-edit.txt create mode 100644 wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20150911043802-edit.txt create mode 100644 wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20161024013729-show.txt create mode 100644 wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20150914160233-edit.txt create mode 100644 wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20161024001809-show.txt create mode 100644 wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20150911065020-edit.txt create mode 100644 wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20161024020118-show.txt create mode 100644 wiki/Hacking:Merging_lisanet.de_fork-20161024174608-edit.txt create mode 100644 wiki/Hacking:Merging_lisanet.de_fork-20180812150613-show.txt create mode 100644 wiki/Hacking:Merging_lisanet.de_fork-20201028005049-edit.txt create mode 100644 wiki/Hacking:Netbeans-20150910192804-edit.txt create mode 100644 wiki/Hacking:Netbeans-20161024010114-show.txt create mode 100644 wiki/Hacking:Patches-20161024001850-edit.txt create mode 100644 wiki/Hacking:Patches-20180812150605-show.txt create mode 100644 wiki/Hacking:Plugin_registry-20161024013437-edit.txt create mode 100644 wiki/Hacking:Plugin_registry-20161109163337-show.txt create mode 100644 wiki/Hacking:Plugin_registry-20180812150613-show.txt create mode 100644 wiki/Hacking:Plugin_registry-20201028003355-edit.txt create mode 100644 wiki/Hacking:Plugins-20200923041814-edit.txt create mode 100644 wiki/Hacking:Plugins-20210512211343-edit.txt create mode 100644 wiki/Hacking:Plugins-20210617154825-show.txt create mode 100644 wiki/Hacking:Plugins-20210701161100-show.txt create mode 100644 wiki/Hacking:Plugins_v3-20210622040546-edit.txt create mode 100644 wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20201025001535-edit.txt create mode 100644 wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20210816235742-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20201028005243-edit.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20210518054200-edit.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL%2UI_review-20210818214334-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20141226014626-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20150905062156-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20151007050152-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20160112231213-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20160630022533-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20160927041606-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20161028235537-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20161120184915-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20170710172113-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20180812150558-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20190507091745-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20190910220828-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20201112031545-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20201113064505-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20201129020105-edit.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20210505211634-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20210506133935-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20210620064607-edit.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20210818145443-show.txt create mode 100644 wiki/Hacking:Porting_filters_to_GEGL-20220205071048-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20150212064210-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20150905105223-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20151008021106-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20160111063721-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20160630081500-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20161007061623-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20161107214435-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20161126033518-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20170710222754-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20190507091739-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20200126023318-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20210125182122-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20210506184322-show.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20210513103541-edit.txt create mode 100644 wiki/Hacking:Problems_and_solutions-20210818012237-show.txt create mode 100644 wiki/Hacking:ScriptFu-20210515114158-show.txt create mode 100644 wiki/Hacking:Source_Tree-20161024001818-edit.txt create mode 100644 wiki/Hacking:Source_Tree-20170706070708-show.txt create mode 100644 wiki/Hacking:Source_Tree-20201028001831-edit.txt create mode 100644 wiki/Hacking:Source_Tree-20210515084512-edit.txt create mode 100644 wiki/Hacking:TODO-20160927032812-show.txt create mode 100644 wiki/Hacking:TODO-20201025000632-edit.txt create mode 100644 wiki/Hacking:TODO-20210125182125-show.txt create mode 100644 wiki/Hacking:TODO-20210518053713-edit.txt create mode 100644 wiki/Hacking:TODO-20210608113340-show.txt create mode 100644 wiki/Hacking:Tools-20161024012059-edit.txt create mode 100644 wiki/Hacking:Tools-20210816102059-show.txt create mode 100644 wiki/Hacking:WarpTool%2FUI_design_info-20140901130309-history.txt create mode 100644 wiki/Hacking:WarpTool%2FUI_design_info-20140901130759-edit.txt create mode 100644 wiki/Hacking:WarpTool%2FUI_design_info-20140901133827-show.txt create mode 100644 wiki/Hacking:WarpTool%2FUI_design_info-20161024020045-edit.txt create mode 100644 wiki/Hacking:WarpTool%2FUI_design_info-20201124151511-edit.txt create mode 100644 wiki/Hacking:WarpTool%2FUI_design_info-20210514160613-edit.txt create mode 100644 wiki/Hacking:WarpTool%2UI_design_info-20180812150601-show.txt create mode 100644 wiki/Hacking:_Building%2FMac_OSX-20140901173819-show.txt create mode 100644 wiki/Hacking:_Building%2FMac_OSX-20140901181141-edit.txt create mode 100644 wiki/Hacking:_Building%2FMac_OSX-20140901181654-history.txt create mode 100644 wiki/Hacking:_Building%2FMac_OSX-20161024010200-edit.txt create mode 100644 wiki/Hacking:_Building%2FMac_OSX-20210515121756-edit.txt create mode 100644 wiki/Hacking:_Building%2Mac_OSX-20180812150603-show.txt create mode 100644 wiki/Hacking:fast_plug-in-20150910192607-show.txt create mode 100644 wiki/Hacking:pdbgen-20150908170739-edit.txt create mode 100644 wiki/Hacking:pdbgen-20161024012354-show.txt create mode 100644 wiki/Hacking:pdbgen-20201125224303-edit.txt create mode 100644 wiki/Hacking:slow_plug-in-20150910163345-show.txt create mode 100644 wiki/Hacking:slow_plug-in-20151225224544-edit.txt create mode 100644 wiki/Index_of_Algorithms-20161017122923-edit.txt create mode 100644 wiki/Index_of_Algorithms-20180812150606-show.txt create mode 100644 wiki/LGM2014Minutes-20141108144820-edit.txt create mode 100644 wiki/LGM2014Minutes-20150905195224-show.txt create mode 100644 wiki/Main_Page-20141119180453-show.txt create mode 100644 wiki/Main_Page-20150905071559-show.txt create mode 100644 wiki/Main_Page-20150913213351-show.txt create mode 100644 wiki/Main_Page-20151009213806-show.txt create mode 100644 wiki/Main_Page-20160103232406-show.txt create mode 100644 wiki/Main_Page-20160626093418-show.txt create mode 100644 wiki/Main_Page-20160929124306-show.txt create mode 100644 wiki/Main_Page-20161028044801-show.txt create mode 100644 wiki/Main_Page-20161031091442-show.txt create mode 100644 wiki/Main_Page-20161218185016-show.txt create mode 100644 wiki/Main_Page-20170710173543-show.txt create mode 100644 wiki/Main_Page-20180812150552-show.txt create mode 100644 wiki/Main_Page-20190420011510-show.txt create mode 100644 wiki/Main_Page-20191230003140-show.txt create mode 100644 wiki/Main_Page-20200826181827-show.txt create mode 100644 wiki/Main_Page-20200920054719-show.txt create mode 100644 wiki/Main_Page-20201001180127-show.txt create mode 100644 wiki/Main_Page-20201112002412-show.txt create mode 100644 wiki/Main_Page-20201112032919-show.txt create mode 100644 wiki/Main_Page-20201129020153-edit.txt create mode 100644 wiki/Main_Page-20210119125058-show.txt create mode 100644 wiki/Main_Page-20210126120516-show.txt create mode 100644 wiki/Main_Page-20210327022141-show.txt create mode 100644 wiki/Main_Page-20210421081418-show.txt create mode 100644 wiki/Main_Page-20210506120257-show.txt create mode 100644 wiki/Main_Page-20210620070651-show.txt create mode 100644 wiki/Main_Page-20210629142829-show.txt create mode 100644 wiki/Main_Page-20210805174839-show.txt create mode 100644 wiki/Main_Page-20210818214336-edit.txt create mode 100644 wiki/Main_Page-20211117161308-show.txt create mode 100644 wiki/Main_Page-20220128103550-show.txt create mode 100644 wiki/Main_Page-20220207132230-show.txt create mode 100644 wiki/Main_Page-20220401065205-show.txt create mode 100644 wiki/MediaWiki:Broken-file-category-20200806164310-show.txt create mode 100644 wiki/MediaWiki:Hidden-category-category-20201001194739-show.txt create mode 100644 wiki/MediaWiki:Index-category-20200918205606-show.txt create mode 100644 wiki/MediaWiki:Noindex-category-20210115213859-show.txt create mode 100644 wiki/MediaWiki:Post-expand-template-inclusion-category-20200918212331-show.txt create mode 100644 wiki/Mindstorm:Paint_tools%2Dynamics-20160625010638-show.txt create mode 100644 wiki/Mindstorm:Paint_tools%2Dynamics_and_imagehoses-20210508213339-show.txt create mode 100644 wiki/Mindstorm:Preset_converter-20161030073809-edit.txt create mode 100644 wiki/Mindstorm:Preset_converter-20161030073830-show.txt create mode 100644 wiki/Mindstorm:Rethinking_the_wiki-20141122130752-show.txt create mode 100644 wiki/Mindstorm:Rethinking_the_wiki-20141204155914-edit.txt create mode 100644 wiki/Mindstorm:_Rework_of_mailing_list_rules-20201021081955-edit.txt create mode 100644 wiki/Mindstorm:n-point_image_deformation_tool-20150911035422-show.txt create mode 100644 wiki/Mindstorm:n-point_image_deformation_tool-20150914231446-edit.txt create mode 100644 wiki/Mindstorm:n-point_image_deformation_tool-20151015040112-show.txt create mode 100644 wiki/Mindstrom:Misc_TODO%27s-20200804084032-show.txt create mode 100644 wiki/Mindstrom:Misc_TODO%27s-20210515111646-show.txt create mode 100644 wiki/Mindstrom:Misc_TODO-20201126020502-edit.txt create mode 100644 wiki/PSD_support-20201108134519-show.txt create mode 100644 wiki/PSD_support-20220128103322-show.txt create mode 100644 wiki/Release:2.10_changelog-20160927041611-show.txt create mode 100644 wiki/Release:2.10_changelog-20201129005639-edit.txt create mode 100644 wiki/Release:2.10_changelog-20210125182118-show.txt create mode 100644 wiki/Release:2.10_changelog-20210301093442-edit.txt create mode 100644 wiki/Release:2.10_changelog-20210511062716-edit.txt create mode 100644 wiki/Release:2.10_changelog-20220401181910-show.txt create mode 100644 wiki/Release:2.10_changelog-20220426085359-show.txt create mode 100644 wiki/Release:GIMP_2.8.10-20161023235635-edit.txt create mode 100644 wiki/Release:GIMP_2.8.10-20180812150607-show.txt create mode 100644 wiki/Release:GIMP_2.8.10-20210515091413-edit.txt create mode 100644 wiki/Release:GIMP_2.8.12-20201129013515-edit.txt create mode 100644 wiki/Release:GIMP_2.8.12-20210515135050-edit.txt create mode 100644 wiki/Release:GIMP_2.8.12-20210815113345-show.txt create mode 100644 wiki/Release:GIMP_2.8.16-20201028003736-edit.txt create mode 100644 wiki/Release:GIMP_2.8.16-20210819010728-show.txt create mode 100644 wiki/Release:GIMP_2.8.16-20210819010738-show.txt create mode 100644 wiki/Release:General_Information-20201028002844-edit.txt create mode 100644 wiki/Release:General_Information-20210617180851-edit.txt create mode 100644 wiki/Release:General_Information-20220210134902-show.txt create mode 100644 wiki/Release:General_Information-20220210141436-show.txt create mode 100644 wiki/Release:Misc-20161024010210-edit.txt create mode 100644 wiki/Release:Misc-20180812150607-show.txt create mode 100644 wiki/Release:Misc-20201028003120-edit.txt create mode 100644 wiki/Release:Misc-20210518052115-edit.txt create mode 100644 wiki/Release:Packaging_Guide-20200920040235-edit.txt create mode 100644 wiki/Roadmap-20141226014631-show.txt create mode 100644 wiki/Roadmap-20150905134653-show.txt create mode 100644 wiki/Roadmap-20151001010703-show.txt create mode 100644 wiki/Roadmap-20151222122034-show.txt create mode 100644 wiki/Roadmap-20160707051307-show.txt create mode 100644 wiki/Roadmap-20161012092025-show.txt create mode 100644 wiki/Roadmap-20161027084101-show.txt create mode 100644 wiki/Roadmap-20170128201102-show.txt create mode 100644 wiki/Roadmap-20170629120324-show.txt create mode 100644 wiki/Roadmap-20171108145200-show.txt create mode 100644 wiki/Roadmap-20180812150133-show.txt create mode 100644 wiki/Roadmap-20190418123119-show.txt create mode 100644 wiki/Roadmap-20200126021133-show.txt create mode 100644 wiki/Roadmap-20200706141314-show.txt create mode 100644 wiki/Roadmap-20200915185522-show.txt create mode 100644 wiki/Roadmap-20201002195946-show.txt create mode 100644 wiki/Roadmap-20201016012344-show.txt create mode 100644 wiki/Roadmap-20201111075926-show.txt create mode 100644 wiki/Roadmap-20201124153015-edit.txt create mode 100644 wiki/Roadmap-20201125141741-show.txt create mode 100644 wiki/Roadmap-20210116183042-show.txt create mode 100644 wiki/Roadmap-20210206025111-show.txt create mode 100644 wiki/Roadmap-20210307135321-show.txt create mode 100644 wiki/Roadmap-20210416201952-show.txt create mode 100644 wiki/Roadmap-20210416232827-show.txt create mode 100644 wiki/Roadmap-20210506225301-show.txt create mode 100644 wiki/Roadmap-20210521221259-show.txt create mode 100644 wiki/Roadmap-20210608113336-edit.txt create mode 100644 wiki/Roadmap-20210625164241-show.txt create mode 100644 wiki/Roadmap-20210629023028-show.txt create mode 100644 wiki/Roadmap-20210813164343-show.txt create mode 100644 wiki/Roadmap-20210819095302-show.txt create mode 100644 wiki/Roadmap-20211122214656-show.txt create mode 100644 wiki/Roadmap-20220130162134-show.txt create mode 100644 wiki/Roadmap-20220202230045-show.txt create mode 100644 wiki/Roadmap-20220213173854-show.txt create mode 100644 wiki/Roadmap-20220401093845-show.txt create mode 100644 wiki/Roadmap-20220418122258-show.txt create mode 100644 wiki/Screenshots_of_the_development_version-20161024013249-edit.txt create mode 100644 wiki/Screenshots_of_the_development_version-20161109163724-show.txt create mode 100644 wiki/Screenshots_of_the_development_version-20180812150614-show.txt create mode 100644 wiki/Screenshots_of_the_development_version-20201001204335-edit.txt create mode 100644 wiki/Specs:Action_Search_Dialog-20160630074109-edit.txt create mode 100644 wiki/Specs:Action_Search_Dialog-20160630075555-show.txt create mode 100644 wiki/Specs:Resource_installer-20150912233138-edit.txt create mode 100644 wiki/Specs:Resource_installer-20161024002526-show.txt create mode 100644 wiki/Specs:UI_Theme-20151127111343-edit.txt create mode 100644 wiki/Specs:UI_Theme-20161013200315-show.txt create mode 100644 wiki/Specs:Visibility-20150709030428-show.txt create mode 100644 wiki/Talk:Documentation:Main-20150909030525-edit.txt create mode 100644 wiki/Talk:Documentation:Main-20161024001741-show.txt create mode 100644 wiki/Talk:Hacking:Basic_build-20151228085159-show.txt create mode 100644 wiki/Talk:Hacking:Basic_build-20200919100804-edit.txt create mode 100644 wiki/Template:Hsk-20200806211743-show.txt create mode 100644 wiki/Template:No-20141117164154-show.txt create mode 100644 wiki/Template:Wip-20141117111219-show.txt create mode 100644 wiki/Template:Yes-20141117103824-show.txt create mode 100644 wiki/User:Akkana-20200815174829-show.txt create mode 100644 wiki/User:AlexiaDeath-20210227153042-show.txt create mode 100644 wiki/User:BatO-20200920163001-show.txt create mode 100644 wiki/User:Bootchk-20210115205922-show.txt create mode 100644 wiki/User:Drawoc-20210417223818-show.txt create mode 100644 wiki/User:Edj-20200923100030-show.txt create mode 100644 wiki/User:Enselic-20210513100057-show.txt create mode 100644 wiki/User:Grafxuser-20200920173119-show.txt create mode 100644 wiki/User:Lillolollo-20210115195722-show.txt create mode 100644 wiki/User:Mitch-20200806230338-show.txt create mode 100644 wiki/User:Owencook-20201022145607-show.txt create mode 100644 wiki/User:Patdavid-20150926102705-show.txt create mode 100644 wiki/User:Schumaml-20210117125548-show.txt create mode 100644 wiki/User:Scl-20210115211436-show.txt create mode 100644 wiki/User:Test-20210615070413-show.txt create mode 100644 wiki/User:ThomasManni-20210117123633-show.txt create mode 100644 wiki/Users:Tips-20161024112554-edit.txt create mode 100644 wiki/Users:Tips-20180812150616-show.txt create mode 100644 wiki/Users:Tips-20201001195447-edit.txt create mode 100644 wiki/WGO_Redesign-20161025045930-show.txt create mode 100644 wiki/imgs/Blur_dialog1.png create mode 100644 wiki/imgs/Dave_Neary.jpg create mode 100644 wiki/imgs/Depth_of_control_point.png create mode 100644 wiki/imgs/Gnu-head-sm.jpg create mode 100644 wiki/imgs/Hello.png create mode 100644 wiki/imgs/Mac_gimp_logo4.png create mode 100644 wiki/imgs/Macosx_screenshot1_thumb.jpg create mode 100644 wiki/imgs/Oyvind_Kolas.png create mode 100644 wiki/imgs/People2000-small.jpg create mode 100644 wiki/imgs/People2003-small.png create mode 100644 wiki/imgs/Somerights20.gif create mode 100644 wiki/imgs/Source_and_destination_pose.png create mode 100644 wiki/imgs/Wilber.png create mode 100644 wiki/imgs/pull.txt diff --git a/wiki/Algorithm_Index-20210118143033-edit.txt b/wiki/Algorithm_Index-20210118143033-edit.txt new file mode 100644 index 0000000..57aeeae --- /dev/null +++ b/wiki/Algorithm_Index-20210118143033-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Index of Algorithms]] diff --git a/wiki/Algorithms-20201031072416-show.txt b/wiki/Algorithms-20201031072416-show.txt new file mode 100644 index 0000000..536ebb4 --- /dev/null +++ b/wiki/Algorithms-20201031072416-show.txt @@ -0,0 +1,2 @@ + +
#REDIRECT[[Index of Algorithms]]
diff --git a/wiki/Algorithms-20201124152652-edit.txt b/wiki/Algorithms-20201124152652-edit.txt new file mode 100644 index 0000000..d2f699f --- /dev/null +++ b/wiki/Algorithms-20201124152652-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Algorithm Index]] diff --git a/wiki/Algorithms-20210518041020-show.txt b/wiki/Algorithms-20210518041020-show.txt new file mode 100644 index 0000000..6599109 --- /dev/null +++ b/wiki/Algorithms-20210518041020-show.txt @@ -0,0 +1,2 @@ + +
#REDIRECT[[Index of Algorithms]]
diff --git a/wiki/Algorithms:Flood-20201026071702-edit.txt b/wiki/Algorithms:Flood-20201026071702-edit.txt new file mode 100644 index 0000000..775bf1b --- /dev/null +++ b/wiki/Algorithms:Flood-20201026071702-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Flood algorithm]] diff --git a/wiki/Build:Basic-20150910223625-show.txt b/wiki/Build:Basic-20150910223625-show.txt new file mode 100644 index 0000000..ace34e9 --- /dev/null +++ b/wiki/Build:Basic-20150910223625-show.txt @@ -0,0 +1,76 @@ + +'''page is being written; please be patient''' + + +==Introduction== + +This page describes how to set up an environment to build Gimp from source, to get the source, and to +build Gimp (and the necessary prerequisites). + +The goal will be to keep the Gimp development environment separate from the rest of the system, to make +sure that instabilities in the Gimp development code do not impact the system as a whole. It will allow +you to keep using a stable Gimp version while working on the development version. + +The initial description on this page is based on working on Linux. Developers with +experience developing on other systems are encourage to add details. + + +* Define the Development Environment +* Getting the necessary source +* Running autoconf / configure +* Running make / make install +* References + +==Define the Development Environment== + +The first decision to make is where to set up the Gimp development environment. For instance, you could +create a directory gimpdev under your home directory, or maybe you have a different +place on your system where you do all your development work. Personally, I do all my development on a +separately mounted drive at /mnt/lincoln/d3. + +Set the environment variable GIMPDEV to the location where you do your Gimp development +(obviously, use your actual location rather than the example given here): + +
export GIMPDEV=/mnt/lincoln/d3/gimpdev
+ +In the $GIMPDEV directory, create two sub-directories: source (where all +the source code will be located), and deploy (where the libraries and executable programms +are going to be installed). + +With those directories created, four more environment variables should be defined. The PREFIX +variable will be used as the --prefix attribute for configure, and point to the deploy +directory. The PATH, LD_LIBRARY_PATH and PKG_CONFIG_PATH +variables are re-defined to include the Gimp development versions of the component before the +version installed on the system. + +
export PREFIX=$GIMPDEV/deploy
+export PATH=$PREFIX/bin:$PATH
+export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
+export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
+ +In order to keep the Gimp development environment separate from regular work, these settings should not +be added to the standard settings. A better solution would be to create a batch file with these settings +(e.g. startgimpdev) and invoke that: + +
source startgimpdev
+ +Note the use of the source command; that is the only way to get the settings in the current +shell, rather than being lost when the batch file is done. + +My complete startgimpdev batch file looks like this: + +
#!/bin/bash
+
+export GIMPDEV=/mnt/lincoln/d3/gimpdev
+export PREFIX=$GIMPDEV/deploy
+export PATH=$PREFIX/bin:$PATH
+export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
+export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
+
+cd $GIMPDEV/source
+ +==References== + +* [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html Blog post by Martin Nordholts on keeping Gimp up-to-date using git.] +
  • [http://www.graphics-muse.org/artistsguide/?p=247 Blog post by Michael J. Hammel on building Gimp 2.7 from source.]
  • +* [http://www.graphics-muse.org/artistsguide/?p=247 Blog post by Michael J. Hammel on building Gimp 2.7 from source.] diff --git a/wiki/Category:Algorithms-20161017122944-show.txt b/wiki/Category:Algorithms-20161017122944-show.txt new file mode 100644 index 0000000..520a34b --- /dev/null +++ b/wiki/Category:Algorithms-20161017122944-show.txt @@ -0,0 +1,14 @@ + + +Algorithms used within GIMP. + +
    +

    Pages in category "Algorithms"

    + +The following 2 pages are in this category, out of 2 total. +

    F

    + +* [[Flood algorithm]]

    I

    + +* [[Index of Algorithms]]
    +
    diff --git a/wiki/Documentation:Main-20161024003532-edit.txt b/wiki/Documentation:Main-20161024003532-edit.txt new file mode 100644 index 0000000..bcce2e2 --- /dev/null +++ b/wiki/Documentation:Main-20161024003532-edit.txt @@ -0,0 +1,67 @@ +==GIMP User Manual== + +These pages are for coordinating the documentation effort for the user manual. + +=== Roadmap === + +==== Release 3.0 ==== + +* Use [https://fedorahosted.org/publican/ publican]. [https://bugzilla.gnome.org/show_bug.cgi?id=723512 Bug 723512] + +** Can we move to pandoc to write the source content in Markdown, ASCII Doc or similar? From there generate DocBook XML and go with publican ... + +* Include/maintain the tutorials from www.gimp.org. How do we sync it in gimp-web? + +==== Release 3.2 ==== + +* Check if we can integrate the manual with the GNOME help browser. I think the possibility was always there, but simply lacked on man power. + +* Style docs.gimp.org as if it is part of http://www.gimp.org. [https://bugzilla.gnome.org/show_bug.cgi?id=723513 Bug 723513] + +* Proposal: Synchronize with GIMPs branching model and release dates. Use feature branches for features of the next GIMP release. If we decide to have release dates separately from GIMP, then a bugfix branch for changes, that result from GIMP bugfixes in the next GIMP release, would be necessary. + +* '''Split the current reference''' from the manual (tutorials etc). That means we provide a reference and a tutorial section and maintain them. We'll have to decide which one will be shipped with GIMP. The manual, reference, both? + +==== Release 3.4 ==== + +* Incorporate the quickreference with the manual better: There must be the way we could generate the quick reference out of the manual or perhaps even GIMP, so that we store/retrieve shortcuts from a single source. + +* Leverage GUI testing tools to automate the process of making screenshots from all GIMP dialogs/menus etc. + +==== Future ==== + +* Provide a better way to interact with the GIMP help browser. We could document special URLs which allow the user to open certain dialogs in GIMP (security!) or show them how to access dialogs. + +* Add a search engine to search fastly in the docs and optionally additional websites (www.gimp.org, forums, social network topic groups, mailing lists etc). For instance see the Eclipse help as inspiration. https://bugzilla.gnome.org/show_bug.cgi?id=152987 + +* Automatically generate translation statistics for every chapter of the documentation to guide interested contributors to spots that need some love. + +* Provide additional formats for e-readers, e.g. epub. Epub is almost HTML with a bit of metadata sprinkled inside it. Kindle Mobi is similar. + +=== History === + +==== Technical Background ==== +The GIMP help browser uses a mapping between GIMP widgets and the generated HTML files. The id in the help has to match the id used by the widget. + +Basis of the manual is DocBook XML. Translations are provided using gettext. All translations are stored in their respective po files in the po/ISO_CODE directory. When HTML is build, new DocBook XML is generated for the specific language based on the translation. Based on the newly generated XML, the HTML is generated. + +In case the project changes to a new documentation system, the following requirements must be met: + +* stable ids for documents +* unique ids for documents +* versioning +* freezing of documents to a certain version, eg. to say this document is valid for GIMP 2.6 + +==== Initial Goals ==== +Our initial goals set in 2003 were to provide a useful manual for GIMP > 2. This has been reached. +Over time we felt that we can provide additional formats for print out, but never went beyond a stable state. + +==== Initial Problems ==== +We've had a very low amount of contributions in the early stages of the project, since all translation had to be done in the XML. Since we've moved to gettext, it helped us to keep translation contributions. + + +=== Current === + +Even though there is a lack of maintainership towards releases, contributions are still happen at a high rate. Releases need to be made more frequently and the current work in progress on http://docs.gimp.org is not frequently updated. + +* [[Documentation:RoadmapIdeas]] – Ideas which are become part of our roadmap diff --git a/wiki/Documentation:Main-20180812150616-show.txt b/wiki/Documentation:Main-20180812150616-show.txt new file mode 100644 index 0000000..d5c3dbe --- /dev/null +++ b/wiki/Documentation:Main-20180812150616-show.txt @@ -0,0 +1,83 @@ + + +__TOC__ + +==GIMP User Manual== + +These pages are for coordinating the documentation effort for the user manual. + + +===Roadmap=== + +====Release 3.0==== + +* Use [https://fedorahosted.org/publican/ publican]. [https://bugzilla.gnome.org/show_bug.cgi?id=723512 Bug 723512] + +** Can we move to pandoc to write the source content in Markdown, ASCII Doc or similar? From there generate DocBook XML and go with publican ... +** Can we move to pandoc to write the source content in Markdown, ASCII Doc or similar? From there generate DocBook XML and go with publican ... +* Can we move to pandoc to write the source content in Markdown, ASCII Doc or similar? From there generate DocBook XML and go with publican ... + +* Include/maintain the tutorials from www.gimp.org. How do we sync it in gimp-web? + +====Release 3.2==== + +* Check if we can integrate the manual with the GNOME help browser. I think the possibility was always there, but simply lacked on man power. + +* Style docs.gimp.org as if it is part of [http://www.gimp.org/ http://www.gimp.org]. [https://bugzilla.gnome.org/show_bug.cgi?id=723513 Bug 723513] + +* Proposal: Synchronize with GIMPs branching model and release dates. Use feature branches for features of the next GIMP release. If we decide to have release dates separately from GIMP, then a bugfix branch for changes, that result from GIMP bugfixes in the next GIMP release, would be necessary. + +* '''Split the current reference''' from the manual (tutorials etc). That means we provide a reference and a tutorial section and maintain them. We'll have to decide which one will be shipped with GIMP. The manual, reference, both? + +====Release 3.4==== + +* Incorporate the quickreference with the manual better: There must be the way we could generate the quick reference out of the manual or perhaps even GIMP, so that we store/retrieve shortcuts from a single source. + +* Leverage GUI testing tools to automate the process of making screenshots from all GIMP dialogs/menus etc. + +====Future==== + +* Provide a better way to interact with the GIMP help browser. We could document special URLs which allow the user to open certain dialogs in GIMP (security!) or show them how to access dialogs. + +* Add a search engine to search fastly in the docs and optionally additional websites (www.gimp.org, forums, social network topic groups, mailing lists etc). For instance see the Eclipse help as inspiration. [https://bugzilla.gnome.org/show_bug.cgi?id=152987 https://bugzilla.gnome.org/show_bug.cgi?id=152987] + +* Automatically generate translation statistics for every chapter of the documentation to guide interested contributors to spots that need some love. + +* Provide additional formats for e-readers, e.g. epub. Epub is almost HTML with a bit of metadata sprinkled inside it. Kindle Mobi is similar. + +===History=== + +====Technical Background==== + +The GIMP help browser uses a mapping between GIMP widgets and the generated HTML files. The id in the help has to match the id used by the widget. + +Basis of the manual is DocBook XML. Translations are provided using gettext. All translations are stored in their respective po files in the po/ISO_CODE directory. When HTML is build, new DocBook XML is generated for the specific language based on the translation. Based on the newly generated XML, the HTML is generated. + +In case the project changes to a new documentation system, the following requirements must be met: + + +* stable ids for documents +* unique ids for documents +* versioning +* freezing of documents to a certain version, eg. to say this document is valid for GIMP 2.6 + +====Initial Goals==== + +Our initial goals set in 2003 were to provide a useful manual for GIMP > 2. This has been reached. +Over time we felt that we can provide additional formats for print out, but never went beyond a stable state. + + +====Initial Problems==== + +We've had a very low amount of contributions in the early stages of the project, since all translation had to be done in the XML. Since we've moved to gettext, it helped us to keep translation contributions. + + + + + +===Current=== + +Even though there is a lack of maintainership towards releases, contributions are still happen at a high rate. Releases need to be made more frequently and the current work in progress on [http://docs.gimp.org/ http://docs.gimp.org] is not frequently updated. + + +* [[Documentation:RoadmapIdeas]] – Ideas which are become part of our roadmap diff --git a/wiki/Documentation:Main-20200811194509-edit.txt b/wiki/Documentation:Main-20200811194509-edit.txt new file mode 100644 index 0000000..bcce2e2 --- /dev/null +++ b/wiki/Documentation:Main-20200811194509-edit.txt @@ -0,0 +1,67 @@ +==GIMP User Manual== + +These pages are for coordinating the documentation effort for the user manual. + +=== Roadmap === + +==== Release 3.0 ==== + +* Use [https://fedorahosted.org/publican/ publican]. [https://bugzilla.gnome.org/show_bug.cgi?id=723512 Bug 723512] + +** Can we move to pandoc to write the source content in Markdown, ASCII Doc or similar? From there generate DocBook XML and go with publican ... + +* Include/maintain the tutorials from www.gimp.org. How do we sync it in gimp-web? + +==== Release 3.2 ==== + +* Check if we can integrate the manual with the GNOME help browser. I think the possibility was always there, but simply lacked on man power. + +* Style docs.gimp.org as if it is part of http://www.gimp.org. [https://bugzilla.gnome.org/show_bug.cgi?id=723513 Bug 723513] + +* Proposal: Synchronize with GIMPs branching model and release dates. Use feature branches for features of the next GIMP release. If we decide to have release dates separately from GIMP, then a bugfix branch for changes, that result from GIMP bugfixes in the next GIMP release, would be necessary. + +* '''Split the current reference''' from the manual (tutorials etc). That means we provide a reference and a tutorial section and maintain them. We'll have to decide which one will be shipped with GIMP. The manual, reference, both? + +==== Release 3.4 ==== + +* Incorporate the quickreference with the manual better: There must be the way we could generate the quick reference out of the manual or perhaps even GIMP, so that we store/retrieve shortcuts from a single source. + +* Leverage GUI testing tools to automate the process of making screenshots from all GIMP dialogs/menus etc. + +==== Future ==== + +* Provide a better way to interact with the GIMP help browser. We could document special URLs which allow the user to open certain dialogs in GIMP (security!) or show them how to access dialogs. + +* Add a search engine to search fastly in the docs and optionally additional websites (www.gimp.org, forums, social network topic groups, mailing lists etc). For instance see the Eclipse help as inspiration. https://bugzilla.gnome.org/show_bug.cgi?id=152987 + +* Automatically generate translation statistics for every chapter of the documentation to guide interested contributors to spots that need some love. + +* Provide additional formats for e-readers, e.g. epub. Epub is almost HTML with a bit of metadata sprinkled inside it. Kindle Mobi is similar. + +=== History === + +==== Technical Background ==== +The GIMP help browser uses a mapping between GIMP widgets and the generated HTML files. The id in the help has to match the id used by the widget. + +Basis of the manual is DocBook XML. Translations are provided using gettext. All translations are stored in their respective po files in the po/ISO_CODE directory. When HTML is build, new DocBook XML is generated for the specific language based on the translation. Based on the newly generated XML, the HTML is generated. + +In case the project changes to a new documentation system, the following requirements must be met: + +* stable ids for documents +* unique ids for documents +* versioning +* freezing of documents to a certain version, eg. to say this document is valid for GIMP 2.6 + +==== Initial Goals ==== +Our initial goals set in 2003 were to provide a useful manual for GIMP > 2. This has been reached. +Over time we felt that we can provide additional formats for print out, but never went beyond a stable state. + +==== Initial Problems ==== +We've had a very low amount of contributions in the early stages of the project, since all translation had to be done in the XML. Since we've moved to gettext, it helped us to keep translation contributions. + + +=== Current === + +Even though there is a lack of maintainership towards releases, contributions are still happen at a high rate. Releases need to be made more frequently and the current work in progress on http://docs.gimp.org is not frequently updated. + +* [[Documentation:RoadmapIdeas]] – Ideas which are become part of our roadmap diff --git a/wiki/Documentation:Main-20210512212113-edit.txt b/wiki/Documentation:Main-20210512212113-edit.txt new file mode 100644 index 0000000..bcce2e2 --- /dev/null +++ b/wiki/Documentation:Main-20210512212113-edit.txt @@ -0,0 +1,67 @@ +==GIMP User Manual== + +These pages are for coordinating the documentation effort for the user manual. + +=== Roadmap === + +==== Release 3.0 ==== + +* Use [https://fedorahosted.org/publican/ publican]. [https://bugzilla.gnome.org/show_bug.cgi?id=723512 Bug 723512] + +** Can we move to pandoc to write the source content in Markdown, ASCII Doc or similar? From there generate DocBook XML and go with publican ... + +* Include/maintain the tutorials from www.gimp.org. How do we sync it in gimp-web? + +==== Release 3.2 ==== + +* Check if we can integrate the manual with the GNOME help browser. I think the possibility was always there, but simply lacked on man power. + +* Style docs.gimp.org as if it is part of http://www.gimp.org. [https://bugzilla.gnome.org/show_bug.cgi?id=723513 Bug 723513] + +* Proposal: Synchronize with GIMPs branching model and release dates. Use feature branches for features of the next GIMP release. If we decide to have release dates separately from GIMP, then a bugfix branch for changes, that result from GIMP bugfixes in the next GIMP release, would be necessary. + +* '''Split the current reference''' from the manual (tutorials etc). That means we provide a reference and a tutorial section and maintain them. We'll have to decide which one will be shipped with GIMP. The manual, reference, both? + +==== Release 3.4 ==== + +* Incorporate the quickreference with the manual better: There must be the way we could generate the quick reference out of the manual or perhaps even GIMP, so that we store/retrieve shortcuts from a single source. + +* Leverage GUI testing tools to automate the process of making screenshots from all GIMP dialogs/menus etc. + +==== Future ==== + +* Provide a better way to interact with the GIMP help browser. We could document special URLs which allow the user to open certain dialogs in GIMP (security!) or show them how to access dialogs. + +* Add a search engine to search fastly in the docs and optionally additional websites (www.gimp.org, forums, social network topic groups, mailing lists etc). For instance see the Eclipse help as inspiration. https://bugzilla.gnome.org/show_bug.cgi?id=152987 + +* Automatically generate translation statistics for every chapter of the documentation to guide interested contributors to spots that need some love. + +* Provide additional formats for e-readers, e.g. epub. Epub is almost HTML with a bit of metadata sprinkled inside it. Kindle Mobi is similar. + +=== History === + +==== Technical Background ==== +The GIMP help browser uses a mapping between GIMP widgets and the generated HTML files. The id in the help has to match the id used by the widget. + +Basis of the manual is DocBook XML. Translations are provided using gettext. All translations are stored in their respective po files in the po/ISO_CODE directory. When HTML is build, new DocBook XML is generated for the specific language based on the translation. Based on the newly generated XML, the HTML is generated. + +In case the project changes to a new documentation system, the following requirements must be met: + +* stable ids for documents +* unique ids for documents +* versioning +* freezing of documents to a certain version, eg. to say this document is valid for GIMP 2.6 + +==== Initial Goals ==== +Our initial goals set in 2003 were to provide a useful manual for GIMP > 2. This has been reached. +Over time we felt that we can provide additional formats for print out, but never went beyond a stable state. + +==== Initial Problems ==== +We've had a very low amount of contributions in the early stages of the project, since all translation had to be done in the XML. Since we've moved to gettext, it helped us to keep translation contributions. + + +=== Current === + +Even though there is a lack of maintainership towards releases, contributions are still happen at a high rate. Releases need to be made more frequently and the current work in progress on http://docs.gimp.org is not frequently updated. + +* [[Documentation:RoadmapIdeas]] – Ideas which are become part of our roadmap diff --git a/wiki/Documentation:RoadmapIdeas-20150910071238-edit.txt b/wiki/Documentation:RoadmapIdeas-20150910071238-edit.txt new file mode 100644 index 0000000..aae9b99 --- /dev/null +++ b/wiki/Documentation:RoadmapIdeas-20150910071238-edit.txt @@ -0,0 +1,48 @@ +=== Current Roadmap Ideas === + +The ideas were collaboratively gathered on: https://gimphelp.etherpad.mozilla.org/1? + + +=== Future Opportunities === + +==== Content ==== + + +* Improve the Git branching model: +Currently documenters, who want to document a bugfix or feature of the next minor or major version only can commit to master. This has either the disadvantage to interfere with bugfix commits for the current release or to wait for the next release. +If we're unlucky and the contributor isn't there or can't remember anymore at time of the next release, somebody else will have to find out everything with much effort or the help stays uncomplete. +This would GIMP code contributors enable to write documentation as long as their knowledge about it is wet and let them do their work decoupled from other activities. Thus the documentation could be more complete and up-to-date. + +* Add a public glossary for UI, documentation and translation to ensure the same things/activities are titled with the same words and translations. + +* Add a common image repository for samples to make the documentation consistent. + +* Separate contents for various target audiences (photographers, web designers, digital artists, scientists etc.) to better address their needs. This could for instance be + +## subchapters for each audience in each chapter (i.e. 'Edge detection filter' -> General information: this filter detects edges ... For photographers: use parameters x,y to achieve satisfying results. For scientists: description of the underlying algorithms) or +## one chapter per audience ("GIMP for Photographers') and subchapters with specialized activities ('Adjusting tonal values', 'Cropping', etc.) + +==== System ==== + +* We could move to a wiki based solution. The opportunities here are: + +** lower the barrier for new contributors +** we don't need to create releases and continous update of the work in progress state on docs.gimp.org +** would allow us to documentation our process better as we had with wiki.gimp.org +** move documentation currently maintained on http://www.gimp.org into the wiki as well so we can keep them consistent + +* The solution need to be carefully evaluated. It needs to provide all technicallities I've described above. Furthermore a seemless import of the current content needs to be possible. + +* Move the GIMP help browser to a faster browser engine, i.e. Blink, to address the performance goal of the product vision. + + +* In GIMP use *.ui files for as much as possible UI and generate or update the documentation from it (by XSLT). This way we'd ensure that always all widgets in dialogs etc. are documented or known to be documented (mark new widgets with TODO in the documentation). + +* Add possibilities to rate topics, easily contribute little improvements and micro-donate to well written documentation (Flattr, etc.) + + +==== Contributor Impact ==== + +* Move the manual to github.com in order to leverage the better integration with fork/merge to get more contributors. + +* Alternatively add a CI system (Jenkins) + Code review (for instance Gerrit etc.) This probably has to happen on a bigger scale (e.g. the whole GIMP project or GNOME). With this, reviewing patches is still technical, but much easier than what we currently have. diff --git a/wiki/Documentation:RoadmapIdeas-20161024014527-show.txt b/wiki/Documentation:RoadmapIdeas-20161024014527-show.txt new file mode 100644 index 0000000..6fd056a --- /dev/null +++ b/wiki/Documentation:RoadmapIdeas-20161024014527-show.txt @@ -0,0 +1,71 @@ + + +__TOC__ + +===Current Roadmap Ideas=== + +The ideas were collaboratively gathered on: [https://gimphelp.etherpad.mozilla.org/1 https://gimphelp.etherpad.mozilla.org/1]? + + + + + +===Future Opportunities=== + +====Content==== + +* Improve the Git branching model: + +Currently documenters, who want to document a bugfix or feature of the next minor or major version only can commit to master. This has either the disadvantage to interfere with bugfix commits for the current release or to wait for the next release. +If we're unlucky and the contributor isn't there or can't remember anymore at time of the next release, somebody else will have to find out everything with much effort or the help stays uncomplete. +This would GIMP code contributors enable to write documentation as long as their knowledge about it is wet and let them do their work decoupled from other activities. Thus the documentation could be more complete and up-to-date. + + +* Add a public glossary for UI, documentation and translation to ensure the same things/activities are titled with the same words and translations. + +* Add a common image repository for samples to make the documentation consistent. + +* Separate contents for various target audiences (photographers, web designers, digital artists, scientists etc.) to better address their needs. This could for instance be + +## subchapters for each audience in each chapter (i.e. 'Edge detection filter' -> General information: this filter detects edges ... For photographers: use parameters x,y to achieve satisfying results. For scientists: description of the underlying algorithms) or +## one chapter per audience ("GIMP for Photographers') and subchapters with specialized activities ('Adjusting tonal values', 'Cropping', etc.) +## subchapters for each audience in each chapter (i.e. 'Edge detection filter' -> General information: this filter detects edges ... For photographers: use parameters x,y to achieve satisfying results. For scientists: description of the underlying algorithms) or +## one chapter per audience ("GIMP for Photographers') and subchapters with specialized activities ('Adjusting tonal values', 'Cropping', etc.) +# subchapters for each audience in each chapter (i.e. 'Edge detection filter' -> General information: this filter detects edges ... For photographers: use parameters x,y to achieve satisfying results. For scientists: description of the underlying algorithms) or +# one chapter per audience ("GIMP for Photographers') and subchapters with specialized activities ('Adjusting tonal values', 'Cropping', etc.) + +====System==== + +* We could move to a wiki based solution. The opportunities here are: + +** lower the barrier for new contributors +** we don't need to create releases and continous update of the work in progress state on docs.gimp.org +** would allow us to documentation our process better as we had with wiki.gimp.org +** move documentation currently maintained on [http://www.gimp.org/ http://www.gimp.org] into the wiki as well so we can keep them consistent +** lower the barrier for new contributors +** we don't need to create releases and continous update of the work in progress state on docs.gimp.org +** would allow us to documentation our process better as we had with wiki.gimp.org +** move documentation currently maintained on [http://www.gimp.org/ http://www.gimp.org] into the wiki as well so we can keep them consistent +* lower the barrier for new contributors +* we don't need to create releases and continous update of the work in progress state on docs.gimp.org +* would allow us to documentation our process better as we had with wiki.gimp.org +* move documentation currently maintained on [http://www.gimp.org/ http://www.gimp.org] into the wiki as well so we can keep them consistent + +* The solution need to be carefully evaluated. It needs to provide all technicallities I've described above. Furthermore a seemless import of the current content needs to be possible. + +* Move the GIMP help browser to a faster browser engine, i.e. Blink, to address the performance goal of the product vision. + + + +* In GIMP use *.ui files for as much as possible UI and generate or update the documentation from it (by XSLT). This way we'd ensure that always all widgets in dialogs etc. are documented or known to be documented (mark new widgets with TODO in the documentation). + +* Add possibilities to rate topics, easily contribute little improvements and micro-donate to well written documentation (Flattr, etc.) + + + + +====Contributor Impact==== + +* Move the manual to github.com in order to leverage the better integration with fork/merge to get more contributors. + +* Alternatively add a CI system (Jenkins) + Code review (for instance Gerrit etc.) This probably has to happen on a bigger scale (e.g. the whole GIMP project or GNOME). With this, reviewing patches is still technical, but much easier than what we currently have. diff --git a/wiki/Extensions-20180812150612-show.txt b/wiki/Extensions-20180812150612-show.txt new file mode 100644 index 0000000..a2b3ad8 --- /dev/null +++ b/wiki/Extensions-20180812150612-show.txt @@ -0,0 +1,153 @@ + + +Discussion for implementing an internal extension browser and installer. + + + + + +__TOC__ + +==User Overview== + +The idea is to create a means for users to browse and install assets for GIMP from within GIMP. + +A user will be able to invoke a new GUI window for browsing available assets. + +Assets can be: + + +* Interpreted/dynamic scripting language plugins +** Script-Fu +** Python +** Script-Fu +** Python +* Script-Fu +* Python +* Brushes +* Dynamics +* Patterns +* Palettes +* Gradients +* Fonts +* Tool Presets +* MyPaint bruses +* Themes +* Icon Themes + +Not all of these may be supported initially. + +A user will be able to install, uninstall, update and activate any of the assets from this GUI. +There will be 2 types of extensions: system extensions and user extensions. + + +===System extensions=== + +System extensions are extensions installed by default (therefore read-only). One will be able to: + + +* Deactivate them: they will not be loaded anymore so that one can get rid of features one really don't care about. +* Update then: since they are rid only, it actually means "overriding them by installing a new version as user extension". For instance suppose that when you installed GIMP, you had the extension "Foobar" v1.2 installed as system extension (maintained by upstream GIMP developers). GIMP developers could update this extension and release foobar v1.3 without releasing a new version of GIMP. So you could install foobar v1.3 as a user extension, which would deactivate and override foobar v1.2. + +===User extensions=== + +User extensions are installed by the user and are usually provided by a GIMP extension repository. One will be able to: + + +* Search them using keywords. +* Install them. +* Uninstall them. +* Deactivate them (keeping them installed, yet not loaded). + +==GUI== + +The user will interact with the system through a new GUI. + + + + +==Website== + +The data for the assets will be stored on a server controlled by the GIMP team. +It ''may'' be the same server that the main website resides on. + +The website will be the primary means of contributing assets for inclusion in the extensions browser. +Jehan uses the example of [https://addons.mozilla.org/en-US/firefox/extensions/ Firefox] or [https://extensions.gnome.org/ GNOME] extensions as an idea for what we are envisioning. + +The website will primarily allow 3 main functions: + + +# Query and download assets +# Upload assets +# Moderation + + + + +===Read assets=== + +All available assets should be searchable and listed, probably categorized by type or other tags. + +Each asset will have its own page. + +The page should show: + + +* Title/Name +* Author +* Description +* Version +* Date uploaded +* GIMP Version required +* License +* Thumbnail? + +The page might also show: + + +* # of installed/users +* Rating +* URL or external link + + + + +====Metadata format==== + +You can actually read the full list of metadata an extension creator can provide, since we are using the AppStream specification: see the [Generic part of the spec]([https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#sect-Metadata-GenericComponent https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#sect-Metadata-GenericComponent]) and the [section about addons]([https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Addon.html https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Addon.html]). + +The mandatory sections of the appstream files are: + + +* an `` following reverse-DNS scheme, and which has to be unique. + +* `org.gimp.GIMP` +* A `` + +* `` to tell exactly which GIMP version it is meant to work with. + +* `` to tell the version of the extension, allowing updates. + + +Optionally: + + +* It should be possible to add `` to set dependencies to other extensions. + +* For better understanding, we recommend adding a `` and a `` as well as `` (when applying, i.e. with extensions having a GUI or graphical outputs). + +* The upstream GIMP repository may accept non-Free Software extensions (to be discussed) but we will definitely give preference to FLOSS. A `` tag is therefore recommended. + + +====Machine Readable==== + +The server should also have a means for delivering data to GIMP when queried, such as: + + +* XML (or other) response of a list of all assets (for the GUI to parse) + global metadata +* Specific information about a particular asset (name, type, description, rating(?), thumbnail or extended metadata) + +===Upload assets=== + +===Moderate assets=== + \ No newline at end of file diff --git a/wiki/Extensions-20200923033421-edit.txt b/wiki/Extensions-20200923033421-edit.txt new file mode 100644 index 0000000..dac93fd --- /dev/null +++ b/wiki/Extensions-20200923033421-edit.txt @@ -0,0 +1,119 @@ +Discussion for implementing an internal extension browser and installer. + + +== User Overview == + +The idea is to create a means for users to browse and install assets for GIMP from within GIMP. + +A user will be able to invoke a new GUI window for browsing available assets. + +Assets can be: + +* Interpreted/dynamic scripting language plugins +** Script-Fu +** Python +* Brushes +* Dynamics +* Patterns +* Palettes +* Gradients +* Fonts +* Tool Presets +* MyPaint bruses +* Themes +* Icon Themes + +Not all of these may be supported initially. + +A user will be able to install, uninstall, update and activate any of the assets from this GUI. +There will be 2 types of extensions: system extensions and user extensions. + +=== System extensions === + +System extensions are extensions installed by default (therefore read-only). One will be able to: + +* Deactivate them: they will not be loaded anymore so that one can get rid of features one really don't care about. +* Update then: since they are rid only, it actually means "overriding them by installing a new version as user extension". For instance suppose that when you installed GIMP, you had the extension "Foobar" v1.2 installed as system extension (maintained by upstream GIMP developers). GIMP developers could update this extension and release foobar v1.3 without releasing a new version of GIMP. So you could install foobar v1.3 as a user extension, which would deactivate and override foobar v1.2. + +=== User extensions === + +User extensions are installed by the user and are usually provided by a GIMP extension repository. One will be able to: + +* Search them using keywords. +* Install them. +* Uninstall them. +* Deactivate them (keeping them installed, yet not loaded). + +== GUI == + +The user will interact with the system through a new GUI. + + + +== Website == + +The data for the assets will be stored on a server controlled by the GIMP team. +It ''may'' be the same server that the main website resides on. + +The website will be the primary means of contributing assets for inclusion in the extensions browser. +Jehan uses the example of [https://addons.mozilla.org/en-US/firefox/extensions/ Firefox] or [https://extensions.gnome.org/ GNOME] extensions as an idea for what we are envisioning. + +The website will primarily allow 3 main functions: + +# Query and download assets +# Upload assets +# Moderation + + +=== Read assets === + +All available assets should be searchable and listed, probably categorized by type or other tags. + +Each asset will have its own page. + +The page should show: + +* Title/Name +* Author +* Description +* Version +* Date uploaded +* GIMP Version required +* License +* Thumbnail? + +The page might also show: + +* # of installed/users +* Rating +* URL or external link + + +==== Metadata format ==== + +You can actually read the full list of metadata an extension creator can provide, since we are using the AppStream specification: see the [Generic part of the spec](https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#sect-Metadata-GenericComponent) and the [section about addons](https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Addon.html). + +The mandatory sections of the appstream files are: + +* an `` following reverse-DNS scheme, and which has to be unique. +* `org.gimp.GIMP` +* A `` +* `` to tell exactly which GIMP version it is meant to work with. +* `` to tell the version of the extension, allowing updates. + +Optionally: + +* It should be possible to add `` to set dependencies to other extensions. +* For better understanding, we recommend adding a `` and a `` as well as `` (when applying, i.e. with extensions having a GUI or graphical outputs). +* The upstream GIMP repository may accept non-Free Software extensions (to be discussed) but we will definitely give preference to FLOSS. A `` tag is therefore recommended. + +==== Machine Readable ==== + +The server should also have a means for delivering data to GIMP when queried, such as: + +* XML (or other) response of a list of all assets (for the GUI to parse) + global metadata +* Specific information about a particular asset (name, type, description, rating(?), thumbnail or extended metadata) + +=== Upload assets === + +=== Moderate assets === diff --git a/wiki/Extensions-20210616195653-edit.txt b/wiki/Extensions-20210616195653-edit.txt new file mode 100644 index 0000000..dac93fd --- /dev/null +++ b/wiki/Extensions-20210616195653-edit.txt @@ -0,0 +1,119 @@ +Discussion for implementing an internal extension browser and installer. + + +== User Overview == + +The idea is to create a means for users to browse and install assets for GIMP from within GIMP. + +A user will be able to invoke a new GUI window for browsing available assets. + +Assets can be: + +* Interpreted/dynamic scripting language plugins +** Script-Fu +** Python +* Brushes +* Dynamics +* Patterns +* Palettes +* Gradients +* Fonts +* Tool Presets +* MyPaint bruses +* Themes +* Icon Themes + +Not all of these may be supported initially. + +A user will be able to install, uninstall, update and activate any of the assets from this GUI. +There will be 2 types of extensions: system extensions and user extensions. + +=== System extensions === + +System extensions are extensions installed by default (therefore read-only). One will be able to: + +* Deactivate them: they will not be loaded anymore so that one can get rid of features one really don't care about. +* Update then: since they are rid only, it actually means "overriding them by installing a new version as user extension". For instance suppose that when you installed GIMP, you had the extension "Foobar" v1.2 installed as system extension (maintained by upstream GIMP developers). GIMP developers could update this extension and release foobar v1.3 without releasing a new version of GIMP. So you could install foobar v1.3 as a user extension, which would deactivate and override foobar v1.2. + +=== User extensions === + +User extensions are installed by the user and are usually provided by a GIMP extension repository. One will be able to: + +* Search them using keywords. +* Install them. +* Uninstall them. +* Deactivate them (keeping them installed, yet not loaded). + +== GUI == + +The user will interact with the system through a new GUI. + + + +== Website == + +The data for the assets will be stored on a server controlled by the GIMP team. +It ''may'' be the same server that the main website resides on. + +The website will be the primary means of contributing assets for inclusion in the extensions browser. +Jehan uses the example of [https://addons.mozilla.org/en-US/firefox/extensions/ Firefox] or [https://extensions.gnome.org/ GNOME] extensions as an idea for what we are envisioning. + +The website will primarily allow 3 main functions: + +# Query and download assets +# Upload assets +# Moderation + + +=== Read assets === + +All available assets should be searchable and listed, probably categorized by type or other tags. + +Each asset will have its own page. + +The page should show: + +* Title/Name +* Author +* Description +* Version +* Date uploaded +* GIMP Version required +* License +* Thumbnail? + +The page might also show: + +* # of installed/users +* Rating +* URL or external link + + +==== Metadata format ==== + +You can actually read the full list of metadata an extension creator can provide, since we are using the AppStream specification: see the [Generic part of the spec](https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#sect-Metadata-GenericComponent) and the [section about addons](https://www.freedesktop.org/software/appstream/docs/sect-Metadata-Addon.html). + +The mandatory sections of the appstream files are: + +* an `` following reverse-DNS scheme, and which has to be unique. +* `org.gimp.GIMP` +* A `` +* `` to tell exactly which GIMP version it is meant to work with. +* `` to tell the version of the extension, allowing updates. + +Optionally: + +* It should be possible to add `` to set dependencies to other extensions. +* For better understanding, we recommend adding a `` and a `` as well as `` (when applying, i.e. with extensions having a GUI or graphical outputs). +* The upstream GIMP repository may accept non-Free Software extensions (to be discussed) but we will definitely give preference to FLOSS. A `` tag is therefore recommended. + +==== Machine Readable ==== + +The server should also have a means for delivering data to GIMP when queried, such as: + +* XML (or other) response of a list of all assets (for the GUI to parse) + global metadata +* Specific information about a particular asset (name, type, description, rating(?), thumbnail or extended metadata) + +=== Upload assets === + +=== Moderate assets === diff --git a/wiki/Flood_algorithm-20161017125542-show.txt b/wiki/Flood_algorithm-20161017125542-show.txt new file mode 100644 index 0000000..cacafd0 --- /dev/null +++ b/wiki/Flood_algorithm-20161017125542-show.txt @@ -0,0 +1,370 @@ + + + +Author: Ell + +Year: 2016 + + +__TOC__ + +=Abstract= + +The flood operation eliminates "holes" -- darker areas surrounded by lighter areas -- in single-component (grayscale) images. +It is particularly useful for eliminating such holes from selections; see GIMP bug [https://bugzilla.gnome.org/show_bug.cgi?id=761060 #761060] +for more details. + +The conceptual model considers the input image as the height-map of a hilly +terrain. After heavy rain completely floods the terrain, the remaining +water form lakes in its depressions. + +
                                   _______
    +                              /.\    /\_____________
    +                 ____________/...\  /..\  Water  /..\
    +                /....\      /.....\/....\__     /....\____
    +               /......\____/....Ground.....\___/......\  /\
    +            __/........................................\/..\_
    +
    + +Figure: A depiction of a one-dimensional flood. +Valleys correspond to "holes" in the input image, filled with "water" according to their surrounding. + +The result of the flood operation is the height-map of the terrain after the +flood, taking both ground- and water-level into account. + +More formally, the flood operation assigns to each pixel the minimum of the +maximal input-image values along all paths from the pixel to the "outside". +That is, the output value ''o(x)'' at pixel 'x' is given by + + + +
    [[File:Flood_Algorithm_-_Formula_1.gif|Flood Algorithm - Formula 1.gif]]
    + + +where ''P(x)'' is the set of all paths from ''x'' to the outside, and ''i(y)'' is +the value of the input image at pixel ''y''. + + +=Algorithm= + +In accord with the conceptual flood model, we refer to the values of the +input image as the "ground level", and to the values of the output image as +the "water level"; these values range from 0 to 1, and are considered to +be 0 outside the bounds of the image. Note not to confuse "water level" +with "water depth"; we use the term "water level" simply to refer to the +elevation of either the ground or the water at a certain point. + +Our starting point is modeling the problem as a cellular automaton. The +state of each cell (pixel) is its current water level, which is initially 1 +everywhere inside the image. The water level at each cell is updated +according to the rule + + + +
    [[File:Flood_Algorithm_-_Formula_2.gif|Flood Algorithm - Formula 2.gif]]
    + + +where ''wn(x)'' is the water level at pixel ''x'' on generation ''n'', ''g(x)'' is +the ground level at ''x'', and ''N(x)'' is the set of (orthogonal) neighbors of +''x'', including itself. In other words, the new water level at each pixel is +the maximum of its ground level, and the minimum of its own water level, and +that of its neighbors. This automaton converges to the output of the operation. + +The automaton converges after, at most, ''n'' generations, where ''n'' is the +number of pixels in the image. Therefore, a naive implementation, where +at most ''O(n)'' cells are processed on each generation, has a worst-case +time complexity of ''O(n2)''. By making a few observations, we can do +better, at least in the most common cases. + +First, note that the final state doesn't depend on the order of the +individual steps. That is, we don't actually have to update the water level +an entire generation at a time, but rather we can apply the transformation +rule to any pixel, at any time, arbitrarily, until convergence. +Furthermore, we don't even have to consider all the neighbors of a pixel +each time we apply the rule: as long as we make sure to never increase the +water level of a pixel, i.e., as long as we consider the pixel's own water +level as part of the minimum term, we can take a different subset of the +neighbors into account each time. + +Second, using the above observation, note that we can solve a one- +dimensional automaton (i.e., compute its final state) in linear time, using +two passes: On the first pass, we iterate over the pixels left-to-right, +applying the transformation rule while considering only the left neighbor of +each pixel (using the water level assigned to the neighbor on the previous +iteration; recall that the water level of the left neighbor of the leftmost +pixel of the image is considered to be 0.) On the second pass, we work in +reverse -- we iterate over the pixels right-to-left, applying the rule while +considering only the right neighbors. + +
                    _________________________________________________
    +                                  /.\    /\           __
    +                     ____        /...\  /..\         /..\
    +           (a)      /....\      /.....\/....\__     /....\
    +                   /......\____/...............\___/......\  /\
    +                __/........................................\/..\_
    +                                   ______________________________
    +                                  /.\    /\           __
    +                     ____________/...\  /..\         /..\
    +           (b)      /....\      /.....\/....\__     /....\
    +                   /......\____/...............\___/......\  /\
    +                __/........................................\/..\_
    +                                   _______
    +                                  /.\    /\_____________
    +                     ____________/...\  /..\         /..\
    +           (c)      /....\      /.....\/....\__     /....\____
    +                   /......\____/...............\___/......\  /\
    +                __/........................................\/..\_
    +
    +
    + +Figure: Water level of a one-dimensional automaton. (a) initially; (b) after the first pass; (c) after the second pass. + +While this technique doesn't extend directly to two dimensions, we can +leverage it by processing one-dimensional strips of pixels in batch, as +described above, instead of transforming pixels individually. + +Finally, another obvious way to speed things up is to minimize the amount of +unnecessary work we're doing. In particular, we only need to process pixels +whose neighbors' state changed. + +Taking all of the above into consideration, this is what we do: + +We maintain a queue of "segments" -- one-dimensional, contiguous, strips of +pixels -- whose water level needs to be updated, as a result of a change in +the water level of the pixels of a neighboring segment, referred to as the +"source segment". Although, for efficiency reasons, we allow segments to be +either horizontal or vertical, for simplicity, we treat all segments as +though they're horizontal, and perform the necessary coordinate-system +transformation when dealing with vertical segments, as explained later. + +Each segment is processed using the following steps: + +'''1. Vertical propagation:''' The segment's pixels are updated, using the above transformation rule, considering only the corresponding + +: neighboring pixels of the source segment. During the process, we inspect which of the segment's pixels actually changed, and create a + +: list of "dirty ranges" of modified pixels. We construct the ranges such that all pixels of each range have the same water level; this + +: becomes important in the next step. + + +
                   - - -+-----+-----+-----+-----+-----+-----+-----+- - -
    +      Source        |     |     |     |     |     |     |     |
    +      Segment       |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
    +               - - -+--|--+--|--+--|--+--|--+--|--+--|--+--|--+- - -
    +      Current       |  V  |  V  |  V  |  V  |  V  |  V  |  V  |
    +      Segment       |     |  x  |  x  |     |  y  |  z  |     |
    +               - - -+-----+-----+-----+-----+-----+-----+-----+- - -
    +      Dirty ranges        |-----------|     |-----|-----|
    +                The current segment's pixels are updated
    +                according to the neighboring pixels of the
    +                source segment, and contiguous runs of
    +                modified, equivalent pixels form a list of
    +                dirty ranges.
    +
    +'''2. Horizontal propagation:''' The segment's pixels are updated, considering only their left and right neighbors, using the two-pass process + +: described above. Though semantically equivalent, this process slightly more intricate than the one described above, since we use the + +: dirty ranges from the previous step to take a few shortcuts. + + +: Recall that all pixels of a single dirty range are equal, and therefore, unless modified as part of the current pass, don't affect + +: each other's state. On the other hand, all pixels outside any dirty range didn't change, and therefore, unless modified as part of the + +: current pass, don't affect each other's state either. As a result, initially, only the pixels that directly neighbor a dirty range, in the + +: direction of the pass, need to be updated. If the water level of such pixel changes, we need to update the following pixel, and so on. Once + +: the water level of a pixel remains the same, we don't have to update the next pixel, but can rather jump directly to the pixel at the edge + +: of the next dirty range, and so on. + + +: For example, when scanning left-to-right, we start at the pixel directly to the right of the first (leftmost) dirty range. We apply + +: the transformation rule to this pixel, and to the pixels to its right, until the water level of one of them is unaffected. At this point, we + +: jump directly to the pixel to the right of the next dirty range. + + +
               - -+---+---+---+---+---+---+---+---+---+---+---+- -
    +              |   |   |   | 1 | 2 |(3)|   |   | 4 |(5)|   |
    +           - -+---+---+---+---+---+---+---+---+---+---+---+- -
    +                  |-------|               |---|
    +                Pixel traversal order on a left-to-right
    +                pass. Traversal starts to the right of
    +                the first dirty range, at pixel ''1''.
    +                Pixel ''(3)'' is unaffected, and so we jump
    +                directly to the right of the second dirty
    +                range.
    +
    +: Of course, when scanning right-to-left, it all reverses, and we start to the left of the last (rightmost) dirty range, etc. + + +: During each pass, we extend the dirty ranges, in the direction of the scan, to include the newly modified pixels. Note that, while scanning + +: a sequence of pixels next to one of the dirty ranges, we may reach the edge of the next range. In such case, we keep scanning the pixels of + +: the second range, but we don't extend the previous range any further, so that the two ranges meet, but don't overlap. + + +
                    - -+---+---+---+---+---+---+---+---+---+---+---+- -
    +                   |   |   |   | 1 | 2 |(3)|   |   | 4 | 5 | 6 |
    +                - -+---+---+---+---+---+---+---+---+---+---+---+- -
    +      Original         |-------|               |---|   |---|
    +      Extended         |---------------|       |-------|-------|
    +                The dirty ranges are extended, in the
    +                direction of the scan, to include the
    +                newly modified pixels. The scan can
    +                "leak" into existing ranges (notice the
    +                third range in the illustration), in which
    +                case the previous range is only extended
    +                as far as the leaked-into range.
    +
    +: Note that the rightmost and leftmost ranges may be extended past the bounds of the segment, during the left-to-right and right-to-left + +: passes, respectively (recall that a segment doesn't necessarily span an entire row.) + + +: Also note that, if a dirty range is extended, or if its existing pixels are modified, during the first, left-to-right, pass, then it's possible + +: that its water level will not be uniform come the second, right-to-left, pass; this seems to break our assumption about the state of the + +: dirty ranges, which allowed us to take the shortcut described above. + +: This shortcut is still valid on the second pass, though. It turns out that we only need the ranges to meet a weaker condition -- it's enough + +: for the water level of the pixels of each dirty range to be monotonically decreasing in the direction of the scan (right-to-left, + +: in our case). This condition is still met at the end of the first pass. + + +: One final detail: each dirty range has an associated ''modified'' flag, which is initially cleared. If, during the above process, the range is + +: extended, or its existing pixels are modified, then its ''modified'' flag is set. This flag is used by the next step. + + +'''3. Distribution:''' The changes to the current segment's water level may affect the two neighboring rows. For each dirty range, we push two new + +: segments into the queue -- one for each neighboring row -- using the current row as their source segment. + + +: There's one exception to this, however: if a dirty range hasn't been modified during the horizontal propagation step, i.e., if its + +: ''modified'' flag is clear, then it necessarily doesn't affect the neighboring pixels of the source segment. Hence, in this case, we can + +: avoid pushing a corresponding segment for the row of the source segment. + + + + +
                     +---+---+---+---+   .   .   .   +---+---+   .   .
    +        Source   |   |   |   |   |               |   |   |
    +                 +---+---+---+---+---+---+---+---+---+---+   .   .
    +        Current          |   |   |   |   |   |   |   |   |
    +                 +---+---+---+---+---+---+---+---+---+---+   .   .
    +                 |   |   |   |   |       |   |   |   |   |
    +                 +---+---+---+---+   .   +---+   +---+---+   .   .
    +                 |---------------|       |---|   |-------|
    +                     Modified                    Modified
    +                 New segments, corresponding to the dirty
    +                 ranges, are pushed into the queue for each
    +                 of the current segment's neighboring rows.
    +                 No segments are pushed for the row of the
    +                 source segment for non-modified dirty
    +                 ranges.
    +
    +: To amortize the cost of maintaining and processing multiple separate segments, dirty ranges that are separated by a small-enough gap are + +: coalesced into a single range prior to this step; the gap between the ranges, if exists, becomes part of the coalesced range; the ''modified'' + +: flag of the coalesced range is the logical-OR of the ''modified'' flags of the individual ranges. + + + +==Start and Termination== + +Recall that segments are pushed into the queue as a result of a change in the water level of a neighboring segment. To kick this process off, we +pretend that the water level outside the image instantaneously dropped from 1 to 0, and push four segments, referred to as the "seed segments", +corresponding to the four edges of the image (there may, in fact, be less than four seed segments, if the image is 1- or 2-pixel wide or high.) +The source segment of the seed segments, hypothetically, lies outside the image; in particular, the water level of the neighboring pixels in the vertical +propagation step is taken to be 0 for the seed segments. + +
                       +-----------------------------------+
    +                   |                                   |
    +                   +---+---------------------------+---+
    +                   |   |                           |   |
    +                   |   |                           |   |
    +                   |   |                           |   |
    +                   |   |                           |   |
    +                   |   |                           |   |
    +                   |   |                           |   |
    +                   |   |                           |   |
    +                   +---+---------------------------+---+
    +                   |                                   |
    +                   +-----------------------------------+
    +
    + +Figure: The four seed segments -- one for each edge of the image. + +The process terminates when there are no more segments left in the queue. +At this point, the automaton has converged, and the water level corresponds to the output of the flood operation. + + +==Coordinate Systems== + +As mentioned above, segments can be either horizontal or vertical, but are treated internally as horizontal. Additionally, the region-of-interest +(ROI) of the operation might not span the entire image; in this case, the operation is performed on the ROI in isolation, and what we've been calling +the "image" up until now is in fact the ROI (in particular, the ground level outside the ROI is considered to be 0, even if the input image isn't +completely black outside the ROI.) + +To deal with this, we employ three coordinate systems: + + +* '''Image-physical:''' This is the "real" coordinate system of the operation, used when talking to the outside world (i.e., GEGL). Its origin is at +: the top-left corner of the image, its x-axis points right, and its y-axis points down. + + + +* '''Image-virtual:''' This is the same as the image-physical coordinate system, except that the x- and y-coordinates are swapped when dealing +: with vertical segments. In other words, when processing a vertical segment, we pretend that image is transposed (i.e., reflected along the + +: south-east diagonal). We transform to/from this coordinate system on the boundary between GEGL and the rest of the algorithm. + + + +* '''ROI-virtual:''' This is the same as the image-virtual coordinate system, except that its origin is translated to the top-left corner of the ROI. +: Internal coordinates, that aren't communicated to GEGL, are given in this coordinate system. + + +
         x                        y
    +   +----> - - - - - - -+    +----> - - - - - - -+    +- - - - - - - - - -+
    + y |                   |  x |                   |    |     y             |
    +   |   +- - - - -+          |   +- - - - -+              +----> - -+
    +   v   |         |     |    v   |         |     |    | x |         |     |
    +           ROI                      ROI                  |   ROI
    +   |   |         |     |    |   |         |     |    |   v         |     |
    +       +- - - - -+              +- - - - -+              +- - - - -+
    +   |                   |    |                   |    |                   |
    +   +- - - - - - - - - -+    +- - - - - - - - - -+    +- - - - - - - - - -+
    +            (a)                      (b)                      (c)
    +                 The three coordinate systems: (a) image-
    +                 physical, (b) image-virtual (here shown
    +                 transposed), and (c) ROI-virtual.
    +
    + +To sum it up, internal coordinates (e.g., the y-coordinate of the current segment, or the x-coordinates of the dirty ranges) are given in the ROI- +virtual coordinate system. Coordinates of ''GeglRectangle''s (such as the ROI rectangle, or the rectangles used when reading and writing to the GEGL +buffers) are given in the image-virtual coordinate system, but are transformed to/from the image-physical coordinate system before being +passed-to/received-from GEGL. + + + +[[Algorithms| Return to Index]] + + +Equations were rendered by [http://www.codecogs.com/latex/eqneditor.php Codecogs Online LaTex Equation Editor]. + + \ No newline at end of file diff --git a/wiki/Flood_algorithm-20210118151058-edit.txt b/wiki/Flood_algorithm-20210118151058-edit.txt new file mode 100644 index 0000000..ce1c845 --- /dev/null +++ b/wiki/Flood_algorithm-20210118151058-edit.txt @@ -0,0 +1,306 @@ +[[Category:Algorithms]] + +Author: Ell + +Year: 2016 + +=Abstract= +The flood operation eliminates "holes" -- darker areas surrounded by lighter areas -- in single-component (grayscale) images. +It is particularly useful for eliminating such holes from selections; see GIMP bug [https://bugzilla.gnome.org/show_bug.cgi?id=761060 #761060] +for more details. + +The conceptual model considers the input image as the height-map of a hilly +terrain. After heavy rain completely floods the terrain, the remaining +water form lakes in its depressions. + + _______ + /.\ /\_____________ + ____________/...\ /..\ Water /..\ + /....\ /.....\/....\__ /....\____ + /......\____/....Ground.....\___/......\ /\ + __/........................................\/..\_ + +Figure: A depiction of a one-dimensional flood. +Valleys correspond to "holes" in the input image, filled with "water" according to their surrounding. + +The result of the flood operation is the height-map of the terrain after the +flood, taking both ground- and water-level into account. + +More formally, the flood operation assigns to each pixel the minimum of the +maximal input-image values along all paths from the pixel to the "outside". +That is, the output value ''o(x)'' at pixel 'x' is given by + + +[[File:Flood Algorithm - Formula 1.gif|center]] + + +where ''P(x)'' is the set of all paths from ''x'' to the outside, and ''i(y)'' is +the value of the input image at pixel ''y''. + +=Algorithm= + +In accord with the conceptual flood model, we refer to the values of the +input image as the "ground level", and to the values of the output image as +the "water level"; these values range from 0 to 1, and are considered to +be 0 outside the bounds of the image. Note not to confuse "water level" +with "water depth"; we use the term "water level" simply to refer to the +elevation of either the ground or the water at a certain point. + +Our starting point is modeling the problem as a cellular automaton. The +state of each cell (pixel) is its current water level, which is initially 1 +everywhere inside the image. The water level at each cell is updated +according to the rule + + +[[File:Flood Algorithm - Formula 2.gif|center]] + + +where ''wn(x)'' is the water level at pixel ''x'' on generation ''n'', ''g(x)'' is +the ground level at ''x'', and ''N(x)'' is the set of (orthogonal) neighbors of +''x'', including itself. In other words, the new water level at each pixel is +the maximum of its ground level, and the minimum of its own water level, and +that of its neighbors. This automaton converges to the output of the operation. + +The automaton converges after, at most, ''n'' generations, where ''n'' is the +number of pixels in the image. Therefore, a naive implementation, where +at most ''O(n)'' cells are processed on each generation, has a worst-case +time complexity of ''O(n2)''. By making a few observations, we can do +better, at least in the most common cases. + +First, note that the final state doesn't depend on the order of the +individual steps. That is, we don't actually have to update the water level +an entire generation at a time, but rather we can apply the transformation +rule to any pixel, at any time, arbitrarily, until convergence. +Furthermore, we don't even have to consider all the neighbors of a pixel +each time we apply the rule: as long as we make sure to never increase the +water level of a pixel, i.e., as long as we consider the pixel's own water +level as part of the minimum term, we can take a different subset of the +neighbors into account each time. + +Second, using the above observation, note that we can solve a one- +dimensional automaton (i.e., compute its final state) in linear time, using +two passes: On the first pass, we iterate over the pixels left-to-right, +applying the transformation rule while considering only the left neighbor of +each pixel (using the water level assigned to the neighbor on the previous +iteration; recall that the water level of the left neighbor of the leftmost +pixel of the image is considered to be 0.) On the second pass, we work in +reverse -- we iterate over the pixels right-to-left, applying the rule while +considering only the right neighbors. + + _________________________________________________ + /.\ /\ __ + ____ /...\ /..\ /..\ + (a) /....\ /.....\/....\__ /....\ + /......\____/...............\___/......\ /\ + __/........................................\/..\_ + ______________________________ + /.\ /\ __ + ____________/...\ /..\ /..\ + (b) /....\ /.....\/....\__ /....\ + /......\____/...............\___/......\ /\ + __/........................................\/..\_ + _______ + /.\ /\_____________ + ____________/...\ /..\ /..\ + (c) /....\ /.....\/....\__ /....\____ + /......\____/...............\___/......\ /\ + __/........................................\/..\_ + +Figure: Water level of a one-dimensional automaton. (a) initially; (b) after the first pass; (c) after the second pass. + +While this technique doesn't extend directly to two dimensions, we can +leverage it by processing one-dimensional strips of pixels in batch, as +described above, instead of transforming pixels individually. + +Finally, another obvious way to speed things up is to minimize the amount of +unnecessary work we're doing. In particular, we only need to process pixels +whose neighbors' state changed. + +Taking all of the above into consideration, this is what we do: + +We maintain a queue of "segments" -- one-dimensional, contiguous, strips of +pixels -- whose water level needs to be updated, as a result of a change in +the water level of the pixels of a neighboring segment, referred to as the +"source segment". Although, for efficiency reasons, we allow segments to be +either horizontal or vertical, for simplicity, we treat all segments as +though they're horizontal, and perform the necessary coordinate-system +transformation when dealing with vertical segments, as explained later. + +Each segment is processed using the following steps: + +'''1. Vertical propagation:''' The segment's pixels are updated, using the above transformation rule, considering only the corresponding +: neighboring pixels of the source segment. During the process, we inspect which of the segment's pixels actually changed, and create a +: list of "dirty ranges" of modified pixels. We construct the ranges such that all pixels of each range have the same water level; this +: becomes important in the next step. + + - - -+-----+-----+-----+-----+-----+-----+-----+- - - + Source | | | | | | | | + Segment | | | | | | | | | | | | | | | + - - -+--|--+--|--+--|--+--|--+--|--+--|--+--|--+- - - + Current | V | V | V | V | V | V | V | + Segment | | x | x | | y | z | | + - - -+-----+-----+-----+-----+-----+-----+-----+- - - + Dirty ranges |-----------| |-----|-----| + The current segment's pixels are updated + according to the neighboring pixels of the + source segment, and contiguous runs of + modified, equivalent pixels form a list of + dirty ranges. + +'''2. Horizontal propagation:''' The segment's pixels are updated, considering only their left and right neighbors, using the two-pass process +: described above. Though semantically equivalent, this process slightly more intricate than the one described above, since we use the +: dirty ranges from the previous step to take a few shortcuts. + +: Recall that all pixels of a single dirty range are equal, and therefore, unless modified as part of the current pass, don't affect +: each other's state. On the other hand, all pixels outside any dirty range didn't change, and therefore, unless modified as part of the +: current pass, don't affect each other's state either. As a result, initially, only the pixels that directly neighbor a dirty range, in the +: direction of the pass, need to be updated. If the water level of such pixel changes, we need to update the following pixel, and so on. Once +: the water level of a pixel remains the same, we don't have to update the next pixel, but can rather jump directly to the pixel at the edge +: of the next dirty range, and so on. + +: For example, when scanning left-to-right, we start at the pixel directly to the right of the first (leftmost) dirty range. We apply +: the transformation rule to this pixel, and to the pixels to its right, until the water level of one of them is unaffected. At this point, we +: jump directly to the pixel to the right of the next dirty range. + + - -+---+---+---+---+---+---+---+---+---+---+---+- - + | | | | 1 | 2 |(3)| | | 4 |(5)| | + - -+---+---+---+---+---+---+---+---+---+---+---+- - + |-------| |---| + Pixel traversal order on a left-to-right + pass. Traversal starts to the right of + the first dirty range, at pixel ''1''. + Pixel ''(3)'' is unaffected, and so we jump + directly to the right of the second dirty + range. + +: Of course, when scanning right-to-left, it all reverses, and we start to the left of the last (rightmost) dirty range, etc. + +: During each pass, we extend the dirty ranges, in the direction of the scan, to include the newly modified pixels. Note that, while scanning +: a sequence of pixels next to one of the dirty ranges, we may reach the edge of the next range. In such case, we keep scanning the pixels of +: the second range, but we don't extend the previous range any further, so that the two ranges meet, but don't overlap. + + - -+---+---+---+---+---+---+---+---+---+---+---+- - + | | | | 1 | 2 |(3)| | | 4 | 5 | 6 | + - -+---+---+---+---+---+---+---+---+---+---+---+- - + Original |-------| |---| |---| + Extended |---------------| |-------|-------| + The dirty ranges are extended, in the + direction of the scan, to include the + newly modified pixels. The scan can + "leak" into existing ranges (notice the + third range in the illustration), in which + case the previous range is only extended + as far as the leaked-into range. + +: Note that the rightmost and leftmost ranges may be extended past the bounds of the segment, during the left-to-right and right-to-left +: passes, respectively (recall that a segment doesn't necessarily span an entire row.) + +: Also note that, if a dirty range is extended, or if its existing pixels are modified, during the first, left-to-right, pass, then it's possible +: that its water level will not be uniform come the second, right-to-left, pass; this seems to break our assumption about the state of the +: dirty ranges, which allowed us to take the shortcut described above. +: This shortcut is still valid on the second pass, though. It turns out that we only need the ranges to meet a weaker condition -- it's enough +: for the water level of the pixels of each dirty range to be monotonically decreasing in the direction of the scan (right-to-left, +: in our case). This condition is still met at the end of the first pass. + +: One final detail: each dirty range has an associated ''modified'' flag, which is initially cleared. If, during the above process, the range is +: extended, or its existing pixels are modified, then its ''modified'' flag is set. This flag is used by the next step. + +'''3. Distribution:''' The changes to the current segment's water level may affect the two neighboring rows. For each dirty range, we push two new +: segments into the queue -- one for each neighboring row -- using the current row as their source segment. + +: There's one exception to this, however: if a dirty range hasn't been modified during the horizontal propagation step, i.e., if its +: ''modified'' flag is clear, then it necessarily doesn't affect the neighboring pixels of the source segment. Hence, in this case, we can +: avoid pushing a corresponding segment for the row of the source segment. + + + +---+---+---+---+ . . . +---+---+ . . + Source | | | | | | | | + +---+---+---+---+---+---+---+---+---+---+ . . + Current | | | | | | | | | + +---+---+---+---+---+---+---+---+---+---+ . . + | | | | | | | | | | + +---+---+---+---+ . +---+ +---+---+ . . + |---------------| |---| |-------| + Modified Modified + New segments, corresponding to the dirty + ranges, are pushed into the queue for each + of the current segment's neighboring rows. + No segments are pushed for the row of the + source segment for non-modified dirty + ranges. + +: To amortize the cost of maintaining and processing multiple separate segments, dirty ranges that are separated by a small-enough gap are +: coalesced into a single range prior to this step; the gap between the ranges, if exists, becomes part of the coalesced range; the ''modified'' +: flag of the coalesced range is the logical-OR of the ''modified'' flags of the individual ranges. + +==Start and Termination== + +Recall that segments are pushed into the queue as a result of a change in the water level of a neighboring segment. To kick this process off, we +pretend that the water level outside the image instantaneously dropped from 1 to 0, and push four segments, referred to as the "seed segments", +corresponding to the four edges of the image (there may, in fact, be less than four seed segments, if the image is 1- or 2-pixel wide or high.) +The source segment of the seed segments, hypothetically, lies outside the image; in particular, the water level of the neighboring pixels in the vertical +propagation step is taken to be 0 for the seed segments. + + +-----------------------------------+ + | | + +---+---------------------------+---+ + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + +---+---------------------------+---+ + | | + +-----------------------------------+ + +Figure: The four seed segments -- one for each edge of the image. + +The process terminates when there are no more segments left in the queue. +At this point, the automaton has converged, and the water level corresponds to the output of the flood operation. + +==Coordinate Systems== + +As mentioned above, segments can be either horizontal or vertical, but are treated internally as horizontal. Additionally, the region-of-interest +(ROI) of the operation might not span the entire image; in this case, the operation is performed on the ROI in isolation, and what we've been calling +the "image" up until now is in fact the ROI (in particular, the ground level outside the ROI is considered to be 0, even if the input image isn't +completely black outside the ROI.) + +To deal with this, we employ three coordinate systems: + +* '''Image-physical:''' This is the "real" coordinate system of the operation, used when talking to the outside world (i.e., GEGL). Its origin is at +: the top-left corner of the image, its x-axis points right, and its y-axis points down. + +* '''Image-virtual:''' This is the same as the image-physical coordinate system, except that the x- and y-coordinates are swapped when dealing +: with vertical segments. In other words, when processing a vertical segment, we pretend that image is transposed (i.e., reflected along the +: south-east diagonal). We transform to/from this coordinate system on the boundary between GEGL and the rest of the algorithm. + +* '''ROI-virtual:''' This is the same as the image-virtual coordinate system, except that its origin is translated to the top-left corner of the ROI. +: Internal coordinates, that aren't communicated to GEGL, are given in this coordinate system. + + x y + +----> - - - - - - -+ +----> - - - - - - -+ +- - - - - - - - - -+ + y | | x | | | y | + | +- - - - -+ | +- - - - -+ +----> - -+ + v | | | v | | | | x | | | + ROI ROI | ROI + | | | | | | | | | v | | + +- - - - -+ +- - - - -+ +- - - - -+ + | | | | | | + +- - - - - - - - - -+ +- - - - - - - - - -+ +- - - - - - - - - -+ + (a) (b) (c) + The three coordinate systems: (a) image- + physical, (b) image-virtual (here shown + transposed), and (c) ROI-virtual. + +To sum it up, internal coordinates (e.g., the y-coordinate of the current segment, or the x-coordinates of the dirty ranges) are given in the ROI- +virtual coordinate system. Coordinates of ''GeglRectangle''s (such as the ROI rectangle, or the rectangles used when reading and writing to the GEGL +buffers) are given in the image-virtual coordinate system, but are transformed to/from the image-physical coordinate system before being +passed-to/received-from GEGL. + + +[[Algorithms | Return to Index]] + + +Equations were rendered by [http://www.codecogs.com/latex/eqneditor.php Codecogs Online LaTex Equation Editor]. diff --git a/wiki/GIMP_Developer_Wiki:About-20141215232808-show.txt b/wiki/GIMP_Developer_Wiki:About-20141215232808-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20141215232808-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20150905122805-show.txt b/wiki/GIMP_Developer_Wiki:About-20150905122805-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20150905122805-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20151025020958-show.txt b/wiki/GIMP_Developer_Wiki:About-20151025020958-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20151025020958-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20151224135532-show.txt b/wiki/GIMP_Developer_Wiki:About-20151224135532-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20151224135532-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20160630081449-show.txt b/wiki/GIMP_Developer_Wiki:About-20160630081449-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20160630081449-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20161025044731-show.txt b/wiki/GIMP_Developer_Wiki:About-20161025044731-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20161025044731-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20161126033457-show.txt b/wiki/GIMP_Developer_Wiki:About-20161126033457-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20161126033457-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20170710173104-show.txt b/wiki/GIMP_Developer_Wiki:About-20170710173104-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20170710173104-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20180812150552-show.txt b/wiki/GIMP_Developer_Wiki:About-20180812150552-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20180812150552-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20190507091741-show.txt b/wiki/GIMP_Developer_Wiki:About-20190507091741-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20190507091741-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20210125182120-show.txt b/wiki/GIMP_Developer_Wiki:About-20210125182120-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20210125182120-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20210506011106-show.txt b/wiki/GIMP_Developer_Wiki:About-20210506011106-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20210506011106-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Developer_Wiki:About-20210518052644-edit.txt b/wiki/GIMP_Developer_Wiki:About-20210518052644-edit.txt new file mode 100644 index 0000000..3e7b6ed --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20210518052644-edit.txt @@ -0,0 +1 @@ +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. diff --git a/wiki/GIMP_Developer_Wiki:About-20210818153540-show.txt b/wiki/GIMP_Developer_Wiki:About-20210818153540-show.txt new file mode 100644 index 0000000..0d15304 --- /dev/null +++ b/wiki/GIMP_Developer_Wiki:About-20210818153540-show.txt @@ -0,0 +1,5 @@ + + +This is a Wiki by developers for developers. If you are a developer and want to use it, pop up in IRC and ask Alexia_Death or LightningIsMyName. + + \ No newline at end of file diff --git a/wiki/GIMP_Roadmap-20151020114621-edit.txt b/wiki/GIMP_Roadmap-20151020114621-edit.txt new file mode 100644 index 0000000..3001115 --- /dev/null +++ b/wiki/GIMP_Roadmap-20151020114621-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Roadmap]] diff --git a/wiki/GIMP_Roadmap-20161009222107-show.txt b/wiki/GIMP_Roadmap-20161009222107-show.txt new file mode 100644 index 0000000..ada8eb1 --- /dev/null +++ b/wiki/GIMP_Roadmap-20161009222107-show.txt @@ -0,0 +1,138 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Mostly complete, released in 2.9.2 +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://bugzilla.gnome.org/show_bug.cgi?id=768772 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4 (layer/image preview, color picking, view-level settings) +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499], [https://bugzilla.gnome.org/show_bug.cgi?id=769112 Bug 769112] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| icon size minimal support | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=745835 Work in progress]. Still looking for the right implementation. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://bugzilla.gnome.org/show_bug.cgi?id=148930 [1]] +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | No | babl and GEGL need to be patched accordingly first +|- +| Support for gamma encodings other than the sRGB TRC | No | babl and GEGL need to be patched accordingly first +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Glossary-20161024174322-edit.txt b/wiki/Glossary-20161024174322-edit.txt new file mode 100644 index 0000000..39879db --- /dev/null +++ b/wiki/Glossary-20161024174322-edit.txt @@ -0,0 +1,638 @@ +This glossary contains definitions important for the GIMP development. These include functional definitions i.e. from computer graphics and color theory, photography, terms from babl and GEGL etc. + + +[https://bugzilla.gnome.org/enter_bug.cgi?product=gimp-web&component=wiki.gimp.org Report a bug] + + + +==Table of Contents== + +{{link|Legend}} + +{{link|A}} {{link|B}} {{link|C}} {{link|D}} {{link|E}} {{link|F}} {{link|G}} {{link|H}} {{link|I}} {{link|J}} {{link|K}} {{link|L}} {{link|M}} {{link|N}} {{link|O}} {{link|P}} {{link|Q}} {{link|R}} {{link|S}} {{link|T}} {{link|U}} {{link|V}} {{link|W}} {{link|X}} {{link|Y}} {{link|Z}} + +{{link|References}} + +{{link|Trademarks}} +__NOTOC__ + +==Legend== + +{| +|[babl] || specific to {{link|babl}} +|- +|[COL] || colorimetry +|- +|[coll.] || colloquial +|- +|[GEGL] || specific to {{link|GEGL}} +|- +|[GIMP] || specific to {{link|GIMP}} +|- +|[photo] || photography +|} + + +==A== +*{{term | a (lowercase)}} - {{link|babl | [babl]}} denotes a color channel to be premultiplied with {{link|alpha}}, for instance RaGaBa is premultiplied {{link|alpha}} {{link|RGB}} + +*{{term | a* (lowercase)}} - The axis in the {{link|CIELAB}} {{link|color model}} which denotes the green-magenta component of the color. A negative value on this axis denotes green and a positive value denotes magenta. + +*{{term | A (uppercase)}} - +*:*The {{link|alpha}} channel in a {{link|color model}}, for instance in {{link|RGBA}}. +*:*{{link|babl | [babl]}} the {{link|alpha}} value in a {{link|color model}}. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to {{link|RGB}} . The same applies to {{link|R'aG'aB'aA}}, {{link|YaA}}, {{link|Y'aA}}. + +*{{term | abyss}} - {{link|GEGL|[GEGL]}} data from outside the input buffer. + +*{{term | abyss policy}} - {{link|GEGL|[GEGL]}} the behaviour rule to handle {{link|abyss}} data: to clamp to the border, loop in the buffer extent, or implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to GEGL_ABYSS_LOOP adds the tileability to the operation for free. + +*{{term | alpha}} - opacity. An alpha value of 0 means 'transparent', an alpha value of 100 means 'fully opaque', values in between mean 'partly opaque'. + +*{{term | API}} - Application Programmers Interface. The technical interface of a library to external developers who are intended use it. It defines the provided services, their semantic and syntax. On implementation level these are the public data types, enumerators and functions with their signatures.
    See also: [http://gegl.org/api.html GEGL API] , [http://gegl.org/#_operation_api GEGL operation API], [http://developer.gimp.org/api/2.0/index.html GIMP API]. + +*{{term | ArgyllCMS}} - an open source color management system for profiling input devices (scanner, camera, etc) and calibrating and profiling output devices (printer, monitor, etc), plus a suite of command line utilities for exploring, linking, and converting between ICC profiles.
    See also the [http://argyllcms.com/ ArgyllCMS website]. + +*{{term | Autohell}} - [coll.] synonym for {{link|Autotools}}, because they are practically hard to figure out. + +*{{term | Autotools}} - the GNU build system. They check the current configuration to ensure all dependencies are in place, generate the Makefiles and execute them to do several tasks like compiling, installing and testing a program.
    See also the [http://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html#Autotools-Introduction GNU Autotools website]. + +{{right | {{link|Table of Contents}}}} + +==B== +*{{term | b* (lowercase)}} - the axis in the {{link|CIELAB}} {{link|color model}} which denotes the blue-yellow component of the color. A negative value on this axis denotes blue and a positive value denotes yellow. + +*{{term | B (uppercase)}} - +*:*Blue color channel in the {{link|RGB}} {{link|color model}}. +*:*{{link|brightness}} component of the HSB {{link|color model}}. +*:*[photo] symbol for {{link|brightness}}: obsolete, but may be found on older light meters. {{fn_ref|2}} +*:*[photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. {{fn_ref|2}} + +*{{term | babl}} - a dynamic, any to any, pixel format translation library.
    See also: [http://www.gegl.org/babl babl website] + +*{{term | backend}} - generally the internal part of a library that implements its public {{link|API}}. In {{link|GEGL}} this could for instance be computing an {{link|operation}}, storing {{link|tile|tiles}} and memory management. + +*{{term | black point}} - the light-source's (e.g. a monitor) or sensor's interpretation of black. + +*{{term | Bradford transform}} - a matrix used to convert {{link|XYZ|XYZ}} colors to the {{link|LMS|LMS}} color space when {{link|chromatic adaptation|chromatically adapting}} a color in order to maintain constant color appearance under different light sources. The Bradford transform is recommended by the {{link|ICC|ICC}} and used by {{link|ArgyllCMS|ArgyllCMS}} and {{link|LCMS|LCMS}} when making ICC D50-adapted RGB profiles from color spaces such as the sRGB D65 color space. + +*{{term | brightness}} - attribute of a visual perception according to which an area or color appears to emit, or reflect, more or less light. This correlates directly with the amplitude of the lightwave. {{fn_ref|1}} {{fn_ref|4}} + +*{{term | bug}} - an error in a program, e.g. an existing feature doesn't work as specified or usually expected. Requests for new features are not bugs, but {{ link | enhancement request | enhancement requests}}. + +*{{term | bugtracker}} - a software system for gathering, managing and keeping track of {{link | bug | bugs }} and {{ link | enhancement request | enhancement requests}}. We use {{link | Bugzilla}} for bugtracking. + +*{{term | Bugzilla}} - the GIMP project uses [https://bugzilla.gnome.org/ Bugzilla] of the GNOME project, a {{link | bugtracker}} that allows us to coordinate bug reports. Bugzilla is also used for enhancement requests and the preferred way to submit patches for GIMP is to open a bug report and attach the patch to it.
    See also: [http://www.bugzilla.org/ Bugzilla website], [http://www.gimp.org/bugs/ Reporting bugs in GIMP]. + +*{{term | build}} - +*:* (verb) - the process of {{link|compiler|compiling}} and {{link|linker|linking}} a software from its sourcecode. +*:* (noun) - the result of the build process, i.e. a binary or archive, distributable file. + +*{{term | Bz }} - abbreviation for {{link | Bugzilla}}. + +{{right | {{link|Table of Contents}}}} + +==C== +*{{term | C (uppercase)}} - +*:*Cyan color component of the {{link|CMY}} and {{link|CMYK}} {{link|color model|color models}}. +*:*{{link|chroma}} component of the LCH {{link|color model}}. +*:*the programming language most of {{link|GIMP}}, {{link|GEGL}} and {{link|babl}} is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of {{link|GObject}}. + +*{{term | Cb}} - the Blue component of {{link|YCbCr}} {{link|chroma}}. + +*{{term | chroma}} - Colorfulness of an area judged as a proportion of the {{link|brightness}} of a similarly illuminated area that appears white or highly transmitting. {{fn_ref|1}} {{fn_ref|4}}
    See also {{link|saturation}}. + +*{{term | chromatic adaptation}} - +*:* (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the {{link|color temperature|color temperature}} of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +*:* (mathematically) - the process of using a {{link|chromatic adaptation model|chromatic adaptation model}} to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, {{link|Bradford transform|Bradford}}, and Sharp. + +*{{term | chromatic adaptation model}} - a mathematical transform from the {{link|XYZ|XYZ}} color space to the {{link|LMS|LMS}} color space. A chromatic adaptation model is used to calculate the equivalent {{link|XYZ|XYZ}} colors required to maintain constant color appearance under different light sources. + +*{{term | chromaticity}} - The color properties of a sample judged independently of {{link|luminance}}, i.e. in terms of hue and {{link|saturation}} only. {{fn_ref|1}} + +*{{term | CI}} - abbreviation for {{link|Continuous Integration}}. + +*{{term | CIE}} - Commission Internationale de l'Eclairage (International Commission on Illumination). Independent, non-profit organization for recommendations on photometry and colorimetry. Its aim is to exchange information on all matters relating to the science and art of light and lighting, color and vision, photobiology and image technology worldwide. It is recognized by {{link|ISO}} as an international standardization body. The CIE has defined several {{link|color spaces}} that describe the range of visible colors in unambiguous numerical terms. {{fn_ref|1}} {{fn_ref|4}} + +*{{term | CIE 1976 L*a*b*}} - synonym of {{link|CIELAB}} + +*{{term | CIE Lab}} - {{link|babl|[babl]}} implementation of {{link|CIELAB}}. + +*{{term | CIE Lab alpha}} - {{link|babl|[babl]}} implementation of {{link|CIELAB}} with an alpha channel {{link|A (uppercase)|(A)}}. + +*{{term | CIEL*a*b*}} - synonym of {{link|CIELAB}} + +*{{term | CIELAB}} - a device independent {{link|color model}} defined by {{link|CIE}} in 1976. It describes colors as points on the three axes {{link|L (uppercase) | L}}, {{link|a (lowercase) | a}}, {{link|b (lowercase) | b}}. It is also said to be the reference {{link|color model}} in Adobe Photoshop (but not GIMP), e.g. internal computations from one {{link|color space}} to another are done there via CIELAB.
    See also [http://eilv.cie.co.at/term/157 CIELAB's formal definition] by the CIE. + +*{{term | Clang}} - the {{link|C | C}} {{link|compiler}} of the {{link|LLVM}} project. Clang is able to cross-compile code, i.e. build GIMP for Windows on a Linux machine {{fn_ref|7}}. + +*{{term | CLI}} - command line interface. A form of {{link|UI}} where the user interacts with the program by entering textual commands. This can e.g. be the set of commandline arguments that are passed to the the program on startup, or a commandline in the {{link|GUI}} to enter textual commands. You can get the set of GIMP's commandline arguments by entering '''gimp --help''' at the systems shell. + +*{{term | Clipboard Manager}} - The Clipboard Manager specification describes how applications can actively store the contents of the clipboard when the application is quit. This requires that a compliant clipboard manager is running. Standard specific to the X window system.
    See also [http://www.freedesktop.org/wiki/ClipboardManager Clipboard Manager specification]. + +*{{term | Clipboards}} - Explanation of the consensus of the Qt and {{link|GTK+}} developers on how the X clipboard works. Standard specific to the X window system.
    See also [http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt informal Clipboards specification]. + +*{{term | CMY}} - {{link|color model}} with the three primary colors Cyan, Magent and Yellow. The three "subtractive" primary colors used as the basis of all dye or pigment-based printing systems and color photography. A full range of colors including neutral grays and blacks can be produced with good cyan, yellow and magenta colorants (e.g. color film dyes) but typical printing inks are less than perfect. {{fn_ref|1}} + +*{{term | CMYK}} - +*:*{{link|color model}} with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to {{link|CMY}} to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with {{link|CMY}} alone. {{fn_ref|1}} +*:*{{link|babl|[babl]}} implementation of the CMYK color model. {{link|GEGL}} treats rendering CMYK as problem subset of rendering spot colors. +*:*pronouncation: C.M.Y.K., not schmuck nor smug + +*{{term | color management}} - an approach to ensure that colors look the same (or at least most similar) across various devices in a workflow. For instance it ensures that photos taken from a camera look the same at the editors screen and the printer output. If you have questions on color management, then Øyvind Kolås (IRC nick: pippin) or Elle Stone (IRC nick: elle) are the best persons to ask in the project. + +*{{term | color model}} - a mathematical model to describe colors and handle them formally, such as points in a coordinate system. This is the more theoretically abstract background of color computation. Practically this term is often used synonymously to {{link|color space}}.
    Examples are {{link|CIELAB}} , {{link|RGB}} and {{link|XYZ}} . + +*{{term | color space}} - a geometric representation of color in space, usually of 3 dimensions {{fn_ref|4}}. While {{link|color models}} are the theoretical background color spaces describe the set of visible or reproducable colors {{fn_ref|2}}. Practically this term is often used synonymously to {{link|color model}}. To get a visual notion of various color spaces and their relationships see [http://www.brucelindbloom.com/WorkingSpaceInfo.html#Viewer Bruce Lindblooms 3D Gamut Viewer] demo.
    Examples are AdobeRGB, {{link|sRGB}} and Wide Gamut RGB.
    To assign a numerical vector to a real color you need both a {{link|color model}} and a color space. As an example the numbers (0,1,0) are given. In {{link|XYZ}} {{link|color model}} with sRGB color space they represent a pure green. In {{link|XYZ}} {{link|color model}} with AdobeRGB color space you get a pure, but more saturated green. In HSB {{link|color model}}+sRGB color space these numbers represent a pure black. + +*{{term | color temperature}} - formally the temperature of an ideal black body radiator whose radiation has the same {{link|chromaticity}} as that of a given stimulus. {{fn_ref|4}} Practically it's a synonym for {{link|white point}} {{fn_ref|1}}. Not to be confused with the artistic classification into warm colors (i.e. yellow, orange) and cold colors (i.e. blue).
    Unit: K (Kelvin). + +*{{term | compiler}} - a program to translate code in a programming language into executable machine code, i.e. {{link|gcc}} or {{link|Clang}}. In GIMP there's no recommended default {{link|C}} compiler. Instead the platform default will be used automatically. + +*{{term | connection}} - {{link|GEGL | [GEGL]}} A link/pipe routing image flow between operations within the graph goes from an output pad to an input pad, in graph glossary this might also be referred to as an edge. {{fn_ref|14}} + +*{{term | Continuous Integration}} - a method to regularly fetch the source code from the {{link|Version Control System|version control system}}, build and test the software. Developers get almost immediate feedback whether their software builds and works well. By doing this on a regular basis bugs can be detected and fixed much earlier than if testing was the last step before the release or after release on the user's side. This increases the software quality. Modern continuous integration systems use a client-server architecture: a server does all the continuous integration jobs and users access it via a web browser (=the client). GIMP uses {{link|Jenkins}} as continuous integration server. + +*{{term | Cr}} - the Red component of {{link|YCbCr}} {{link|chroma}}. + +*{{term | CVS}} - a {{link|Version Control System|version control system}} the {{link|GNOME}} project had used a long time ago, before it was superseded with {{link|Subversion}}. Now we're using {{link|Git}}. + +{{right | {{link|Table of Contents}}}} + +==D== +*{{term | D-Bus }} - Desktop Message Bus. If available, GIMP uses it to detect if another GIMP instance is already running. In the future, GIMP might make even more use of D-Bus.
    See also [http://dbus.freedesktop.org/doc/dbus-specification.html D-Bus specification], [https://git.gnome.org/browse/gimp/tree/app/gui/dbus-service.xml GIMP's D-Bus service's interface descriptor], [http://raphael.slinckx.net/blog/documents/dbus-tutorial D-Bus tutorial]. + +*{{term | D50}} - a {{link|CIE}} standard {{link|illuminant}} with the spectral power distribution of daylight (which has a {{link|color temperature}} of 5003 Kelvin). It is chosen for the special needs of the paper printing industry and thus the preferred reference white for evaluating prints on paper. Compared to {{link|D65}} it's a bit more yellowish. + +*{{term | D65}} - a {{link|CIE}} standard {{link|illuminant}} with the spectral power distribution of noon mid-latitude daylight (which has a {{link|color temperature}} of 6504 Kelvin). It's the white balance standard used for sRGB {{link|color space}} and to calibrate display screens. Compared to {{link|D50}} it's a bit more bluish. + +*{{term | DAG}} - Directed Acyclic Graph. In computer science and mathematics a graph with directed edges and the attribute, that every node is reached never or only once on any path. For instance trees (as data structure) are DAGs. + +*{{term | deprecated}} - a term from software development. Code marked as '''deprecated''' is outdated or obsolete. It and the code using it need to be replaced by {{link|refactoring|refactored}} code soon. Deprecated code often occurs as result of {{link|API}} changes.
    Example: The code contains two functions '''do_this''' and '''do_that'''. Function '''do_that''' calls '''do_this'''. Function '''do_this''' is marked as deprecated. It soon needs to be replaced by a newer function '''do_this_better''' and '''do_that''' needs to call '''do_this_better''' instead. + +*{{term | Desktop Entry Specification}} - This document describes desktop entries: files describing information about an application such as the name, icon, and description. GIMP installs such a [https://git.gnome.org/browse/gimp/plain/desktop/gimp.desktop.in.in .desktop file].
    See also the [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html detailed Desktop Entry specification]. + +*{{term | DND}} - Drag and Drop. + +*{{term | DNG}} - Digital Negative. An image file format aiming to become a device-independent standard for storing raw data from digital cameras.
    See also [http://www.adobe.com/products/dng/pdfs/dng_spec.pdf DNG specification]. + +*{{term | DOAP}} - DOAP is an {{link|XML}} schema for describing software projects. The GNOME project uses it for instance to show a short project's description at the [https://git.gnome.org/browse/ project index].
    See also [https://github.com/edumbill/doap/ DOAP website], [https://git.gnome.org/browse/gimp/tree/gimp.doap GIMP's DOAP file]. + +*{{term | Docbook}} - DocBook is a general purpose {{link|XML}} schema particularly well suited to books and papers. In {{link|GIMP}} it is used for the [https://git.gnome.org/browse/gimp-help-2/tree/ user documentation] and [https://git.gnome.org/browse/gimp/tree/devel-docs/structure.xml structure of the technical documentation].
    See also the [http://www.docbook.org/specs/ Docbook specifications]. + +*{{term | dpi }} - dots per inch. Measure of resolution of a device as density or frequency of points or dots which can be addressed or referred to by the device.{{fn_ref|2}} It is often confused with {{link|lpi}} and {{link|ppi}}. DPI refers to the amount of ink dots in printing. Each of these dots has a certain {{link|primary}}, for instance a {{link|CMYK}} color. Pixels of secondary colors are created by plotting many of these dots side-by-side. Thus a high DPI count isn't the same as a high PPI count. Because of technological progress in ink printing this measure is of decreasing importance. + +*{{term | dynamic range}} - Measure of spread from the highest to lowest energy levels that can be captured by an imaging or recording or reproduced by a play-back device. E.g. a top-class scanning camera back can capture a range of 11 f/stops; a good film-scanner may be able to manage under 9 stops. The concept of energy levels is usually converted to densities in devices such as scanners e.g. dynamic range is '0.2 - 3.0D units'. {{fn_ref|2}} + +{{right | {{link|Table of Contents}}}} + +==E== +*{{term | enhancement request}} - the request for a new feature, that is not already in GIMP. An enhancement request should never be filed without prior discussion on the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list gimp-developer mailing list]. This is to make sure that the enhancement requests that are filed are well-specified and aligned with the overall goals the developers have for GIMP. + +*{{term | Extended Window Manager Hints}} - The Window Manager Specification is meant to unify the GNOME and KDE window manager hint conventions. Standard specific to the X window system.
    See also the [http://standards.freedesktop.org/wm-spec/wm-spec-latest.html Extended Window Manager Hints specification]. + +{{right | {{link|Table of Contents}}}} + +==F== +*{{term | File URI specification}} - Specifies how URIs for normal UNIX filenames (file: URIs) are interpreted and created. This functionality is provided by {{link|GLib}}.
    See also the [http://freedesktop.org/wiki/Specifications/file-uri-spec detailed File URI specification]. + +*{{term | FTX}} - File and Time Extensions for {{link|TinyScheme}}.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/ftx FTX in GIMP]. + +{{right | {{link|Table of Contents}}}} + +==G== +*{{term | G (uppercase)}} - Green color channel in the {{link|RGB}} {{link|color model}}. + +*{{term | gcc}} - a {{link|C}} {{link|compiler}}. Part of the free [http://gcc.gnu.org/ GNU Compiler Collection]. On Linux it usually ships with your distribution. On Windows it's part of [http://www.mingw.org/ MinGW]. On OS X XCode versions before 4.2 used gcc; then Apple moved to llvm-gcc and {{link|Clang}}. FreeBSD 10 deprecates gcc support in favor of {{link|Clang}}. {{fn_ref|5}} Gcc is able to cross-compile, i.e. build GIMP for Windows on a Linux machine. + +*{{term | GEGL}} - Generic Graphics Library, a graph based image processing framework. It is GIMP's foundation for nondestructive image editing in high bit depths. GEGL provides the infrastructure to do demand based, cached, nondestructive image editing on larger than RAM buffers. Through {{link|babl}} it provides support for a wide range of {{link|color models}} and pixel storage formats for input and output. GEGL support in current GIMP versions is experimental and will be official part of GIMP in version 2.10.
    See also: [http://www.gegl.org GEGL website], [[#Hacking:Porting_filters_to_GEGL | GEGL porting matrix]] + +*{{term | GEGL-chant}} - A way to hide some boilerplate code in {{link|GEGL}} and to reduce code duplications defining the parameters specifications of each operation. To achieve this it makes heavy use of {{link|C}} macro definitions and the C preprocessor. It allows defining a property on one line instead of the usual {{link|GObject}} way which needs 4 or 5 different locations in the class modified for each added property. The chanted properties can contain metadata, such as valid values, upper and lower bounds and their suitability for {{link|light, perceived|nonlinear}} compuation.
    See also the file [https://git.gnome.org/browse/gegl/tree/gegl/gegl-chant.h gegl-chant.h] and the GEGL operations using it. + +*{{term | GIF}} - Graphics Interchange Format. A bitmap image file format, especially for web graphics with low image depths and optionally transparency, i.e. logos or animations. In GIMP the GIF plug-in handles this format.
    See also: [http://www.w3.org/Graphics/GIF/spec-gif89a.txt GIF89a specification], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-load.c GIMP's GIF loader], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-save.c GIMP's GIF saver] + +*{{term | GIMP}} - GNU Image Manipulation Program, an advanced image editor.
    See also: [http://www.gimp.org GIMP website], [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision GIMP product vision]. + +*{{term | GIMP-Perl}} - A plug-in for GIMP allowing automation by the use of {{link|Perl}} scripts.
    See also [http://search.cpan.org/dist/Gimp/ Distribution and technical documentation], [https://git.gnome.org/browse/gimp-perl Git repository]. + +*{{term | GIO}} - part of {{link|GLib}} to input and output data. It abstracts from the actual filesystem to access files in a consistent, platform-independent way.
    See also [https://developer.gnome.org/gio/ GIO reference manual], [[#Hacking:Porting file loaders/exporters to GIO | GIO porting matrix]]. + +*{{term | GIR }} - abbreviation for {{link|GObject introspection}}. + +*{{term | Git}} - the {{link|Version Control System|version control system}} we use to manage the sources and documentation of {{link|babl}}, {{link|GEGL}} and {{link|GIMP}} since 16.04.2009. {{fn_ref|17}} It is a decentralized version control system, i.e. every user who has cloned a {{link|repository}} has a whole copy of it. This makes it easy to recover the repository if one server dies.{{fn_ref|16}} On the other hand you don't have to worry if you crashed your local repository - the chances to recover a working copy from the servers of the {{link|GNOME}} project or another GNOME developer are quite high. Many of us control Git by its [https://www.kernel.org/pub/software/scm/git/docs/git.html CLI commands] and [https://www.kernel.org/pub/software/scm/git/docs/gitk.html gitk], but there are also comfortable [http://git-scm.com/downloads/guis GUI clients] for it. If you have questions regarding Git usage, don't hesitate to ask - you wouldn't be the first one ;-)
    See also [http://git-scm.com/ Git website], [http://git-scm.com/documentation Git documentation], [[Hacking:Developer_FAQ#GIT|Git in the Developer FAQ]], [https://git.gnome.org/browse/ GNOME's Git repositories]. + +*{{term | GLib}} - the low level core library of GNOME.
    See also [https://developer.gnome.org/glib/ GLib reference manual]. + +*{{term | GNOME}} - +*:* a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment.{{fn_ref|11}} +*:* The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. {{fn_ref|11}} + +*{{term | GNOME HIG}} - the {{link|HIG | Human Interface Guidelines}} for the GNOME platform. We don't follow this spec to the word but we try to adopt as much of these guidelines as makes sense. Besides them we use our own [http://gui.gimp.org/index.php/Specifications specifications].
    See also [https://developer.gnome.org/hig-book/stable/ GNOME HIG website]. + +*{{term | GNU coding standards}} - A [http://www.gnu.org/prep/standards/ guide] to writing portable, robust and reliable programs. Also defines the [http://www.gnu.org/prep/standards/standards.html#Formatting GNU coding style]. + +*{{term | GObject}} - a library of {{link|GTK+}} to enable object-oriented programming in {{link|C}}.
    See also [https://developer.gnome.org/gobject/stable/ GObject reference manual]. + +*{{term | GObject introspection}} - the implementation of object {{link|introspection}} in {{link|GLib}}. {{link|GEGL}} uses it to expose its interface to other programming languages ({{link|Perl}}, {{link|Python}}, Javascript, Vala etc.) It is planned that GIMP will do the same.
    See the [https://wiki.gnome.org/Projects/GObjectIntrospection detailed description of GObject introspection]. + +*{{term | GP}} - abbreviation of {{link|GIMP-Perl}}. + +*{{term | GPU computing}} - a means to utilize the computing power of graphic-cards processors for general purposes. + +*{{term | gradation}} - relationship of reproduced {{link|lightness}} values to original {{link|lightness}} values in an imaging process. It is usually expressed as a 'tone curve', which is the Curves tool in GIMP. {{fn_ref|1}} + +*{{term | graph}} - in computer science and mathematics a composition of nodes and edges. In {{link|GEGL | [GEGL]}} the graph is a {{link|DAG}}.{{fn_ref|14}} This means, that every operation node is reached once at most, but never two or more times. + +*{{term | GSoC}} - Google Summer of Code. Annual mentoring program hosted by Google Inc. to offer and award students to work on open source projects during summer. GIMP has been participating for many years.
    See also: [https://developers.google.com/open-source/soc/ GSoC website], [[#Hacking:GSOC | GIMP's GSoC participation]] + +*{{term | GTK+}} - GIMP Toolkit, a multi-platform toolkit for creating graphical user interfaces.{{fn_ref|19}} It evolved out of {{link|GIMP}} and is now the foundation for the {{link|GNOME}} desktop among others.
    See also [http://www.gtk.org GTK+ website], [http://www.gtk.org/documentation.php GTK+ documentation]. + +*{{term | GUI}} - graphical user interface. A form of {{link|UI}} which uses graphical symbolic representations of objects (like icons, buttons, a canvas for drawing) which are manipulated with a pointing device or keyboard. + +{{right | {{link|Table of Contents}}}} + +==H== +*{{term | Hackordnung}} - The last section from the file [https://git.gnome.org/browse/gimp/plain/HACKING HACKING] as found in the GIMP source tree explains how the GIMP source code should be formatted. + +*{{term | HIG}} - Human Interface Guidelines. Set of visual and interaction guidelines to work with a particular platform. + +{{right | {{link|Table of Contents}}}} + +==I== +*{{term | ICC}} - International Color Consortium. An organisation of industry vendors for the purpose of creating, promoting and encouraging the standardization and evolution of an open, vendor-neutral, cross-platform color management system architecture and components. {{fn_ref|9}} + +*{{term | ICC Profiles in X specification}} - a specification for associating ICC color profiles with X screens. GIMP implements this proposed standard since version 2.4.
    See also [http://www.burtonini.com/computing/x-icc-profiles-spec-latest.html detailed ICC Profiles in X specification] + +*{{term | ICC specification}} - Specifies the profile format defined by the International Color Consortium (ICC). The intent of this format is to provide a cross-platform device profile format that can be used to translate color data between device colorspaces. The ICC specification is approved as international standard ISO 15076-1
    See also [http://www.color.org/icc_specs2.xalter detailed ICC specification]. + +*{{term | ICCCM}} - Inter-Client Communication Conventions Manual. This spec defines the interaction between X11 clients. In particular it talks about selections, cut buffers, window and session management, manipulation of shared resources and device color characterization.
    See also [http://tronche.com/gui/x/icccm/ ICCCM specification]. + +*{{term | IDE}} - Integrated Development Environment. An integrated set of development tools, such as code editor, compiler, linker, debugger, documenter, testing tools, version control and deployment aid. Examples are [http://www.anjuta.org Anjuta], [http://www.codeblocks.org/ Code::Blocks], [http://www.eclipse.org Eclipse], [https://www.gnu.org/software/emacs/ Emacs], [http://kdevelop.org/ KDevelop] and [http://www.netbeans.org Netbeans]. We GIMP developers don't make rules about the development environment. Some of us use Emacs, Eclipse or Netbeans while others prefer simple editors ([http://www.geany.org/ Geany], [https://wiki.gnome.org/Apps/Gedit GEdit], Vi) and command line tools instead of an IDE. + +*{{term | illuminance}} - measurement of the amount of light coming from a light source. Illuminance is measured in footcandles or Lux. {{fn_ref|1}} + +*{{term | illuminant}} - +*:* a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like {{link|D50}} and {{link|D65}}. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. {{fn_ref|1}} +*:* [coll.] any kind of light falling on a body or scene {{fn_ref|4}}. + +*{{term | ILV}} - International Lighting Vocabulary. A dictionary of the {{link|CIE}} with standard definitions regarding light. {{fn_ref|4}} + +*{{term | image pyramid}} - a set of images with the same content, but pre-rendered in different sizes. The aim is to increase the rendering speed while reducing aliasing artifacts and assuring continuity within and between several target images. {{fn_ref|15}} + +*{{term | input pad}} - {{link|GEGL | [GEGL]}} a {{link|pad}} that consumes image data. It might also be seen as an image parameter to the {{link|operation}}. {{fn_ref|14}} + +*{{term | introspection }} - a method in object oriented programming techniques to gather information about other classes at runtime. {{link|GEGL}} uses {{link|GObject introspection}} and there are plans for {{link|GIMP}} to do the same. + +*{{term | ISO}} - +*:*the International Organization for Standardization. An international association to develop and publish standards.{{fn_ref|12}} +*:*[photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. + +{{right | {{link|Table of Contents}}}} + +==J== +*{{term | Jenkins}} - GIMP's {{link | Continuous Integration}} server. The product Jenkins is open source and a widely used Continuous Integration server.
    See also: [https://gimptest.flamingtext.com:9090/ GIMP Jenkins website], [http://jenkins-ci.org/ Jenkins project website]. + +*{{term | JNG}} - {{link|JPEG}} network graphics format. A bitmap image file format. GIMP doesn't use this format yet but it would be nice to extend the MNG plug-in to use it and to add a dedicated JNG plug-in.
    See also [http://www.libpng.org/pub/mng/spec/jng.html specification]. + +*{{term | JPEG}} - +*:*Joint Photographic Experts Group. A lossy compression method standardised by the {{link|ISO}}. {{fn_ref|8}} +*:*An image file format and its filename extension, see {{link|JPEG JFIF}} + +*{{term | JPEG JFIF}} - an image file format (usually referred to as {{link|JPEG}}) for the transport of single JPEG-compressed images. It has three color channels (Red, Green, Blue) with a bit depth of 8 bit each. JPEG JFIF doesn't support transparency. It's most often used for photographs. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/file-jpeg JPEG plug-in] handles this format. + +*{{term | JPG}} - filename extension for {{link|JPEG JFIF}} images. + +{{right | {{link|Table of Contents}}}} + +==K== +*{{term | K (uppercase)}} - +*:*Kelvin. Unit of {{link|color temperature}} . +*:*Key-color component of the {{link|CMYK}} {{link|color model}} to represent various shades of {{link|brightness}} . Usually black. + +{{right | {{link|Table of Contents}}}} + +==L== +*{{term | L (uppercase)}} - The axis in the {{link|CIELAB}} {{link|color model}} which denotes the {{link|lightness}} component of the color. A low numerical value on this axis denotes a dark color and a high value a light color. + +*{{term | L*a*b*}} - synonym for {{link|CIELAB}} + +*{{term | Lab}} - synonym for {{link|CIELAB}} + +*{{term | LCMS}} - Little Color Management System. LCMS is an open-source color management engine with focus on small footprint, accuracy and performance. It uses the {{link|ICC specification}}.
    See also [http://www.littlecms.com/ the LCMS website]. + +*{{term | LGM}} - Libre Graphics Meeting. Annual conference of developers and users of graphics open source software. GIMP has been participating for many years.
    See also the [http://libregraphicsmeeting.org LGM website] + +*{{term | LGW}} - Libre Graphics World. LGW is an online magazine for creatives using free applications for digital painting, graphic and web design, desktop publishing, photography and CAD. Its focus are news, tutorials and articles to provide most up to date information about evolution of these applications and best practices. One of LGW's authors is [http://prokoudine.info/ Alexandre Prokoudine] (prokoudine at IRC)
    See also [http://libregraphicsworld.org/ LGW website]. + +*{{term | light, linear}} - light as it is in nature and captured by camera sensors (and thus is encoded in RAW images). + +*{{term | light, perceived}} - light as it is processed by eye and brain. The difference between linear and perceived light is that human eyes react to the same change of (linear) light with different sensitivity in dark or light environments. Perceived light is the basis of color (e.g. color is the result of light, processed by eyes and brain). + +*{{term | lightness}} - [COL] a number that corresponds to the human perception of reflected light from a surface (e.g. the {{link|brightness}} of a color relative to the {{link|brightness}} of a similar illuminated white area) {{fn_ref|1}} {{fn_ref|4}}. + +*{{term | link, dynamically}} - the process of creating a library that is not part of the program binary, but a separate file that is loaded at runtime. This makes it easy to reuse the same library for many programs. On the other hand, many versions of the same dynamic library can lead to usage of the wrong library version at runtime (the so-called DLL hell). Dynamically loaded libraries have the file extension .dll on Windows, .so on Linux and .dylib on OS X.
    See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +*{{term | link, statically}} - the process of creating a library that is included in the program binary and as such loaded at the same time with the program. Statically loaded libraries have the extension .lib on Windows, .a on Linux and OS X (until they get linked into the program).
    See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +*{{term | linker}} - a program to assemble single binary artifacts (so called 'object files') to a bigger piece of software (e.g. the program or a library). + +*{{term | LLVM}} - Low Level Virtual Machine. A collection of modular and reusable {{link|compiler}} and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines {{fn_ref|6}}. You can get it for Linux, Windows and FreeBSD 9 from the [http://llvm.org/releases/download.html LLVM download page]. On OS X LLVM is part of XCode 4.2 and later. LLVM's {{link|Clang}} is also the default {{link|C}} {{link|compiler}} in FreeBSD 10. + +*{{term | LMS}} - a color space model that describes colors in terms of the sensitivities of the three types of cone cells in the human eye, which have overlapping sensitivities to Long, Medium, and Short wavelengths of light. When chromatically adapting a color from one light source to another to maintain color constancy, the color is converted from {{link|XYZ|XYZ}} to LMS using a {{link|chromatic adaptation model|chromatic adaptation model}} such as the {{link|Bradford transform|Bradford transform}}. + +*{{term | lpi }} - lines per inch. measure of resolution or fineness of photo-mechanical reproduction.{{fn_ref|2}} + +*{{term | luma}} - the weighted sum of R', G' and B' color component (=in {{link|light, perceived | perceived light}}). It is often confused with {{link|luminance}} which actually refers to {{link|light, linear | linear light}}. [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] + +*{{term | luminance}} - +*:*the weighted sum of R, G and B color component (=in {{link|light, linear | linear light}}) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +*:*[COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) {{fn_ref|1}}. + +*{{term | luminance, relative}} - {{link|luminance}} with numerical values normalized to 1...100 (100=reference white), see [http://en.wikipedia.org/wiki/Luminance_%28relative%29 Wikipedia]. + +*{{term | LUT}} - Look-Up Table. A key-value-table, which is queried with a key and returns the assigned value. Synonyms are map or dictionary. It's a convenient way to get the results of a time-consuming or stochastic function quickly. The downside is that it potentially uses more memory than a computation. + +*{{term | LUT profile}} - a color profile which internally uses a {{link|LUT}} to assign output color values to input color values. LUT profiles have a black and white point. For instance printer profiles are mostly LUT profiles. {{fn_ref|22}} + +{{right | {{link|Table of Contents}}}} + +==M== +*{{term | M (uppercase)}} - Magenta color component of the {{link|CMY}} and {{link|CMYK}} {{link|color model|color models}}. + +*{{term | make}} - a programming tool to control the generation of executables and other non-source files of a program from the program's source files. {{fn_ref|13}}
    See also [http://www.gnu.org/software/make/ GNU make website]. + +*{{term | Makefile}} - a text file to control {{link|make}}. It contains all the {{link|make target|make targets}}. In GIMP this file is generated from the Makefile.am file by the {{link|Autotools}}. + +*{{term | make target}} - a {{link|CLI}} set of commands for {{link|make}} to trigger various actions, e.g. compiling a program from the sources. + +*{{term | metadata}} - Information about a file, i.e. author, title, date and time of creation.
    See also [http://www.metadataworkinggroup.org/ website of the Metadata Working Group]. + +*{{term | meta operation}} - {{link|GEGL | [GEGL]}} a composite {{link|operation}}, i.e. an operation that consists of other operations. + +*{{term | mipmap}} - synonym for {{link|image pyramid}}. + +*{{term | Mired}} - former, obsolete unit of reciprocal {{link|color temperature}} . + +*{{term | MNG}} - Multiple-image Network Graphics. An image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-mng.c MNG plug-in] handles this format.
    See also [http://www.libpng.org/pub/mng/spec/ MNG specification]. + +*{{term | module}} - a part of GIMP providing optional functionality, such as input controllers, color selectors and display filters. Each module can be activated and deactivated in GIMP's Module manager; the changes apply at GIMPs next start. Technically a module is tightly integrated with the GIMP core. It is a shared object that runs in the GIMP process.
    See also [https://git.gnome.org/browse/gimp/tree/modules GIMP's modules], {{link|plug-in}}. + +{{right | {{link|Table of Contents}}}} + +==N== +*{{term | node}} - an element of a {{link|graph}}. In {{link|GEGL}} a node has an associated {{link|operation}} or can be a constructed {{link|graph}}. {{fn_ref|14}} + +{{right | {{link|Table of Contents}}}} + +==O== +*{{term | OpenCL}} - open standard for parallel programming of heterogeneous systems, i.e. using additional CPU processors or {{link|GPU computing}}. OpenCL requires a driver from the manufacturer of the CPU or GPU. {{link|GEGL}} uses OpenCL to improve its own performance.
    See also [http://www.khronos.org/opencl/ OpenCL website], [[#Hacking:Porting_filters_to_GEGL | GEGL porting matrix]]. + +*{{term | OpenICC}} - a open source software project with two main goals. The first goal is to work out a common set of settings for color savvy applications to share profiles and settings. The second goal is to bring together those developers in areas like printing, display and desktop applications to work together to make {{link|color management}} end to end work for open source applications.{{fn_ref|21}}
    See also: [http://freedesktop.org/wiki/OpenIcc/ website] + +*{{term | operation}} - {{link|GEGL | [GEGL]}}The processing primitive of GEGL, it is where the actual image processing takes place. Operations are plug-ins and provide the actual functionality of GEGL {{fn_ref|14}} + +*{{term | out-of-tree-build}} - synonym for {{link|VPATH build}} + +*{{term | output pad}} - {{link|GEGL | [GEGL]}} a {{link|pad}} where data can be requested, multiple {{link|input pad|input pads}} can reference the same output pad. {{fn_ref|14}} + +{{right | {{link|Table of Contents}}}} + +==P== +*{{term | pad}} - {{link|GEGL | [GEGL]}} The part of a {{link|node}} that exchanges image content. The place where image "pipes" are used to connect the various operations in the composition. {{fn_ref|14}}
    See also {{link|input pad}}, {{link|output pad}}. + +*{{term | PCS}} - Profile Connection Space. The reference {{link|color space}} to convert from one ICC profile to another. Its purpose is to exchange color information across various devices. Usual PCS's are {{link|CIELAB|LAB}} and {{link|XYZ}}. The image editing RGB color spaces like {{link|sRGB}} use XYZ. + +*{{term | PDB}} - Procedural DataBase. The PDB (Procedural DataBase) is the most important interface to access the image manipulation functions of GIMP. The libgimp library provides some functions to call functions from the PDB or enter new functions into the PDB.
    See also [https://git.gnome.org/browse/gimp/tree/app/pdb PDB source code]. + +*{{term | Perl}} - a programming language. Perl programs are interpreted. The filename extension is .pl. GIMP itself uses it to generate {{link|PDB}} interfaces from plug-ins, see the Perl files in [https://git.gnome.org/browse/gimp/tree/plug-ins/common /plug-ins/common] and [https://git.gnome.org/browse/gimp/tree/tools/pdbgen /tools/pdbgen]. Aside from that there's {{link|GIMP-Perl}}, which is a separate GIMP plug-in.
    See also [http://www.perl.org/ Perl website]. + +*{{term | plug-in}} - an optional part of GEGL and GIMP, providing extra functionality, like filters and file loaders/savers. GIMP plug-ins are programmed in {{link|C}} or {{link|Python}}. Plugins are limited mostly to accessing image data. +:The difference to {{link|script|scripts}} is not functional, but only technical. In fact, GIMP's {{link|Script-Fu}} interpreter is a plug-in. +:The difference to {{link|module|modules}} is that modules tend to be more tightly integrated with the GIMP core, while plug-ins are almost standalone. Modules are shared objects that run in the GIMP process, while plug-ins are separate executables, which are run in a different process. This means that a crashing module will crash GIMP, while a crashing plug-in doesn't cause GIMP to crash.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins GIMP's plug-ins], [http://registry.gimp.org/ GIMP plug-in registry] + +*{{term | PNG}} - Portable Network Graphics. A bitmap image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-png.c PNG plug-in] handles this format. GIMP also reads patterns in the PNG file format and it stores thumbnails as PNG images.
    See also [http://www.w3.org/TR/PNG/ PNG specification]. + +*{{term | ppi}} - points per inch; pixels per inch: Measure of input resolution e.g. of scanning device, measured as the number of points on the object at which a sample or measure is taken or which are resolved by the device per linear inch on a given axis: e.g. 600ppi means six hundred points per inch, usually along the axis of the scanner sensor. {{fn_ref|2}} Increasing the PPI count increases the image quality up to a certain degree: whether an image is perceived as fine or coarse granular also depends on the sensitivity of the human eye and the distance between eye and image. Image quality also depends on the contrast and the smoothness of the tonal values.
    See also {{link|dpi}}, {{link|lpi}}. + +* {{term | PS}} - Adobe Photoshop, a widely used, high-end image manipulation application in the commercial sector. Photoshop is available for Windows and OS X computers. Modified variants, such as Photoshop Express and Photoshop Touch, are available for mobile devices. Note that - although GIMP is often seen as Photoshop competitor - GIMP is not a for-free-Photoshop copy {{fn_ref|23}}. + +*{{term | PSB}} - Photoshop Big. Adobe Photoshop's native file format for large documents with up to 300.000 Pixels in any dimension, otherwise identically to {{link|PSD}}. GIMP currently doesn't support PSB. + +*{{term | PSD}} - Photoshop Document. Adobe Photoshop's native file format for images with up to 30.000 Pixels in any dimension. GIMP has basic support reading and writing PSD files. Advanced PS features with no equivalent in GIMP such as adjustment layers and layer effects are currently not supported.
    See also [https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification]. + +*{{term | primary}} - abbreviation for primary color, e.g. one of the colors in a {{link|color model}} of which all other colors are mixed from. In {{link|RGB}} these are Red, Green and Blue while in {{link|CMY}} these are Cyan, Magenta and Yellow. + +*{{term | property}} - {{link|GEGL | [GEGL]}} an attribute that controls the behavior of an {{link|operation}}. Through the use of [https://developer.gnome.org/gobject/unstable/gobject-GParamSpec.html GParamSpecs] properties are self documenting via introspection. {{fn_ref|14}} + +*{{term | Python}} - a programming language. Python programs are usually interpreted. GIMP uses Python for [https://git.gnome.org/browse/gimp/tree/plug-ins/pygimp/plug-ins plug-ins], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/servertest.py the test driver for the Script-Fu server] and [https://git.gnome.org/browse/gimp/tree/tools some tools].
    See also [http://python.org/ Python website]. + +{{right | {{link|Table of Contents}}}} + +==Q== +{{term | QA}} - Quality Assurance. Actions to ensure quality during production. For software products these include for instance involvement of users and other relevant stakeholders, proper design of interactional and technical architectures, obeying coding standards, reviews and tests. + +{{right | {{link|Table of Contents}}}} + +==R== +*{{term | R (uppercase)}} - Red color channel in the {{link|RGB}} {{link|color model}}. + +*{{term | RaGaBaA}}- {{link|babl | [babl]}} a {{link|color model}} with the {{link|alpha}} premultiplied channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, linear | linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | R'aG'aB'aA}}- {{link|babl | [babl]}} a {{link|color model}} with the {{link|alpha}} premultiplied channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, perceived | perceived light}}. + +*{{term | Recent File Storage Specification}} - Provides a standard mechanism for storing a list of recently used files. Supported since GIMP version 2.1.6.
    See also [http://standards.freedesktop.org/recent-file-spec/recent-file-spec-latest.html detailed Recent File Storage specification]. + +*{{term | refactoring}} - to improve a small piece of code without neither changing its results nor introducing side effects.
    See also: [http://refactoring.com/ Martin Fowlers website on refactoring] + +*{{term | repository}} - the database in a {{link|Version Control System|version control system}} that contains all the file history. + +*{{term | resolution}} (from {{fn_ref|2}}) - +*:* For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system.
    Units: total number of usable pixels for digital cameras; {{link|ppi}} for scanners; line pairs per millimetre for objectives (not to be confused with {{link|lpi}}!). +*:* For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output.
    Unit: {{link|dpi}}. +*:* Measure of system's ability to distinguish variations in colors or of density.
    Unit: bit depth (total number of bits available for encoding values). +*:* For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. + +*{{term | RGB}} - generally and in {{link|babl}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}}. It operates in {{link|light, linear | linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | R'G'B'}} - {{link|babl | [babl]}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}}. It operates in {{link|light, perceived | perceived light}} with an sRGB {{link|TRC}} which is roughly perceptually uniform.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | RGBA}} - generally and in {{link|babl}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, linear | linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/babl-core.c source code] + +*{{term | R'G'B'A}} - {{link|babl | [babl]}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, perceived | perceived light}} with an sRGB {{link|TRC}} which is roughly perceptually uniform.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | ROI}} - {{link|GEGL | [GEGL]}} - region of interest. It's the area you're currently working on in your GEGL operation. + +{{right | {{link|Table of Contents}}}} + +==S== +*{{term | saturation}} - colorfulness of an area judged in proportion to its {{link|brightness}} {{fn_ref|4}}
    See also: {{link|chroma}} + +*{{term | Scheme }} - a programming language. The current standard version is R6RS, while the {{link|TinyScheme}}, the version in GIMP implements a subset of the older version R5RS. The coming standard R7RS is [http://scheme-reports.org/ work in progress].
    See also [http://people.csail.mit.edu/jaffer/r5rs_toc.html Scheme R5RS language description]. + +*{{term | scRGB }} - an extended {{link|RGB}} {{link|color space}}. In {{link|GEGL}} most operations work in scRGB using 32bit floating point/HDR {{link|light, linear|linear light}} {{link|RGBA}}.{{fn_ref|18}}
    See also [http://webstore.iec.ch/webstore/webstore.nsf/artnum/029678 scRGB specification (charged)], [http://www.color.org/chardata/rgb/scrgb.xalter short overview at ICC], [http://en.wikipedia.org/wiki/ScRGB_color_space Wikipedia:scRGB]. + +*{{term | script}} - a little program in {{link|Script-Fu}}. Scripts add optional extra functionality to GIMP. They have the filename extension .scm.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's scripts], {{link|plug-in|distinction to plug-ins}}, [http://registry.gimp.org/ GIMP plug-in registry]. + +*{{term | Script-Fu}} - a {{link|Scheme}} dialect. Developers can use Script-Fu for writing user-defined extensions. GIMP then interprets them using {{link|TinyScheme}} and {{link|FTX}}.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's Script-Fu scripts], [http://www.gimp.org/docs/scheme_plugin/ Script-Fu tutorial]. + +*{{term | Shared MIME Database}} - The shared MIME database contains common MIME types, descriptions, and rules for determining the types of files. GIMP file plug-ins should use the MIME types and descriptions defined here.
    See also [http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html Shared MIME Database specification]. + +*{{term | sRGB}} - the default {{link|color space}} for the internet and other interested vendors.
    See also [http://www.w3.org/Graphics/Color/sRGB detailed description at W3C]. + +*{{term | Startup Notification}} - Specifies a mechanism allowing a desktop environment to track application startup to provide user feedback. {{link|GTK+}} provides support for this protocol.
    See also [http://standards.freedesktop.org/startup-notification-spec/startup-notification-latest.txt Startup Notification specification]. + +*{{term | Subversion}} - a {{link|Version Control System|version control system}} the {{link|GNOME}} project used before it was superseded with {{link|Git}} in 2009. + +*{{term | SVG 1.1}} - Scalable Vector Graphics. A vector graphics format. GIMP uses it to import vector graphics, import and export paths and load gradients from SVG files. In GIMP the SVG plug-in handles this format. To create standards conform SVG graphics with free, open source software you can use [http://www.inkscape.org Inkscape] for instance.
    See also [http://www.w3.org/TR/SVG/ W3C recommendation] + +*{{term | SVN}} - abbreviation for {{link|Subversion}}. + +{{right | {{link|Table of Contents}}}} + +==T== +*{{term | Thumbnail Managing Standard}} - Deals with the permanent storage of previews for file content. In particular, it tries to define a general and widely accepted standard for this task. GIMP implements this standard and dropped support for the old-fashioned .xvpics.
    See also [http://web.archive.org/web/20110818223906/http://jens.triq.net/thumbnail-spec/ Thumbnail Managing Standard specification]. + +*{{term | TIFF 6.0}} - Tagged Image File Format.
    See also [http://partners.adobe.com/public/developer/tiff/ TIFF specification and other developer resources], [http://www.awaresystems.be/imaging/tiff.html Unofficial TIFF home page]. + +*{{term | tile}} - {{link|GEGL | [GEGL]}} Functionally a rectangular part of an {{link|operation|operation's}} input, intermediate or output data. Technically tiles are internal implementation parts of GEGL buffers, i.e. not exposed in the GEGL buffer {{link|API|APIs}}. {{fn_ref|14}} + +*{{term | tile backend}} - {{link|GEGL | [GEGL]}} the implementation of pixel storage for a GeglBuffer (synonymous to a file system driver in an operating system). There are backends storing each tile as separate files, all tiles of a buffer in a file, communicate over gimps wire-protocol for plug-ins to operate on GeglBuffers where the tiles are stored in the main {{link|GIMP}} process. Other possible tile backends could communicate over the network to fetch spatial tiles from map providers (OpenStreetMap etc.) + +*{{term | TinyScheme}} - a lightweight {{link|Scheme}} interpreter that implements a subset of the [http://people.csail.mit.edu/jaffer/r5rs_toc.html R5RS Scheme standard]. GIMP uses it to interpret {{link|Script-Fu}}. One of its maintainers is Kevin Cozens (kevin in IRC)
    See also [http://tinyscheme.sourceforge.net/home.html TinyScheme website], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/tinyscheme TinyScheme in GIMP]. + +*{{term | TRC}} - Tone Response Curve. A curve describing the signal response of the eye or an sensor to changes in {{link|light, linear | linear light}} and as such the foundation for {{link|light, perceived | perceived light}}. + +{{right | {{link|Table of Contents}}}} + +==U== +*{{term | UI}} - user interface. The part of the program the user interacts with.
    See also: {{link|CLI}}, {{link|GUI}}. + +{{right | {{link|Table of Contents}}}} + +==V== +*{{term | Value}} - +*:* Level of {{link|brightness}} of a pixel or color as defined in HSV {{link|color model}}. {{fn_ref|2}} +*:* Designation of {{link|lightness}} of color in the Munsell system of color nomenclature. {{fn_ref|2}} +*:* Tone or {{link|brightness}} of a color as assessed subjectively: high values give light colors, low value colors appear dark.{{fn_ref|2}} +*:* [photo] in the Zone System the step or zone which corresponds to a certain range of subject {{link|brightness}}. {{fn_ref|2}} +*:* [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, {{link|luminance}} and film speed. {{fn_ref|2}} + +*{{term | VCS}} - abbreviation of {{link|Version Control System}}. + +*{{term | Version Control System}} - a software system that records all changes to arbitrary files and file sets over time. It's allows you to recall specific versions later, compare versions, review changes made over time, find out who last modified something or which change introduced a bug, revert changes etc.{{fn_ref|16}} We use {{link|Git}} for managing the {{link|babl}}, {{link|GEGL}} and {{link|GIMP}} source code and documentation. + +*{{term | VPATH build}} - an {{link|Autotools}} build outside the source directory. Example: given the sources are in $HOME/src, then the compiled files could for instance be in $HOME/build.
    See also [http://www.gnu.org/software/automake/manual/html_node/VPATH-Builds.html VPATH Builds in the Automake documentation] + +{{right | {{link|Table of Contents}}}} + +==W== +*{{term | W3C}} - World Wide Web Consortium. The W3C is an international community where member organizations, a full-time staff, and the public work together to develop web standards, such as {{link | SVG 1.1}}, {{link|XML}} and {{link|XSL}}. {{fn_ref|10}} + +*{{term | wgo}} - GIMP's main website [http://www.gimp.org www.gimp.org]. + +* {{term | Wilber}} - +*:* The nick name of the IRC chatbot.
    See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +*:* GIMP's mascot. +:[[File:Wilber.png|Wilber, the GIMP mascot]] + +*{{term | white point}} - the light-source's or sensor's interpretation of white. Practically it's a synonym for {{link|color temperature}}.
    See also [http://eilv.cie.co.at/term/1430 CIE's definition], [http://www.colorwiki.com/wiki/White_Point ColorWiki]. + +{{right | {{link|Table of Contents}}}} + +==X== +*{{term | XCF}} - eXperimental Computing Facility, the origin of GIMP. +*:*GIMP's file format.
    See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +*:*Cinepaint's derivative of GIMP's XCF file format. Both are incompatible.{{fn_ref|20}}
    See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] + +*{{term | XDND}} - Drag-and-Drop Protocol for the X Window System. XDND defines a standard for drag and drop on X11. It is implemented by {{link|GTK+}}.
    See also [http://freedesktop.org/Standards/XDND XDND specification]. + +*{{term | XDS}} - Direct Save Protocol for the X Window System. XDS defines an extension to {{link|XDND}} that allow users to save a file by simply dragging it to a file manager window. GIMP supports this protocol since version 2.4.
    See also [http://web.archive.org/web/20060924165119/http://freedesktop.org/wiki/Standards_2fdirect_2dsave XDS specification]. + +*{{term | XML}} - Extensible Markup Language. Describes the markup language used to store the [https://git.gnome.org/browse/gimp/tree/menus menu layout], the [https://git.gnome.org/browse/gimp/tree/data/tips/gimp-tips.xml.in startup tips], {{link|Docbook}} documents and other.
    See also [http://www.w3.org/XML/ XML overview page at W3C], written by Liam Quin (Ankh in IRC) + +*{{term | XMP}} - Extensible Metadata Platform. A labeling technology that allows to store {{link|metadata}}. This information is either embedded in the file itself or as separate file (a so-called XMP sidecar file).
    See also [http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf XMP specification], [http://www.adobe.com/products/xmp/index.html XMP description at Adobe] + +*{{term | XSETTINGS}} - The XSETTINGS protocol provides a mechanism for applications written with different toolkits to share simple configuration settings such as double-click-times and background colors. {{link|GTK+}} hides this from us.
    See also [http://standards.freedesktop.org/xsettings-spec/xsettings-spec-0.5.html XSETTINGS specification]. + +*{{term | XSL}} - Extensible Stylesheet Language Family. XSL is a family of recommendations for defining XML document transformation and presentation. It consists of the parts {{link|XSLT}}, {{link|XML}} Path Language (XPath) and XSL Formatting Objects (XSL-FO).
    See also: [http://www.w3.org/Style/XSL/ XSL website at W3C]. + +*{{term | XSLT}} - {{link|XSL Transformations}}, a language for transforming {{link|XML}} documents into other formats, such as HTML, program code or plain text. GIMP uses XSLT to generate [https://git.gnome.org/browse/gimp/tree/menus/menus.xsl menus], [https://git.gnome.org/browse/gimp/tree/data/tips/fortunes.xsl startup tips] and [https://git.gnome.org/browse/gimp/tree/authors.xsl author attribution].
    See also [http://www.w3.org/TR/xslt W3C recommendation]. + +*{{term | XYZ}} - {{link|color model}}, based on experimental observations on humans (the '{{link|CIE}} standard observer'). It operates in {{link|light, linear | linear light}}. + +{{right | {{link|Table of Contents}}}} + +==Y== +*{{term | Y (uppercase)}} - +*:*Yellow color component of the {{link|CMY}} and {{link|CMYK}} {{link|color model|color models}}. +*:*{{link|babl | [babl]}}: grayscale {{link|color model}} or {{link|lightness}} component in a {{link|color model}}. It's in {{link|light, linear|linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +*:*{{link|luminance, relative | relative luminance}} in {{link|XYZ}} {{link|color model}}. +*:*{{link|luminance}} in xyY {{link|color model}}. + +*{{term | Y' (uppercase)}} - *:*{{link|babl | [babl]}}: grayscale {{link|color model}} or {{link|lightness}} component in a {{link|color model}}. It's in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | YA}} - {{link|babl|[babl]}} a {{link|color model}} with the components {{link|Y (uppercase)|Y}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, linear|linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | YaA}} - {{link|babl|[babl]}} a {{link|color model}} with the components alpha-premultiplied {{link|Y (uppercase)|Y}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, linear|linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | Y'A}} - {{link|babl|[babl]}} a {{link|color model}} with the components {{link|Y' (uppercase)|Y'}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | Y'aA}} - {{link|babl|[babl]}} a {{link|color model}} with the components alpha-premultiplied {{link|Y' (uppercase)|Y'}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | YCbCr}} - a {{link|color model}} with the components {{link|Y (uppercase)|Y}} {{link|luma|(luminance)}}, {{link|Cb}} and {{link|Cr}}. Unlike RGB it encodes the image information in luminance (channel Y) and chrominance (channels Cb and Cr). YCbCr operates in {{link|light, linear|linear light}}. It is used for digital video and has good image compression capabilities. + +*{{term | Y'CbCr}} - +*:*a {{link|color model}} with the components {{link|Y' (uppercase)|Y'}} {{link|luma|(luma)}}, {{link|Cb}} and {{link|Cr}}. It operates in {{link|light, perceived|perceived light}}. It is used for digital video and has good image compression capabilities. +*:*{{link|babl|[babl]}} implementation of the Y'CbCr color model.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +*{{term | Y'CbCrA}} - {{link|babl|[babl]}} {{link|color model}} with the components {{link|Y' (uppercase)|Y'}} {{link|luma|(luma)}}, {{link|Cb}}, {{link|Cr}} and {{link|A (uppercase)|A}}. It operates in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +*{{term | YCC}} - abbreviation of {{link|YCbCr}}. + +*{{term | YIQ}} - {{link|color model}} which separates {{link|luminance}} (Y component) from {{link|chroma}} (I, Q components). It is used for analog TV (NTSC in the U.S.) and thus irrelevant for digital image editing. + +*{{term | YPbPr}} - the analog equivalent to {{link|YCbCr}} and thus irrelevant for digital image editing. + +*{{term | YUV}} - {{link|color model}} which separates {{link|luminance}} (Y component) from {{link|chroma}} (U, V components). It is used for analog TV (PAL in Europe) and thus irrelevant for digital image editing. + +{{right | {{link|Table of Contents}}}} + +==Z== +{{right | {{link|Table of Contents}}}} + +==References== + + +
      +{{fn|1|[http://www.colorwiki.com/wiki/Category:Glossary CHROMiX ColorWiki]}} +{{fn|2|[http://www.idigitalphoto.com/dictionary/ idigitalphoto Photography Dictionary]}} +{{fn|3|[http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia:HSL and HSV]}} +{{fn|4|CIE: [http://eilv.cie.co.at/ e-ILV: International Lighting Vocabulary]}} +{{fn|5|Michael Larabel: [http://www.phoronix.com/scan.php?page=news_item&px=MTEwMjI FreeBSD 10 To Use Clang Compiler, Deprecate GCC]}} +{{fn|6|[http://www.llvm.org LLVM website]}} +{{fn|7|Clang Team: [http://clang.llvm.org/docs/CrossCompilation.html Cross-compilation using Clang]}} +{{fn|8|W3C, Chris Lilley: [http://www.w3.org/Graphics/JPEG/ JPEG JFIF]}} +{{fn|9|ICC: [http://www.color.org/abouticc.xalter About ICC]}} +{{fn|10|[http://wwww.w3.org W3C website]}} +{{fn|11|[http://www.gnome.org GNOME website]}} +{{fn|12|[http://www.iso.org ISO website]}} +{{fn|13|[http://www.gnu.org/software/make/ GNU Make website]}} +{{fn|14|[http://gegl.org/#_glossary GEGL glossary]}} +{{fn|15|Lance, Williams: [http://staff.cs.psu.ac.th/iew/cs344-481/p1-williams.pdf Pyramidal parametrics], Computer Graphics 7.3 (1983): 1-11.}} +{{fn|16|Scott Chacon: [http://git-scm.com/book/en/Getting-Started-About-Version-Control Getting Started About Version Control], licensed under [http://creativecommons.org/licenses/by-nc-sa/3.0/ CC BY-NC-SA 3.0]}} +{{fn|17|Lucas Rocha, [https://mail.gnome.org/archives/devel-announce-list/2009-March/msg00005.html Announcement at GNOME's devel-announce-list], 19.03.2009}} +{{fn|18|[http://www.gegl.org GEGL website]}} +{{fn|19|[http://www.gtk.org GTK+ website]}} +{{fn|20|[http://www.linuxdevcenter.com/pub/a/linux/2004/04/29/cinepaint.html?page=2 Linux Devcenter: Developer interview: Robin Rowe and Andrew Prock on Cinepaint]}} +{{fn|21|[http://freedesktop.org/wiki/OpenIcc/ OpenICC website]}} +{{fn|22|Stone, Elle: [http://ninedegreesbelow.com/photography/xyz-rgb.html Completely Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs ]}} +{{fn|23|The GIMP team: [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision Produkt vision]}} +
    +{{right | {{link|Table of Contents}}}} + +==Trademarks== +Adobe, Photoshop, Photoshop Express and Photoshop Touch are either trademarks or registered trademarks of Adobe Systems Incorporated in the United States and/or other countries. Apple and OS X are trademarks of Apple Computer, Inc. registered in the United States and other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. All other products are the property of their respective owners. + +{{right | {{link|Table of Contents}}}} diff --git a/wiki/Glossary-20161029172043-show.txt b/wiki/Glossary-20161029172043-show.txt new file mode 100644 index 0000000..6a63d91 --- /dev/null +++ b/wiki/Glossary-20161029172043-show.txt @@ -0,0 +1,890 @@ + + +This glossary contains definitions important for the GIMP development. These include functional definitions i.e. from computer graphics and color theory, photography, terms from babl and GEGL etc. + + + +[https://bugzilla.gnome.org/enter_bug.cgi?product=gimp-web&component=wiki.gimp.org Report a bug] + + + + +==Table of Contents== + + Legend + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + References + Trademarks + + + + +==Legend== + +{| class="wikitable" +|- +| [babl] | specific to babl +|- +| [COL] | colorimetry +|- +| [coll.] | colloquial +|- +| [GEGL] | specific to GEGL +|- +| [GIMP] | specific to GIMP +|- +| [photo] | photography +|} + + + + +==A== + +* ''' a (lowercase)''' - [babl] denotes a color channel to be premultiplied with alpha, for instance RaGaBa is premultiplied alpha RGB + +* ''' a* (lowercase)''' - The axis in the CIELAB color model which denotes the green-magenta component of the color. A negative value on this axis denotes green and a positive value denotes magenta. + +* ''' +* ''' - +: +** The alpha channel in a color model, for instance in RGBA. +** [babl] the alpha value in a color model. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to RGB . The same applies to R'aG'aB'aA, YaA, Y'aA. +** The alpha channel in a color model, for instance in RGBA. +** [babl] the alpha value in a color model. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to RGB . The same applies to R'aG'aB'aA, YaA, Y'aA. +* The alpha channel in a color model, for instance in RGBA. +* [babl] the alpha value in a color model. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to RGB . The same applies to R'aG'aB'aA, YaA, Y'aA. + +* ''' abyss''' - [GEGL] data from outside the input buffer. + +* ''' abyss policy''' - [GEGL] the behaviour rule to handle abyss data: to clamp to the border, loop in the buffer extent, or implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to GEGL_ABYSS_LOOP adds the tileability to the operation for free. + +* ''' alpha''' - opacity. An alpha value of 0 means 'transparent', an alpha value of 100 means 'fully opaque', values in between mean 'partly opaque'. + +* ''' API''' - Application Programmers Interface. The technical interface of a library to external developers who are intended use it. It defines the provided services, their semantic and syntax. On implementation level these are the public data types, enumerators and functions with their signatures. +See also: [http://gegl.org/api.html GEGL API] , [http://gegl.org/#_operation_api GEGL operation API], [http://developer.gimp.org/api/2.0/index.html GIMP API]. + +* ''' ArgyllCMS''' - an open source color management system for profiling input devices (scanner, camera, etc) and calibrating and profiling output devices (printer, monitor, etc), plus a suite of command line utilities for exploring, linking, and converting between ICC profiles. +See also the [http://argyllcms.com/ ArgyllCMS website]. + +* ''' Autohell''' - [coll.] synonym for Autotools, because they are practically hard to figure out. + +* ''' Autotools''' - the GNU build system. They check the current configuration to ensure all dependencies are in place, generate the Makefiles and execute them to do several tasks like compiling, installing and testing a program. +See also the [http://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html#Autotools-Introduction GNU Autotools website]. + + +==B== + +* ''' b* (lowercase)''' - the axis in the CIELAB color model which denotes the blue-yellow component of the color. A negative value on this axis denotes blue and a positive value denotes yellow. + +* ''' +* ''' - +: +** Blue color channel in the RGB color model. +** brightness component of the HSB color model. +** [photo] symbol for brightness: obsolete, but may be found on older light meters. [2] +** [photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. [2] +** Blue color channel in the RGB color model. +** brightness component of the HSB color model. +** [photo] symbol for brightness: obsolete, but may be found on older light meters. [2] +** [photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. [2] +* Blue color channel in the RGB color model. +* brightness component of the HSB color model. +* [photo] symbol for brightness: obsolete, but may be found on older light meters. [2] +* [photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. [2] + +* ''' babl''' - a dynamic, any to any, pixel format translation library. +See also: [http://www.gegl.org/babl babl website] + +* ''' backend''' - generally the internal part of a library that implements its public API. In GEGL this could for instance be computing an operation, storing tiles and memory management. + +* ''' black point''' - the light-source's (e.g. a monitor) or sensor's interpretation of black. + +* ''' Bradford transform''' - a matrix used to convert XYZ colors to the LMS color space when chromatically adapting a color in order to maintain constant color appearance under different light sources. The Bradford transform is recommended by the ICC and used by ArgyllCMS and LCMS when making ICC D50-adapted RGB profiles from color spaces such as the sRGB D65 color space. + +* ''' brightness''' - attribute of a visual perception according to which an area or color appears to emit, or reflect, more or less light. This correlates directly with the amplitude of the lightwave. [1] [4] + +* ''' bug''' - an error in a program, e.g. an existing feature doesn't work as specified or usually expected. Requests for new features are not bugs, but enhancement requests. + +* ''' bugtracker''' - a software system for gathering, managing and keeping track of bugs and enhancement requests. We use Bugzilla for bugtracking. + +* ''' Bugzilla''' - the GIMP project uses [https://bugzilla.gnome.org/ Bugzilla] of the GNOME project, a bugtracker that allows us to coordinate bug reports. Bugzilla is also used for enhancement requests and the preferred way to submit patches for GIMP is to open a bug report and attach the patch to it. +See also: [http://www.bugzilla.org/ Bugzilla website], [http://www.gimp.org/bugs/ Reporting bugs in GIMP]. + +* ''' +* ''' - +: +** (verb) - the process of compiling and linking a software from its sourcecode. +** (noun) - the result of the build process, i.e. a binary or archive, distributable file. +** (verb) - the process of compiling and linking a software from its sourcecode. +** (noun) - the result of the build process, i.e. a binary or archive, distributable file. +* (verb) - the process of compiling and linking a software from its sourcecode. +* (noun) - the result of the build process, i.e. a binary or archive, distributable file. + +* ''' Bz ''' - abbreviation for Bugzilla. + + +==C== + +* ''' +* ''' - +: +** Cyan color component of the CMY and CMYK color models. +** chroma component of the LCH color model. +** the programming language most of GIMP, GEGL and babl is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of GObject. +** Cyan color component of the CMY and CMYK color models. +** chroma component of the LCH color model. +** the programming language most of GIMP, GEGL and babl is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of GObject. +* Cyan color component of the CMY and CMYK color models. +* chroma component of the LCH color model. +* the programming language most of GIMP, GEGL and babl is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of GObject. + +* ''' Cb''' - the Blue component of YCbCr chroma. + +* ''' chroma''' - Colorfulness of an area judged as a proportion of the brightness of a similarly illuminated area that appears white or highly transmitting. [1] [4] +See also saturation. + +* ''' +* ''' - +: +** (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the color temperature of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +** (mathematically) - the process of using a chromatic adaptation model to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, Bradford, and Sharp. +** (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the color temperature of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +** (mathematically) - the process of using a chromatic adaptation model to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, Bradford, and Sharp. +* (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the color temperature of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +* (mathematically) - the process of using a chromatic adaptation model to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, Bradford, and Sharp. + +* ''' chromatic adaptation model''' - a mathematical transform from the XYZ color space to the LMS color space. A chromatic adaptation model is used to calculate the equivalent XYZ colors required to maintain constant color appearance under different light sources. + +* ''' chromaticity''' - The color properties of a sample judged independently of luminance, i.e. in terms of hue and saturation only. [1] + +* ''' CI''' - abbreviation for Continuous Integration. + +* ''' CIE''' - Commission Internationale de l'Eclairage (International Commission on Illumination). Independent, non-profit organization for recommendations on photometry and colorimetry. Its aim is to exchange information on all matters relating to the science and art of light and lighting, color and vision, photobiology and image technology worldwide. It is recognized by ISO as an international standardization body. The CIE has defined several color spaces that describe the range of visible colors in unambiguous numerical terms. [1] [4] + +* ''' CIE 1976 L*a*b*''' - synonym of CIELAB + +* ''' CIE Lab''' - [babl] implementation of CIELAB. + +* ''' CIE Lab alpha''' - [babl] implementation of CIELAB with an alpha channel (A). + +* ''' CIEL*a*b*''' - synonym of CIELAB + +* ''' CIELAB''' - a device independent color model defined by CIE in 1976. It describes colors as points on the three axes L, a, b. It is also said to be the reference color model in Adobe Photoshop (but not GIMP), e.g. internal computations from one color space to another are done there via CIELAB. +See also [http://eilv.cie.co.at/term/157 CIELAB's formal definition] by the CIE. + +* ''' Clang''' - the C compiler of the LLVM project. Clang is able to cross-compile code, i.e. build GIMP for Windows on a Linux machine [7]. + +* ''' CLI''' - command line interface. A form of UI where the user interacts with the program by entering textual commands. This can e.g. be the set of commandline arguments that are passed to the the program on startup, or a commandline in the GUI to enter textual commands. You can get the set of GIMP's commandline arguments by entering '''gimp --help''' at the systems shell. + +* ''' Clipboard Manager''' - The Clipboard Manager specification describes how applications can actively store the contents of the clipboard when the application is quit. This requires that a compliant clipboard manager is running. Standard specific to the X window system. +See also [http://www.freedesktop.org/wiki/ClipboardManager Clipboard Manager specification]. + +* ''' Clipboards''' - Explanation of the consensus of the Qt and GTK+ developers on how the X clipboard works. Standard specific to the X window system. +See also [http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt informal Clipboards specification]. + +* ''' CMY''' - color model with the three primary colors Cyan, Magent and Yellow. The three "subtractive" primary colors used as the basis of all dye or pigment-based printing systems and color photography. A full range of colors including neutral grays and blacks can be produced with good cyan, yellow and magenta colorants (e.g. color film dyes) but typical printing inks are less than perfect. [1] + +* ''' +* ''' - +: +** color model with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to CMY to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with CMY alone. [1] +** [babl] implementation of the CMYK color model. GEGL treats rendering CMYK as problem subset of rendering spot colors. +** pronouncation: C.M.Y.K., not schmuck nor smug +** color model with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to CMY to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with CMY alone. [1] +** [babl] implementation of the CMYK color model. GEGL treats rendering CMYK as problem subset of rendering spot colors. +** pronouncation: C.M.Y.K., not schmuck nor smug +* color model with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to CMY to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with CMY alone. [1] +* [babl] implementation of the CMYK color model. GEGL treats rendering CMYK as problem subset of rendering spot colors. +* pronouncation: C.M.Y.K., not schmuck nor smug + +* ''' color management''' - an approach to ensure that colors look the same (or at least most similar) across various devices in a workflow. For instance it ensures that photos taken from a camera look the same at the editors screen and the printer output. If you have questions on color management, then Øyvind Kolås (IRC nick: pippin) or Elle Stone (IRC nick: elle) are the best persons to ask in the project. + +* ''' color model''' - a mathematical model to describe colors and handle them formally, such as points in a coordinate system. This is the more theoretically abstract background of color computation. Practically this term is often used synonymously to color space. +Examples are CIELAB , RGB and XYZ . + +* ''' color space''' - a geometric representation of color in space, usually of 3 dimensions [4]. While color models are the theoretical background color spaces describe the set of visible or reproducable colors [2]. Practically this term is often used synonymously to color model. To get a visual notion of various color spaces and their relationships see [http://www.brucelindbloom.com/WorkingSpaceInfo.html#Viewer Bruce Lindblooms 3D Gamut Viewer] demo. +Examples are AdobeRGB, sRGB and Wide Gamut RGB. +To assign a numerical vector to a real color you need both a color model and a color space. As an example the numbers (0,1,0) are given. In XYZ color model with sRGB color space they represent a pure green. In XYZ color model with AdobeRGB color space you get a pure, but more saturated green. In HSB color model+sRGB color space these numbers represent a pure black. + +* ''' color temperature''' - formally the temperature of an ideal black body radiator whose radiation has the same chromaticity as that of a given stimulus. [4] Practically it's a synonym for white point [1]. Not to be confused with the artistic classification into warm colors (i.e. yellow, orange) and cold colors (i.e. blue). +Unit: K (Kelvin). + +* ''' compiler''' - a program to translate code in a programming language into executable machine code, i.e. gcc or Clang. In GIMP there's no recommended default C compiler. Instead the platform default will be used automatically. + +* ''' connection''' - [GEGL] A link/pipe routing image flow between operations within the graph goes from an output pad to an input pad, in graph glossary this might also be referred to as an edge. [14] + +* ''' Continuous Integration''' - a method to regularly fetch the source code from the version control system, build and test the software. Developers get almost immediate feedback whether their software builds and works well. By doing this on a regular basis bugs can be detected and fixed much earlier than if testing was the last step before the release or after release on the user's side. This increases the software quality. Modern continuous integration systems use a client-server architecture: a server does all the continuous integration jobs and users access it via a web browser (=the client). GIMP uses Jenkins as continuous integration server. + +* ''' Cr''' - the Red component of YCbCr chroma. + +* ''' CVS''' - a version control system the GNOME project had used a long time ago, before it was superseded with Subversion. Now we're using Git. + + +==D== + +* ''' D-Bus ''' - Desktop Message Bus. If available, GIMP uses it to detect if another GIMP instance is already running. In the future, GIMP might make even more use of D-Bus. +See also [http://dbus.freedesktop.org/doc/dbus-specification.html D-Bus specification], [https://git.gnome.org/browse/gimp/tree/app/gui/dbus-service.xml GIMP's D-Bus service's interface descriptor], [http://raphael.slinckx.net/blog/documents/dbus-tutorial D-Bus tutorial]. + +* ''' D50''' - a CIE standard illuminant with the spectral power distribution of daylight (which has a color temperature of 5003 Kelvin). It is chosen for the special needs of the paper printing industry and thus the preferred reference white for evaluating prints on paper. Compared to D65 it's a bit more yellowish. + +* ''' D65''' - a CIE standard illuminant with the spectral power distribution of noon mid-latitude daylight (which has a color temperature of 6504 Kelvin). It's the white balance standard used for sRGB color space and to calibrate display screens. Compared to D50 it's a bit more bluish. + +* ''' DAG''' - Directed Acyclic Graph. In computer science and mathematics a graph with directed edges and the attribute, that every node is reached never or only once on any path. For instance trees (as data structure) are DAGs. + +* ''' deprecated''' - a term from software development. Code marked as '''deprecated''' is outdated or obsolete. It and the code using it need to be replaced by refactored code soon. Deprecated code often occurs as result of API changes. +Example: The code contains two functions '''do_this''' and '''do_that'''. Function '''do_that''' calls '''do_this'''. Function '''do_this''' is marked as deprecated. It soon needs to be replaced by a newer function '''do_this_better''' and '''do_that''' needs to call '''do_this_better''' instead. + +* ''' Desktop Entry Specification''' - This document describes desktop entries: files describing information about an application such as the name, icon, and description. GIMP installs such a [https://git.gnome.org/browse/gimp/plain/desktop/gimp.desktop.in.in .desktop file]. +See also the [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html detailed Desktop Entry specification]. + +* ''' DND''' - Drag and Drop. + +* ''' DNG''' - Digital Negative. An image file format aiming to become a device-independent standard for storing raw data from digital cameras. +See also [http://www.adobe.com/products/dng/pdfs/dng_spec.pdf DNG specification]. + +* ''' DOAP''' - DOAP is an XML schema for describing software projects. The GNOME project uses it for instance to show a short project's description at the [https://git.gnome.org/browse/ project index]. +See also [https://github.com/edumbill/doap/ DOAP website], [https://git.gnome.org/browse/gimp/tree/gimp.doap GIMP's DOAP file]. + +* ''' Docbook''' - DocBook is a general purpose XML schema particularly well suited to books and papers. In GIMP it is used for the [https://git.gnome.org/browse/gimp-help-2/tree/ user documentation] and [https://git.gnome.org/browse/gimp/tree/devel-docs/structure.xml structure of the technical documentation]. +See also the [http://www.docbook.org/specs/ Docbook specifications]. + +* ''' dpi ''' - dots per inch. Measure of resolution of a device as density or frequency of points or dots which can be addressed or referred to by the device. [2] It is often confused with lpi and ppi. DPI refers to the amount of ink dots in printing. Each of these dots has a certain primary, for instance a CMYK color. Pixels of secondary colors are created by plotting many of these dots side-by-side. Thus a high DPI count isn't the same as a high PPI count. Because of technological progress in ink printing this measure is of decreasing importance. + +* ''' dynamic range''' - Measure of spread from the highest to lowest energy levels that can be captured by an imaging or recording or reproduced by a play-back device. E.g. a top-class scanning camera back can capture a range of 11 f/stops; a good film-scanner may be able to manage under 9 stops. The concept of energy levels is usually converted to densities in devices such as scanners e.g. dynamic range is '0.2 - 3.0D units'. [2] + + +==E== + +* ''' enhancement request''' - the request for a new feature, that is not already in GIMP. An enhancement request should never be filed without prior discussion on the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list gimp-developer mailing list]. This is to make sure that the enhancement requests that are filed are well-specified and aligned with the overall goals the developers have for GIMP. + +* ''' Extended Window Manager Hints''' - The Window Manager Specification is meant to unify the GNOME and KDE window manager hint conventions. Standard specific to the X window system. +See also the [http://standards.freedesktop.org/wm-spec/wm-spec-latest.html Extended Window Manager Hints specification]. + + +==F== + +* ''' File URI specification''' - Specifies how URIs for normal UNIX filenames (file: URIs) are interpreted and created. This functionality is provided by GLib. +See also the [http://freedesktop.org/wiki/Specifications/file-uri-spec detailed File URI specification]. + +* ''' FTX''' - File and Time Extensions for TinyScheme. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/ftx FTX in GIMP]. + + +==G== + +* ''' G (uppercase)''' - Green color channel in the RGB color model. + +* ''' gcc''' - a C compiler. Part of the free [http://gcc.gnu.org/ GNU Compiler Collection]. On Linux it usually ships with your distribution. On Windows it's part of [http://www.mingw.org/ MinGW]. On OS X XCode versions before 4.2 used gcc; then Apple moved to llvm-gcc and Clang. FreeBSD 10 deprecates gcc support in favor of Clang. [5] Gcc is able to cross-compile, i.e. build GIMP for Windows on a Linux machine. + +* ''' GEGL''' - Generic Graphics Library, a graph based image processing framework. It is GIMP's foundation for nondestructive image editing in high bit depths. GEGL provides the infrastructure to do demand based, cached, nondestructive image editing on larger than RAM buffers. Through babl it provides support for a wide range of color models and pixel storage formats for input and output. GEGL support in current GIMP versions is experimental and will be official part of GIMP in version 2.10. + See also: [http://www.gegl.org/ GEGL website], GEGL porting matrix + +* ''' GEGL-chant''' - A way to hide some boilerplate code in GEGL and to reduce code duplications defining the parameters specifications of each operation. To achieve this it makes heavy use of C macro definitions and the C preprocessor. It allows defining a property on one line instead of the usual GObject way which needs 4 or 5 different locations in the class modified for each added property. The chanted properties can contain metadata, such as valid values, upper and lower bounds and their suitability for nonlinear compuation. +See also the file [https://git.gnome.org/browse/gegl/tree/gegl/gegl-chant.h gegl-chant.h] and the GEGL operations using it. + +* ''' GIF''' - Graphics Interchange Format. A bitmap image file format, especially for web graphics with low image depths and optionally transparency, i.e. logos or animations. In GIMP the GIF plug-in handles this format. +See also: [http://www.w3.org/Graphics/GIF/spec-gif89a.txt GIF89a specification], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-load.c GIMP's GIF loader], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-save.c GIMP's GIF saver] + +* ''' GIMP''' - GNU Image Manipulation Program, an advanced image editor. +See also: [http://www.gimp.org/ GIMP website], [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision GIMP product vision]. + +* ''' GIMP-Perl''' - A plug-in for GIMP allowing automation by the use of Perl scripts. + See also [http://search.cpan.org/dist/Gimp/ Distribution and technical documentation], [https://git.gnome.org/browse/gimp-perl Git repository]. + +* ''' GIO''' - part of GLib to input and output data. It abstracts from the actual filesystem to access files in a consistent, platform-independent way. +See also [https://developer.gnome.org/gio/ GIO reference manual], GIO porting matrix. + +* ''' GIR ''' - abbreviation for GObject introspection. + +* ''' Git''' - the version control system we use to manage the sources and documentation of babl, GEGL and GIMP since 16.04.2009. [17] It is a decentralized version control system, i.e. every user who has cloned a repository has a whole copy of it. This makes it easy to recover the repository if one server dies. [16] On the other hand you don't have to worry if you crashed your local repository - the chances to recover a working copy from the servers of the GNOME project or another GNOME developer are quite high. Many of us control Git by its [https://www.kernel.org/pub/software/scm/git/docs/git.html CLI commands] and [https://www.kernel.org/pub/software/scm/git/docs/gitk.html gitk], but there are also comfortable [http://git-scm.com/downloads/guis GUI clients] for it. If you have questions regarding Git usage, don't hesitate to ask - you wouldn't be the first one ;-) +See also [http://git-scm.com/ Git website], [http://git-scm.com/documentation Git documentation], [[Hacking:Developer_FAQ#GIT|Git in the Developer FAQ]], [https://git.gnome.org/browse/ GNOME's Git repositories]. + +* ''' GLib''' - the low level core library of GNOME. +See also [https://developer.gnome.org/glib/ GLib reference manual]. + +* ''' +* ''' - +: +** a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment. [11] +** The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. [11] +** a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment. [11] +** The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. [11] +* a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment. [11] +* The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. [11] + +* ''' GNOME HIG''' - the Human Interface Guidelines for the GNOME platform. We don't follow this spec to the word but we try to adopt as much of these guidelines as makes sense. Besides them we use our own [http://gui.gimp.org/index.php/Specifications specifications]. +See also [https://developer.gnome.org/hig-book/stable/ GNOME HIG website]. + +* ''' GNU coding standards''' - A [http://www.gnu.org/prep/standards/ guide] to writing portable, robust and reliable programs. Also defines the [http://www.gnu.org/prep/standards/standards.html#Formatting GNU coding style]. + +* ''' GObject''' - a library of GTK+ to enable object-oriented programming in C. +See also [https://developer.gnome.org/gobject/stable/ GObject reference manual]. + +* ''' GObject introspection''' - the implementation of object introspection in GLib. GEGL uses it to expose its interface to other programming languages ( Perl, Python, Javascript, Vala etc.) It is planned that GIMP will do the same. +See the [https://wiki.gnome.org/Projects/GObjectIntrospection detailed description of GObject introspection]. + +* ''' GP''' - abbreviation of GIMP-Perl. + +* ''' GPU computing''' - a means to utilize the computing power of graphic-cards processors for general purposes. + +* ''' gradation''' - relationship of reproduced lightness values to original lightness values in an imaging process. It is usually expressed as a 'tone curve', which is the Curves tool in GIMP. [1] + +* ''' graph''' - in computer science and mathematics a composition of nodes and edges. In [GEGL] the graph is a DAG. [14] This means, that every operation node is reached once at most, but never two or more times. + +* ''' GSoC''' - Google Summer of Code. Annual mentoring program hosted by Google Inc. to offer and award students to work on open source projects during summer. GIMP has been participating for many years. + See also: [https://developers.google.com/open-source/soc/ GSoC website], GIMP's GSoC participation + +* ''' GTK+''' - GIMP Toolkit, a multi-platform toolkit for creating graphical user interfaces. [19] It evolved out of GIMP and is now the foundation for the GNOME desktop among others. +See also [http://www.gtk.org/ GTK+ website], [http://www.gtk.org/documentation.php GTK+ documentation]. + +* ''' GUI''' - graphical user interface. A form of UI which uses graphical symbolic representations of objects (like icons, buttons, a canvas for drawing) which are manipulated with a pointing device or keyboard. + + +==H== + +* ''' Hackordnung''' - The last section from the file [https://git.gnome.org/browse/gimp/plain/HACKING HACKING] as found in the GIMP source tree explains how the GIMP source code should be formatted. + +* ''' HIG''' - Human Interface Guidelines. Set of visual and interaction guidelines to work with a particular platform. + + +==I== + +* ''' ICC''' - International Color Consortium. An organisation of industry vendors for the purpose of creating, promoting and encouraging the standardization and evolution of an open, vendor-neutral, cross-platform color management system architecture and components. [9] + +* ''' ICC Profiles in X specification''' - a specification for associating ICC color profiles with X screens. GIMP implements this proposed standard since version 2.4. +See also [http://www.burtonini.com/computing/x-icc-profiles-spec-latest.html detailed ICC Profiles in X specification] + +* ''' ICC specification''' - Specifies the profile format defined by the International Color Consortium (ICC). The intent of this format is to provide a cross-platform device profile format that can be used to translate color data between device colorspaces. The ICC specification is approved as international standard ISO 15076-1 +See also [http://www.color.org/icc_specs2.xalter detailed ICC specification]. + +* ''' ICCCM''' - Inter-Client Communication Conventions Manual. This spec defines the interaction between X11 clients. In particular it talks about selections, cut buffers, window and session management, manipulation of shared resources and device color characterization. +See also [http://tronche.com/gui/x/icccm/ ICCCM specification]. + +* ''' IDE''' - Integrated Development Environment. An integrated set of development tools, such as code editor, compiler, linker, debugger, documenter, testing tools, version control and deployment aid. Examples are [http://www.anjuta.org/ Anjuta], [http://www.codeblocks.org/ Code::Blocks], [http://www.eclipse.org/ Eclipse], [https://www.gnu.org/software/emacs/ Emacs], [http://kdevelop.org/ KDevelop] and [http://www.netbeans.org/ Netbeans]. We GIMP developers don't make rules about the development environment. Some of us use Emacs, Eclipse or Netbeans while others prefer simple editors ([http://www.geany.org/ Geany], [https://wiki.gnome.org/Apps/Gedit GEdit], Vi) and command line tools instead of an IDE. + +* ''' illuminance''' - measurement of the amount of light coming from a light source. Illuminance is measured in footcandles or Lux. [1] + +* ''' +* ''' - +: +** a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like D50 and D65. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. [1] +** [coll.] any kind of light falling on a body or scene [4]. +** a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like D50 and D65. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. [1] +** [coll.] any kind of light falling on a body or scene [4]. +* a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like D50 and D65. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. [1] +* [coll.] any kind of light falling on a body or scene [4]. + +* ''' ILV''' - International Lighting Vocabulary. A dictionary of the CIE with standard definitions regarding light. [4] + +* ''' image pyramid''' - a set of images with the same content, but pre-rendered in different sizes. The aim is to increase the rendering speed while reducing aliasing artifacts and assuring continuity within and between several target images. [15] + +* ''' input pad''' - [GEGL] a pad that consumes image data. It might also be seen as an image parameter to the operation. [14] + +* ''' introspection ''' - a method in object oriented programming techniques to gather information about other classes at runtime. GEGL uses GObject introspection and there are plans for GIMP to do the same. + +* ''' +* ''' - +: +** the International Organization for Standardization. An international association to develop and publish standards. [12] +** [photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. +** the International Organization for Standardization. An international association to develop and publish standards. [12] +** [photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. +* the International Organization for Standardization. An international association to develop and publish standards. [12] +* [photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. + + +==J== + +* ''' Jenkins''' - GIMP's Continuous Integration server. The product Jenkins is open source and a widely used Continuous Integration server. +See also: [https://gimptest.flamingtext.com:9090/ GIMP Jenkins website], [http://jenkins-ci.org/ Jenkins project website]. + +* ''' JNG''' - JPEG network graphics format. A bitmap image file format. GIMP doesn't use this format yet but it would be nice to extend the MNG plug-in to use it and to add a dedicated JNG plug-in. +See also [http://www.libpng.org/pub/mng/spec/jng.html specification]. + +* ''' +* ''' - +: +** Joint Photographic Experts Group. A lossy compression method standardised by the ISO. [8] +** An image file format and its filename extension, see JPEG JFIF +** Joint Photographic Experts Group. A lossy compression method standardised by the ISO. [8] +** An image file format and its filename extension, see JPEG JFIF +* Joint Photographic Experts Group. A lossy compression method standardised by the ISO. [8] +* An image file format and its filename extension, see JPEG JFIF + +* ''' JPEG JFIF''' - an image file format (usually referred to as JPEG) for the transport of single JPEG-compressed images. It has three color channels (Red, Green, Blue) with a bit depth of 8 bit each. JPEG JFIF doesn't support transparency. It's most often used for photographs. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/file-jpeg JPEG plug-in] handles this format. + +* ''' JPG''' - filename extension for JPEG JFIF images. + + +==K== + +* ''' +* ''' - +: +** Kelvin. Unit of color temperature . +** Key-color component of the CMYK color model to represent various shades of brightness . Usually black. +** Kelvin. Unit of color temperature . +** Key-color component of the CMYK color model to represent various shades of brightness . Usually black. +* Kelvin. Unit of color temperature . +* Key-color component of the CMYK color model to represent various shades of brightness . Usually black. + + +==L== + +* ''' L (uppercase)''' - The axis in the CIELAB color model which denotes the lightness component of the color. A low numerical value on this axis denotes a dark color and a high value a light color. + +* ''' L*a*b*''' - synonym for CIELAB + +* ''' Lab''' - synonym for CIELAB + +* ''' LCMS''' - Little Color Management System. LCMS is an open-source color management engine with focus on small footprint, accuracy and performance. It uses the ICC specification. +See also [http://www.littlecms.com/ the LCMS website]. + +* ''' LGM''' - Libre Graphics Meeting. Annual conference of developers and users of graphics open source software. GIMP has been participating for many years. +See also the [http://libregraphicsmeeting.org/ LGM website] + +* ''' LGW''' - Libre Graphics World. LGW is an online magazine for creatives using free applications for digital painting, graphic and web design, desktop publishing, photography and CAD. Its focus are news, tutorials and articles to provide most up to date information about evolution of these applications and best practices. One of LGW's authors is [http://prokoudine.info/ Alexandre Prokoudine] (prokoudine at IRC) +See also [http://libregraphicsworld.org/ LGW website]. + +* ''' light, linear''' - light as it is in nature and captured by camera sensors (and thus is encoded in RAW images). + +* ''' light, perceived''' - light as it is processed by eye and brain. The difference between linear and perceived light is that human eyes react to the same change of (linear) light with different sensitivity in dark or light environments. Perceived light is the basis of color (e.g. color is the result of light, processed by eyes and brain). + +* ''' lightness''' - [COL] a number that corresponds to the human perception of reflected light from a surface (e.g. the brightness of a color relative to the brightness of a similar illuminated white area) [1] [4]. + +* ''' link, dynamically''' - the process of creating a library that is not part of the program binary, but a separate file that is loaded at runtime. This makes it easy to reuse the same library for many programs. On the other hand, many versions of the same dynamic library can lead to usage of the wrong library version at runtime (the so-called DLL hell). Dynamically loaded libraries have the file extension .dll on Windows, .so on Linux and .dylib on OS X. +See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +* ''' link, statically''' - the process of creating a library that is included in the program binary and as such loaded at the same time with the program. Statically loaded libraries have the extension .lib on Windows, .a on Linux and OS X (until they get linked into the program). +See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +* ''' linker''' - a program to assemble single binary artifacts (so called 'object files') to a bigger piece of software (e.g. the program or a library). + +* ''' LLVM''' - Low Level Virtual Machine. A collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines [6]. You can get it for Linux, Windows and FreeBSD 9 from the [http://llvm.org/releases/download.html LLVM download page]. On OS X LLVM is part of XCode 4.2 and later. LLVM's Clang is also the default C compiler in FreeBSD 10. + +* ''' LMS''' - a color space model that describes colors in terms of the sensitivities of the three types of cone cells in the human eye, which have overlapping sensitivities to Long, Medium, and Short wavelengths of light. When chromatically adapting a color from one light source to another to maintain color constancy, the color is converted from XYZ to LMS using a chromatic adaptation model such as the Bradford transform. + +* ''' lpi ''' - lines per inch. measure of resolution or fineness of photo-mechanical reproduction. [2] + +* ''' luma''' - the weighted sum of R', G' and B' color component (=in perceived light). It is often confused with luminance which actually refers to linear light. [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] + +* ''' +* ''' - +: +** the weighted sum of R, G and B color component (=in linear light) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +** [COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) [1]. +** the weighted sum of R, G and B color component (=in linear light) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +** [COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) [1]. +* the weighted sum of R, G and B color component (=in linear light) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +* [COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) [1]. + +* ''' luminance, relative''' - luminance with numerical values normalized to 1...100 (100=reference white), see [http://en.wikipedia.org/wiki/Luminance_%28relative%29 Wikipedia]. + +* ''' LUT''' - Look-Up Table. A key-value-table, which is queried with a key and returns the assigned value. Synonyms are map or dictionary. It's a convenient way to get the results of a time-consuming or stochastic function quickly. The downside is that it potentially uses more memory than a computation. + +* ''' LUT profile''' - a color profile which internally uses a LUT to assign output color values to input color values. LUT profiles have a black and white point. For instance printer profiles are mostly LUT profiles. [22] + + +==M== + +* ''' M (uppercase)''' - Magenta color component of the CMY and CMYK color models. + +* ''' make''' - a programming tool to control the generation of executables and other non-source files of a program from the program's source files. [13] +See also [http://www.gnu.org/software/make/ GNU make website]. + +* ''' Makefile''' - a text file to control make. It contains all the make targets. In GIMP this file is generated from the Makefile.am file by the Autotools. + +* ''' make target''' - a CLI set of commands for make to trigger various actions, e.g. compiling a program from the sources. + +* ''' metadata''' - Information about a file, i.e. author, title, date and time of creation. +See also [http://www.metadataworkinggroup.org/ website of the Metadata Working Group]. + +* ''' meta operation''' - [GEGL] a composite operation, i.e. an operation that consists of other operations. + +* ''' mipmap''' - synonym for image pyramid. + +* ''' Mired''' - former, obsolete unit of reciprocal color temperature . + +* ''' MNG''' - Multiple-image Network Graphics. An image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-mng.c MNG plug-in] handles this format. +See also [http://www.libpng.org/pub/mng/spec/ MNG specification]. + +* ''' module''' - a part of GIMP providing optional functionality, such as input controllers, color selectors and display filters. Each module can be activated and deactivated in GIMP's Module manager; the changes apply at GIMPs next start. Technically a module is tightly integrated with the GIMP core. It is a shared object that runs in the GIMP process. +See also [https://git.gnome.org/browse/gimp/tree/modules GIMP's modules], plug-in. + + +==N== + +* ''' node''' - an element of a graph. In GEGL a node has an associated operation or can be a constructed graph. [14] + + +==O== + +* ''' OpenCL''' - open standard for parallel programming of heterogeneous systems, i.e. using additional CPU processors or GPU computing. OpenCL requires a driver from the manufacturer of the CPU or GPU. GEGL uses OpenCL to improve its own performance. +See also [http://www.khronos.org/opencl/ OpenCL website], GEGL porting matrix. + +* ''' OpenICC''' - a open source software project with two main goals. The first goal is to work out a common set of settings for color savvy applications to share profiles and settings. The second goal is to bring together those developers in areas like printing, display and desktop applications to work together to make color management end to end work for open source applications. [21] +See also: [http://freedesktop.org/wiki/OpenIcc/ website] + +* ''' operation''' - [GEGL]The processing primitive of GEGL, it is where the actual image processing takes place. Operations are plug-ins and provide the actual functionality of GEGL [14] + +* ''' out-of-tree-build''' - synonym for VPATH build + +* ''' output pad''' - [GEGL] a pad where data can be requested, multiple input pads can reference the same output pad. [14] + + +==P== + +* ''' pad''' - [GEGL] The part of a node that exchanges image content. The place where image "pipes" are used to connect the various operations in the composition. [14] +See also input pad, output pad. + +* ''' PCS''' - Profile Connection Space. The reference color space to convert from one ICC profile to another. Its purpose is to exchange color information across various devices. Usual PCS's are LAB and XYZ. The image editing RGB color spaces like sRGB use XYZ. + +* ''' PDB''' - Procedural DataBase. The PDB (Procedural DataBase) is the most important interface to access the image manipulation functions of GIMP. The libgimp library provides some functions to call functions from the PDB or enter new functions into the PDB. +See also [https://git.gnome.org/browse/gimp/tree/app/pdb PDB source code]. + +* ''' Perl''' - a programming language. Perl programs are interpreted. The filename extension is .pl. GIMP itself uses it to generate PDB interfaces from plug-ins, see the Perl files in [https://git.gnome.org/browse/gimp/tree/plug-ins/common /plug-ins/common] and [https://git.gnome.org/browse/gimp/tree/tools/pdbgen /tools/pdbgen]. Aside from that there's GIMP-Perl, which is a separate GIMP plug-in. +See also [http://www.perl.org/ Perl website]. + +* ''' plug-in''' - an optional part of GEGL and GIMP, providing extra functionality, like filters and file loaders/savers. GIMP plug-ins are programmed in C or Python. Plugins are limited mostly to accessing image data. +:The difference to scripts is not functional, but only technical. In fact, GIMP's Script-Fu interpreter is a plug-in. + +:The difference to modules is that modules tend to be more tightly integrated with the GIMP core, while plug-ins are almost standalone. Modules are shared objects that run in the GIMP process, while plug-ins are separate executables, which are run in a different process. This means that a crashing module will crash GIMP, while a crashing plug-in doesn't cause GIMP to crash. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins GIMP's plug-ins], [http://registry.gimp.org/ GIMP plug-in registry] + +* ''' PNG''' - Portable Network Graphics. A bitmap image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-png.c PNG plug-in] handles this format. GIMP also reads patterns in the PNG file format and it stores thumbnails as PNG images. +See also [http://www.w3.org/TR/PNG/ PNG specification]. + +* ''' ppi''' - points per inch; pixels per inch: Measure of input resolution e.g. of scanning device, measured as the number of points on the object at which a sample or measure is taken or which are resolved by the device per linear inch on a given axis: e.g. 600ppi means six hundred points per inch, usually along the axis of the scanner sensor. [2] Increasing the PPI count increases the image quality up to a certain degree: whether an image is perceived as fine or coarse granular also depends on the sensitivity of the human eye and the distance between eye and image. Image quality also depends on the contrast and the smoothness of the tonal values. +See also dpi, lpi. + +* ''' PS''' - Adobe Photoshop, a widely used, high-end image manipulation application in the commercial sector. Photoshop is available for Windows and OS X computers. Modified variants, such as Photoshop Express and Photoshop Touch, are available for mobile devices. Note that - although GIMP is often seen as Photoshop competitor - GIMP is not a for-free-Photoshop copy [23]. + +* ''' PSB''' - Photoshop Big. Adobe Photoshop's native file format for large documents with up to 300.000 Pixels in any dimension, otherwise identically to PSD. GIMP currently doesn't support PSB. + +* ''' PSD''' - Photoshop Document. Adobe Photoshop's native file format for images with up to 30.000 Pixels in any dimension. GIMP has basic support reading and writing PSD files. Advanced PS features with no equivalent in GIMP such as adjustment layers and layer effects are currently not supported. +See also [https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification]. + +* ''' primary''' - abbreviation for primary color, e.g. one of the colors in a color model of which all other colors are mixed from. In RGB these are Red, Green and Blue while in CMY these are Cyan, Magenta and Yellow. + +* ''' property''' - [GEGL] an attribute that controls the behavior of an operation. Through the use of [https://developer.gnome.org/gobject/unstable/gobject-GParamSpec.html GParamSpecs] properties are self documenting via introspection. [14] + +* ''' Python''' - a programming language. Python programs are usually interpreted. GIMP uses Python for [https://git.gnome.org/browse/gimp/tree/plug-ins/pygimp/plug-ins plug-ins], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/servertest.py the test driver for the Script-Fu server] and [https://git.gnome.org/browse/gimp/tree/tools some tools]. +See also [http://python.org/ Python website]. + + +==Q== + +''' QA''' - Quality Assurance. Actions to ensure quality during production. For software products these include for instance involvement of users and other relevant stakeholders, proper design of interactional and technical architectures, obeying coding standards, reviews and tests. + + + +==R== + +* ''' R (uppercase)''' - Red color channel in the RGB color model. + +* ''' RaGaBaA'''- [babl] a color model with the alpha premultiplied channels R, G, B and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' R'aG'aB'aA'''- [babl] a color model with the alpha premultiplied channels R, G, B and alpha. It operates in perceived light. + +* ''' Recent File Storage Specification''' - Provides a standard mechanism for storing a list of recently used files. Supported since GIMP version 2.1.6. +See also [http://standards.freedesktop.org/recent-file-spec/recent-file-spec-latest.html detailed Recent File Storage specification]. + +* ''' refactoring''' - to improve a small piece of code without neither changing its results nor introducing side effects. +See also: [http://refactoring.com/ Martin Fowlers website on refactoring] + +* ''' repository''' - the database in a version control system that contains all the file history. + +* ''' +* ''' (from +* ) - +: +** For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system. +Units: total number of usable pixels for digital cameras; ppi for scanners; line pairs per millimetre for objectives (not to be confused with lpi!). +** For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output. +Unit: dpi. +** Measure of system's ability to distinguish variations in colors or of density. +Unit: bit depth (total number of bits available for encoding values). +** For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. +** For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system. +Units: total number of usable pixels for digital cameras; ppi for scanners; line pairs per millimetre for objectives (not to be confused with lpi!). +** For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output. +Unit: dpi. +** Measure of system's ability to distinguish variations in colors or of density. +Unit: bit depth (total number of bits available for encoding values). +** For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. +* For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system. +Units: total number of usable pixels for digital cameras; ppi for scanners; line pairs per millimetre for objectives (not to be confused with lpi!). +* For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output. +Unit: dpi. +* Measure of system's ability to distinguish variations in colors or of density. +Unit: bit depth (total number of bits available for encoding values). +* For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. + +* ''' RGB''' - generally and in babl a color model with the channels R, G, B. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' R'G'B'''' - [babl] a color model with the channels R, G, B. It operates in perceived light with an sRGB TRC which is roughly perceptually uniform. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' RGBA''' - generally and in babl a color model with the channels R, G, B and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/babl-core.c source code] + +* ''' R'G'B'A''' - [babl] a color model with the channels R, G, B and alpha. It operates in perceived light with an sRGB TRC which is roughly perceptually uniform. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' ROI''' - [GEGL] - region of interest. It's the area you're currently working on in your GEGL operation. + + +==S== + +* ''' saturation''' - colorfulness of an area judged in proportion to its brightness [4] +See also: chroma + +* ''' Scheme ''' - a programming language. The current standard version is R6RS, while the TinyScheme, the version in GIMP implements a subset of the older version R5RS. The coming standard R7RS is [http://scheme-reports.org/ work in progress]. +See also [http://people.csail.mit.edu/jaffer/r5rs_toc.html Scheme R5RS language description]. + +* ''' scRGB ''' - an extended RGB color space. In GEGL most operations work in scRGB using 32bit floating point/HDR linear light RGBA. [18] +See also [http://webstore.iec.ch/webstore/webstore.nsf/artnum/029678 scRGB specification (charged)], [http://www.color.org/chardata/rgb/scrgb.xalter short overview at ICC], [http://en.wikipedia.org/wiki/ScRGB_color_space Wikipedia:scRGB]. + +* ''' script''' - a little program in Script-Fu. Scripts add optional extra functionality to GIMP. They have the filename extension .scm. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's scripts], distinction to plug-ins, [http://registry.gimp.org/ GIMP plug-in registry]. + +* ''' Script-Fu''' - a Scheme dialect. Developers can use Script-Fu for writing user-defined extensions. GIMP then interprets them using TinyScheme and FTX. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's Script-Fu scripts], [http://www.gimp.org/docs/scheme_plugin/ Script-Fu tutorial]. + +* ''' Shared MIME Database''' - The shared MIME database contains common MIME types, descriptions, and rules for determining the types of files. GIMP file plug-ins should use the MIME types and descriptions defined here. +See also [http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html Shared MIME Database specification]. + +* ''' sRGB''' - the default color space for the internet and other interested vendors. +See also [http://www.w3.org/Graphics/Color/sRGB detailed description at W3C]. + +* ''' Startup Notification''' - Specifies a mechanism allowing a desktop environment to track application startup to provide user feedback. GTK+ provides support for this protocol. +See also [http://standards.freedesktop.org/startup-notification-spec/startup-notification-latest.txt Startup Notification specification]. + +* ''' Subversion''' - a version control system the GNOME project used before it was superseded with Git in 2009. + +* ''' SVG 1.1''' - Scalable Vector Graphics. A vector graphics format. GIMP uses it to import vector graphics, import and export paths and load gradients from SVG files. In GIMP the SVG plug-in handles this format. To create standards conform SVG graphics with free, open source software you can use [http://www.inkscape.org/ Inkscape] for instance. +See also [http://www.w3.org/TR/SVG/ W3C recommendation] + +* ''' SVN''' - abbreviation for Subversion. + + +==T== + +* ''' Thumbnail Managing Standard''' - Deals with the permanent storage of previews for file content. In particular, it tries to define a general and widely accepted standard for this task. GIMP implements this standard and dropped support for the old-fashioned .xvpics. +See also [http://web.archive.org/ Thumbnail Managing Standard specification]. + +* ''' TIFF 6.0''' - Tagged Image File Format. + See also [http://partners.adobe.com/public/developer/tiff/ TIFF specification and other developer resources], [http://www.awaresystems.be/imaging/tiff.html Unofficial TIFF home page]. + +* ''' tile''' - [GEGL] Functionally a rectangular part of an operation's input, intermediate or output data. Technically tiles are internal implementation parts of GEGL buffers, i.e. not exposed in the GEGL buffer APIs. [14] + +* ''' tile backend''' - [GEGL] the implementation of pixel storage for a GeglBuffer (synonymous to a file system driver in an operating system). There are backends storing each tile as separate files, all tiles of a buffer in a file, communicate over gimps wire-protocol for plug-ins to operate on GeglBuffers where the tiles are stored in the main GIMP process. Other possible tile backends could communicate over the network to fetch spatial tiles from map providers (OpenStreetMap etc.) + +* ''' TinyScheme''' - a lightweight Scheme interpreter that implements a subset of the [http://people.csail.mit.edu/jaffer/r5rs_toc.html R5RS Scheme standard]. GIMP uses it to interpret Script-Fu. One of its maintainers is Kevin Cozens (kevin in IRC) +See also [http://tinyscheme.sourceforge.net/home.html TinyScheme website], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/tinyscheme TinyScheme in GIMP]. + +* ''' TRC''' - Tone Response Curve. A curve describing the signal response of the eye or an sensor to changes in linear light and as such the foundation for perceived light. + + +==U== + +* ''' UI''' - user interface. The part of the program the user interacts with. +See also: CLI, GUI. + + +==V== + +* ''' +* ''' - +: +** Level of brightness of a pixel or color as defined in HSV color model. [2] +** Designation of lightness of color in the Munsell system of color nomenclature. [2] +** Tone or brightness of a color as assessed subjectively: high values give light colors, low value colors appear dark. [2] +** [photo] in the Zone System the step or zone which corresponds to a certain range of subject brightness. [2] +** [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, luminance and film speed. [2] +** Level of brightness of a pixel or color as defined in HSV color model. [2] +** Designation of lightness of color in the Munsell system of color nomenclature. [2] +** Tone or brightness of a color as assessed subjectively: high values give light colors, low value colors appear dark. [2] +** [photo] in the Zone System the step or zone which corresponds to a certain range of subject brightness. [2] +** [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, luminance and film speed. [2] +* Level of brightness of a pixel or color as defined in HSV color model. [2] +* Designation of lightness of color in the Munsell system of color nomenclature. [2] +* Tone or brightness of a color as assessed subjectively: high values give light colors, low value colors appear dark. [2] +* [photo] in the Zone System the step or zone which corresponds to a certain range of subject brightness. [2] +* [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, luminance and film speed. [2] + +* ''' VCS''' - abbreviation of Version Control System. + +* ''' Version Control System''' - a software system that records all changes to arbitrary files and file sets over time. It's allows you to recall specific versions later, compare versions, review changes made over time, find out who last modified something or which change introduced a bug, revert changes etc. [16] We use Git for managing the babl, GEGL and GIMP source code and documentation. + +* ''' VPATH build''' - an Autotools build outside the source directory. Example: given the sources are in $HOME/src, then the compiled files could for instance be in $HOME/build. + See also [http://www.gnu.org/software/automake/manual/html_node/VPATH-Builds.html VPATH Builds in the Automake documentation] + + +==W== + +* ''' W3C''' - World Wide Web Consortium. The W3C is an international community where member organizations, a full-time staff, and the public work together to develop web standards, such as SVG 1.1, XML and XSL. [10] + +* ''' wgo''' - GIMP's main website [http://www.gimp.org/ www.gimp.org]. + +* ''' +* ''' - +: +** The nick name of the IRC chatbot. +See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +** GIMP's mascot. +** The nick name of the IRC chatbot. +See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +** GIMP's mascot. +* The nick name of the IRC chatbot. +See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +* GIMP's mascot. +:[[File:Wilber.png|Wilber, the GIMP mascot]] + +* ''' white point''' - the light-source's or sensor's interpretation of white. Practically it's a synonym for color temperature. +See also [http://eilv.cie.co.at/term/1430 CIE's definition], [http://www.colorwiki.com/wiki/White_Point ColorWiki]. + + +==X== + +* ''' +* ''' - eXperimental Computing Facility, the origin of GIMP. +: +** GIMP's file format. +See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +** Cinepaint's derivative of GIMP's XCF file format. Both are incompatible. [20] +See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] +** GIMP's file format. +See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +** Cinepaint's derivative of GIMP's XCF file format. Both are incompatible. [20] +See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] +* GIMP's file format. +See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +* Cinepaint's derivative of GIMP's XCF file format. Both are incompatible. [20] +See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] + +* ''' XDND''' - Drag-and-Drop Protocol for the X Window System. XDND defines a standard for drag and drop on X11. It is implemented by GTK+. +See also [http://freedesktop.org/Standards/XDND XDND specification]. + +* ''' XDS''' - Direct Save Protocol for the X Window System. XDS defines an extension to XDND that allow users to save a file by simply dragging it to a file manager window. GIMP supports this protocol since version 2.4. +See also [http://web.archive.org/ XDS specification]. + +* ''' XML''' - Extensible Markup Language. Describes the markup language used to store the [https://git.gnome.org/browse/gimp/tree/menus menu layout], the [https://git.gnome.org/browse/gimp/tree/data/tips/gimp-tips.xml.in startup tips], Docbook documents and other. +See also [http://www.w3.org/XML/ XML overview page at W3C], written by Liam Quin (Ankh in IRC) + +* ''' XMP''' - Extensible Metadata Platform. A labeling technology that allows to store metadata. This information is either embedded in the file itself or as separate file (a so-called XMP sidecar file). +See also [http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf XMP specification], [http://www.adobe.com/products/xmp/index.html XMP description at Adobe] + +* ''' XSETTINGS''' - The XSETTINGS protocol provides a mechanism for applications written with different toolkits to share simple configuration settings such as double-click-times and background colors. GTK+ hides this from us. +See also [http://standards.freedesktop.org/xsettings-spec/xsettings-spec-0.5.html XSETTINGS specification]. + +* ''' XSL''' - Extensible Stylesheet Language Family. XSL is a family of recommendations for defining XML document transformation and presentation. It consists of the parts XSLT, XML Path Language (XPath) and XSL Formatting Objects (XSL-FO). +See also: [http://www.w3.org/Style/XSL/ XSL website at W3C]. + +* ''' XSLT''' - XSL Transformations, a language for transforming XML documents into other formats, such as HTML, program code or plain text. GIMP uses XSLT to generate [https://git.gnome.org/browse/gimp/tree/menus/menus.xsl menus], [https://git.gnome.org/browse/gimp/tree/data/tips/fortunes.xsl startup tips] and [https://git.gnome.org/browse/gimp/tree/authors.xsl author attribution]. +See also [http://www.w3.org/TR/xslt W3C recommendation]. + +* ''' XYZ''' - color model, based on experimental observations on humans (the ' CIE standard observer'). It operates in linear light. + + +==Y== + +* ''' +* ''' - +: +** Yellow color component of the CMY and CMYK color models. +** [babl]: grayscale color model or lightness component in a color model. It's in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +** relative luminance in XYZ color model. +** luminance in xyY color model. +** Yellow color component of the CMY and CMYK color models. +** [babl]: grayscale color model or lightness component in a color model. It's in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +** relative luminance in XYZ color model. +** luminance in xyY color model. +* Yellow color component of the CMY and CMYK color models. +* [babl]: grayscale color model or lightness component in a color model. It's in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +* relative luminance in XYZ color model. +* luminance in xyY color model. + +* ''' Y' (uppercase)''' - *:* [babl]: grayscale color model or lightness component in a color model. It's in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' YA''' - [babl] a color model with the components Y and A, e.g. grayscale and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' YaA''' - [babl] a color model with the components alpha-premultiplied Y and A, e.g. grayscale and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' Y'A''' - [babl] a color model with the components Y' and A, e.g. grayscale and alpha. It operates in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' Y'aA''' - [babl] a color model with the components alpha-premultiplied Y' and A, e.g. grayscale and alpha. It operates in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' YCbCr''' - a color model with the components Y (luminance), Cb and Cr. Unlike RGB it encodes the image information in luminance (channel Y) and chrominance (channels Cb and Cr). YCbCr operates in linear light. It is used for digital video and has good image compression capabilities. + +* ''' +* ''' - +: +** a color model with the components Y' (luma), Cb and Cr. It operates in perceived light. It is used for digital video and has good image compression capabilities. +** [babl] implementation of the Y'CbCr color model. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] +** a color model with the components Y' (luma), Cb and Cr. It operates in perceived light. It is used for digital video and has good image compression capabilities. +** [babl] implementation of the Y'CbCr color model. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] +* a color model with the components Y' (luma), Cb and Cr. It operates in perceived light. It is used for digital video and has good image compression capabilities. +* [babl] implementation of the Y'CbCr color model. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +* ''' Y'CbCrA''' - [babl] color model with the components Y' (luma), Cb, Cr and A. It operates in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +* ''' YCC''' - abbreviation of YCbCr. + +* ''' YIQ''' - color model which separates luminance (Y component) from chroma (I, Q components). It is used for analog TV (NTSC in the U.S.) and thus irrelevant for digital image editing. + +* ''' YPbPr''' - the analog equivalent to YCbCr and thus irrelevant for digital image editing. + +* ''' YUV''' - color model which separates luminance (Y component) from chroma (U, V components). It is used for analog TV (PAL in Europe) and thus irrelevant for digital image editing. + + +==Z== + + +==References== + +# [http://www.colorwiki.com/wiki/Category:Glossary CHROMiX ColorWiki] +# [http://www.idigitalphoto.com/dictionary/ idigitalphoto Photography Dictionary] +# [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia:HSL and HSV] +# CIE: [http://eilv.cie.co.at/ e-ILV: International Lighting Vocabulary] +# Michael Larabel: [http://www.phoronix.com/scan.php?page=news_item&px=MTEwMjI FreeBSD 10 To Use Clang Compiler, Deprecate GCC] +# [http://www.llvm.org/ LLVM website] +# Clang Team: [http://clang.llvm.org/docs/CrossCompilation.html Cross-compilation using Clang] +# W3C, Chris Lilley: [http://www.w3.org/Graphics/JPEG/ JPEG JFIF] +# ICC: [http://www.color.org/abouticc.xalter About ICC] +# [http://wwww.w3.org/ W3C website] +# [http://www.gnome.org/ GNOME website] +# [http://www.iso.org/ ISO website] +# [http://www.gnu.org/software/make/ GNU Make website] +# [http://gegl.org/#_glossary GEGL glossary] +# Lance, Williams: [http://staff.cs.psu.ac.th/iew/cs344-481/p1-williams.pdf Pyramidal parametrics], Computer Graphics 7.3 (1983): 1-11. +# Scott Chacon: [http://git-scm.com/book/en/Getting-Started-About-Version-Control Getting Started About Version Control], licensed under [http://creativecommons.org/licenses/by-nc-sa/3.0/ CC BY-NC-SA 3.0] +# Lucas Rocha, [https://mail.gnome.org/archives/devel-announce-list/2009-March/msg00005.html Announcement at GNOME's devel-announce-list], 19.03.2009 +# [http://www.gegl.org/ GEGL website] +# [http://www.gtk.org/ GTK+ website] +# [http://www.linuxdevcenter.com/pub/a/linux/2004/04/29/cinepaint.html?page=2 Linux Devcenter: Developer interview: Robin Rowe and Andrew Prock on Cinepaint] +# [http://freedesktop.org/wiki/OpenIcc/ OpenICC website] +# Stone, Elle: [http://ninedegreesbelow.com/photography/xyz-rgb.html Completely Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs ] +# The GIMP team: [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision Produkt vision] + + +==Trademarks== + +Adobe, Photoshop, Photoshop Express and Photoshop Touch are either trademarks or registered trademarks of Adobe Systems Incorporated in the United States and/or other countries. Apple and OS X are trademarks of Apple Computer, Inc. registered in the United States and other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. All other products are the property of their respective owners. + + diff --git a/wiki/Glossary-20170710195736-show.txt b/wiki/Glossary-20170710195736-show.txt new file mode 100644 index 0000000..2ff1f9e --- /dev/null +++ b/wiki/Glossary-20170710195736-show.txt @@ -0,0 +1,890 @@ + + +This glossary contains definitions important for the GIMP development. These include functional definitions i.e. from computer graphics and color theory, photography, terms from babl and GEGL etc. + + + +[https://bugzilla.gnome.org/enter_bug.cgi?product=gimp-web&component=wiki.gimp.org Report a bug] + + + + +==Table of Contents== + + Legend + A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + References + Trademarks + + + + +==Legend== + +{| class="wikitable" +|- +| [babl] | specific to babl +|- +| [COL] | colorimetry +|- +| [coll.] | colloquial +|- +| [GEGL] | specific to GEGL +|- +| [GIMP] | specific to GIMP +|- +| [photo] | photography +|} + + + + +==A== + +* ''' a (lowercase)''' - [babl] denotes a color channel to be premultiplied with alpha, for instance RaGaBa is premultiplied alpha RGB + +* ''' a* (lowercase)''' - The axis in the CIELAB color model which denotes the green-magenta component of the color. A negative value on this axis denotes green and a positive value denotes magenta. + +* ''' +* ''' - +: +** The alpha channel in a color model, for instance in RGBA. +** [babl] the alpha value in a color model. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to RGB . The same applies to R'aG'aB'aA, YaA, Y'aA. +** The alpha channel in a color model, for instance in RGBA. +** [babl] the alpha value in a color model. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to RGB . The same applies to R'aG'aB'aA, YaA, Y'aA. +* The alpha channel in a color model, for instance in RGBA. +* [babl] the alpha value in a color model. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to RGB . The same applies to R'aG'aB'aA, YaA, Y'aA. + +* ''' abyss''' - [GEGL] data from outside the input buffer. + +* ''' abyss policy''' - [GEGL] the behaviour rule to handle abyss data: to clamp to the border, loop in the buffer extent, or implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to GEGL_ABYSS_LOOP adds the tileability to the operation for free. + +* ''' alpha''' - opacity. An alpha value of 0 means 'transparent', an alpha value of 100 means 'fully opaque', values in between mean 'partly opaque'. + +* ''' API''' - Application Programmers Interface. The technical interface of a library to external developers who are intended use it. It defines the provided services, their semantic and syntax. On implementation level these are the public data types, enumerators and functions with their signatures. +See also: [http://gegl.org/api.html GEGL API] , [http://gegl.org/#_operation_api GEGL operation API], [http://developer.gimp.org/api/2.0/index.html GIMP API]. + +* ''' ArgyllCMS''' - an open source color management system for profiling input devices (scanner, camera, etc) and calibrating and profiling output devices (printer, monitor, etc), plus a suite of command line utilities for exploring, linking, and converting between ICC profiles. +See also the [http://argyllcms.com/ ArgyllCMS website]. + +* ''' Autohell''' - [coll.] synonym for Autotools, because they are practically hard to figure out. + +* ''' Autotools''' - the GNU build system. They check the current configuration to ensure all dependencies are in place, generate the Makefiles and execute them to do several tasks like compiling, installing and testing a program. +See also the [http://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html#Autotools-Introduction GNU Autotools website]. + + +==B== + +* ''' b* (lowercase)''' - the axis in the CIELAB color model which denotes the blue-yellow component of the color. A negative value on this axis denotes blue and a positive value denotes yellow. + +* ''' +* ''' - +: +** Blue color channel in the RGB color model. +** brightness component of the HSB color model. +** [photo] symbol for brightness: obsolete, but may be found on older light meters. [2] +** [photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. [2] +** Blue color channel in the RGB color model. +** brightness component of the HSB color model. +** [photo] symbol for brightness: obsolete, but may be found on older light meters. [2] +** [photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. [2] +* Blue color channel in the RGB color model. +* brightness component of the HSB color model. +* [photo] symbol for brightness: obsolete, but may be found on older light meters. [2] +* [photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. [2] + +* ''' babl''' - a dynamic, any to any, pixel format translation library. +See also: [http://www.gegl.org/babl babl website] + +* ''' backend''' - generally the internal part of a library that implements its public API. In GEGL this could for instance be computing an operation, storing tiles and memory management. + +* ''' black point''' - the light-source's (e.g. a monitor) or sensor's interpretation of black. + +* ''' Bradford transform''' - a matrix used to convert XYZ colors to the LMS color space when chromatically adapting a color in order to maintain constant color appearance under different light sources. The Bradford transform is recommended by the ICC and used by ArgyllCMS and LCMS when making ICC D50-adapted RGB profiles from color spaces such as the sRGB D65 color space. + +* ''' brightness''' - attribute of a visual perception according to which an area or color appears to emit, or reflect, more or less light. This correlates directly with the amplitude of the lightwave. [1] [4] + +* ''' bug''' - an error in a program, e.g. an existing feature doesn't work as specified or usually expected. Requests for new features are not bugs, but enhancement requests. + +* ''' bugtracker''' - a software system for gathering, managing and keeping track of bugs and enhancement requests. We use Bugzilla for bugtracking. + +* ''' Bugzilla''' - the GIMP project uses [https://bugzilla.gnome.org/ Bugzilla] of the GNOME project, a bugtracker that allows us to coordinate bug reports. Bugzilla is also used for enhancement requests and the preferred way to submit patches for GIMP is to open a bug report and attach the patch to it. +See also: [http://www.bugzilla.org/ Bugzilla website], [http://www.gimp.org/bugs/ Reporting bugs in GIMP]. + +* ''' +* ''' - +: +** (verb) - the process of compiling and linking a software from its sourcecode. +** (noun) - the result of the build process, i.e. a binary or archive, distributable file. +** (verb) - the process of compiling and linking a software from its sourcecode. +** (noun) - the result of the build process, i.e. a binary or archive, distributable file. +* (verb) - the process of compiling and linking a software from its sourcecode. +* (noun) - the result of the build process, i.e. a binary or archive, distributable file. + +* ''' Bz ''' - abbreviation for Bugzilla. + + +==C== + +* ''' +* ''' - +: +** Cyan color component of the CMY and CMYK color models. +** chroma component of the LCH color model. +** the programming language most of GIMP, GEGL and babl is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of GObject. +** Cyan color component of the CMY and CMYK color models. +** chroma component of the LCH color model. +** the programming language most of GIMP, GEGL and babl is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of GObject. +* Cyan color component of the CMY and CMYK color models. +* chroma component of the LCH color model. +* the programming language most of GIMP, GEGL and babl is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of GObject. + +* ''' Cb''' - the Blue component of YCbCr chroma. + +* ''' chroma''' - Colorfulness of an area judged as a proportion of the brightness of a similarly illuminated area that appears white or highly transmitting. [1] [4] +See also saturation. + +* ''' +* ''' - +: +** (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the color temperature of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +** (mathematically) - the process of using a chromatic adaptation model to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, Bradford, and Sharp. +** (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the color temperature of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +** (mathematically) - the process of using a chromatic adaptation model to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, Bradford, and Sharp. +* (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the color temperature of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +* (mathematically) - the process of using a chromatic adaptation model to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, Bradford, and Sharp. + +* ''' chromatic adaptation model''' - a mathematical transform from the XYZ color space to the LMS color space. A chromatic adaptation model is used to calculate the equivalent XYZ colors required to maintain constant color appearance under different light sources. + +* ''' chromaticity''' - The color properties of a sample judged independently of luminance, i.e. in terms of hue and saturation only. [1] + +* ''' CI''' - abbreviation for Continuous Integration. + +* ''' CIE''' - Commission Internationale de l'Eclairage (International Commission on Illumination). Independent, non-profit organization for recommendations on photometry and colorimetry. Its aim is to exchange information on all matters relating to the science and art of light and lighting, color and vision, photobiology and image technology worldwide. It is recognized by ISO as an international standardization body. The CIE has defined several color spaces that describe the range of visible colors in unambiguous numerical terms. [1] [4] + +* ''' CIE 1976 L*a*b*''' - synonym of CIELAB + +* ''' CIE Lab''' - [babl] implementation of CIELAB. + +* ''' CIE Lab alpha''' - [babl] implementation of CIELAB with an alpha channel (A). + +* ''' CIEL*a*b*''' - synonym of CIELAB + +* ''' CIELAB''' - a device independent color model defined by CIE in 1976. It describes colors as points on the three axes L, a, b. It is also said to be the reference color model in Adobe Photoshop (but not GIMP), e.g. internal computations from one color space to another are done there via CIELAB. +See also [http://eilv.cie.co.at/term/157 CIELAB's formal definition] by the CIE. + +* ''' Clang''' - the C compiler of the LLVM project. Clang is able to cross-compile code, i.e. build GIMP for Windows on a Linux machine [7]. + +* ''' CLI''' - command line interface. A form of UI where the user interacts with the program by entering textual commands. This can e.g. be the set of commandline arguments that are passed to the the program on startup, or a commandline in the GUI to enter textual commands. You can get the set of GIMP's commandline arguments by entering '''gimp --help''' at the systems shell. + +* ''' Clipboard Manager''' - The Clipboard Manager specification describes how applications can actively store the contents of the clipboard when the application is quit. This requires that a compliant clipboard manager is running. Standard specific to the X window system. +See also [http://www.freedesktop.org/wiki/ClipboardManager Clipboard Manager specification]. + +* ''' Clipboards''' - Explanation of the consensus of the Qt and GTK+ developers on how the X clipboard works. Standard specific to the X window system. +See also [http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt informal Clipboards specification]. + +* ''' CMY''' - color model with the three primary colors Cyan, Magent and Yellow. The three "subtractive" primary colors used as the basis of all dye or pigment-based printing systems and color photography. A full range of colors including neutral grays and blacks can be produced with good cyan, yellow and magenta colorants (e.g. color film dyes) but typical printing inks are less than perfect. [1] + +* ''' +* ''' - +: +** color model with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to CMY to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with CMY alone. [1] +** [babl] implementation of the CMYK color model. GEGL treats rendering CMYK as problem subset of rendering spot colors. +** pronouncation: C.M.Y.K., not schmuck nor smug +** color model with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to CMY to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with CMY alone. [1] +** [babl] implementation of the CMYK color model. GEGL treats rendering CMYK as problem subset of rendering spot colors. +** pronouncation: C.M.Y.K., not schmuck nor smug +* color model with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to CMY to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with CMY alone. [1] +* [babl] implementation of the CMYK color model. GEGL treats rendering CMYK as problem subset of rendering spot colors. +* pronouncation: C.M.Y.K., not schmuck nor smug + +* ''' color management''' - an approach to ensure that colors look the same (or at least most similar) across various devices in a workflow. For instance it ensures that photos taken from a camera look the same at the editors screen and the printer output. If you have questions on color management, then Øyvind Kolås (IRC nick: pippin) or Elle Stone (IRC nick: elle) are the best persons to ask in the project. + +* ''' color model''' - a mathematical model to describe colors and handle them formally, such as points in a coordinate system. This is the more theoretically abstract background of color computation. Practically this term is often used synonymously to color space. +Examples are CIELAB , RGB and XYZ . + +* ''' color space''' - a geometric representation of color in space, usually of 3 dimensions [4]. While color models are the theoretical background color spaces describe the set of visible or reproducable colors [2]. Practically this term is often used synonymously to color model. To get a visual notion of various color spaces and their relationships see [http://www.brucelindbloom.com/WorkingSpaceInfo.html#Viewer Bruce Lindblooms 3D Gamut Viewer] demo. +Examples are AdobeRGB, sRGB and Wide Gamut RGB. +To assign a numerical vector to a real color you need both a color model and a color space. As an example the numbers (0,1,0) are given. In XYZ color model with sRGB color space they represent a pure green. In XYZ color model with AdobeRGB color space you get a pure, but more saturated green. In HSB color model+sRGB color space these numbers represent a pure black. + +* ''' color temperature''' - formally the temperature of an ideal black body radiator whose radiation has the same chromaticity as that of a given stimulus. [4] Practically it's a synonym for white point [1]. Not to be confused with the artistic classification into warm colors (i.e. yellow, orange) and cold colors (i.e. blue). +Unit: K (Kelvin). + +* ''' compiler''' - a program to translate code in a programming language into executable machine code, i.e. gcc or Clang. In GIMP there's no recommended default C compiler. Instead the platform default will be used automatically. + +* ''' connection''' - [GEGL] A link/pipe routing image flow between operations within the graph goes from an output pad to an input pad, in graph glossary this might also be referred to as an edge. [14] + +* ''' Continuous Integration''' - a method to regularly fetch the source code from the version control system, build and test the software. Developers get almost immediate feedback whether their software builds and works well. By doing this on a regular basis bugs can be detected and fixed much earlier than if testing was the last step before the release or after release on the user's side. This increases the software quality. Modern continuous integration systems use a client-server architecture: a server does all the continuous integration jobs and users access it via a web browser (=the client). GIMP uses Jenkins as continuous integration server. + +* ''' Cr''' - the Red component of YCbCr chroma. + +* ''' CVS''' - a version control system the GNOME project had used a long time ago, before it was superseded with Subversion. Now we're using Git. + + +==D== + +* ''' D-Bus ''' - Desktop Message Bus. If available, GIMP uses it to detect if another GIMP instance is already running. In the future, GIMP might make even more use of D-Bus. +See also [http://dbus.freedesktop.org/doc/dbus-specification.html D-Bus specification], [https://git.gnome.org/browse/gimp/tree/app/gui/dbus-service.xml GIMP's D-Bus service's interface descriptor], [http://raphael.slinckx.net/blog/documents/dbus-tutorial D-Bus tutorial]. + +* ''' D50''' - a CIE standard illuminant with the spectral power distribution of daylight (which has a color temperature of 5003 Kelvin). It is chosen for the special needs of the paper printing industry and thus the preferred reference white for evaluating prints on paper. Compared to D65 it's a bit more yellowish. + +* ''' D65''' - a CIE standard illuminant with the spectral power distribution of noon mid-latitude daylight (which has a color temperature of 6504 Kelvin). It's the white balance standard used for sRGB color space and to calibrate display screens. Compared to D50 it's a bit more bluish. + +* ''' DAG''' - Directed Acyclic Graph. In computer science and mathematics a graph with directed edges and the attribute, that every node is reached never or only once on any path. For instance trees (as data structure) are DAGs. + +* ''' deprecated''' - a term from software development. Code marked as '''deprecated''' is outdated or obsolete. It and the code using it need to be replaced by refactored code soon. Deprecated code often occurs as result of API changes. +Example: The code contains two functions '''do_this''' and '''do_that'''. Function '''do_that''' calls '''do_this'''. Function '''do_this''' is marked as deprecated. It soon needs to be replaced by a newer function '''do_this_better''' and '''do_that''' needs to call '''do_this_better''' instead. + +* ''' Desktop Entry Specification''' - This document describes desktop entries: files describing information about an application such as the name, icon, and description. GIMP installs such a [https://git.gnome.org/browse/gimp/plain/desktop/gimp.desktop.in.in .desktop file]. +See also the [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html detailed Desktop Entry specification]. + +* ''' DND''' - Drag and Drop. + +* ''' DNG''' - Digital Negative. An image file format aiming to become a device-independent standard for storing raw data from digital cameras. +See also [http://www.adobe.com/products/dng/pdfs/dng_spec.pdf DNG specification]. + +* ''' DOAP''' - DOAP is an XML schema for describing software projects. The GNOME project uses it for instance to show a short project's description at the [https://git.gnome.org/browse/ project index]. +See also [https://github.com/edumbill/doap/ DOAP website], [https://git.gnome.org/browse/gimp/tree/gimp.doap GIMP's DOAP file]. + +* ''' Docbook''' - DocBook is a general purpose XML schema particularly well suited to books and papers. In GIMP it is used for the [https://git.gnome.org/browse/gimp-help-2/tree/ user documentation] and [https://git.gnome.org/browse/gimp/tree/devel-docs/structure.xml structure of the technical documentation]. +See also the [http://www.docbook.org/specs/ Docbook specifications]. + +* ''' dpi ''' - dots per inch. Measure of resolution of a device as density or frequency of points or dots which can be addressed or referred to by the device. [2] It is often confused with lpi and ppi. DPI refers to the amount of ink dots in printing. Each of these dots has a certain primary, for instance a CMYK color. Pixels of secondary colors are created by plotting many of these dots side-by-side. Thus a high DPI count isn't the same as a high PPI count. Because of technological progress in ink printing this measure is of decreasing importance. + +* ''' dynamic range''' - Measure of spread from the highest to lowest energy levels that can be captured by an imaging or recording or reproduced by a play-back device. E.g. a top-class scanning camera back can capture a range of 11 f/stops; a good film-scanner may be able to manage under 9 stops. The concept of energy levels is usually converted to densities in devices such as scanners e.g. dynamic range is '0.2 - 3.0D units'. [2] + + +==E== + +* ''' enhancement request''' - the request for a new feature, that is not already in GIMP. An enhancement request should never be filed without prior discussion on the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list gimp-developer mailing list]. This is to make sure that the enhancement requests that are filed are well-specified and aligned with the overall goals the developers have for GIMP. + +* ''' Extended Window Manager Hints''' - The Window Manager Specification is meant to unify the GNOME and KDE window manager hint conventions. Standard specific to the X window system. +See also the [http://standards.freedesktop.org/wm-spec/wm-spec-latest.html Extended Window Manager Hints specification]. + + +==F== + +* ''' File URI specification''' - Specifies how URIs for normal UNIX filenames (file: URIs) are interpreted and created. This functionality is provided by GLib. +See also the [http://freedesktop.org/wiki/Specifications/file-uri-spec detailed File URI specification]. + +* ''' FTX''' - File and Time Extensions for TinyScheme. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/ftx FTX in GIMP]. + + +==G== + +* ''' G (uppercase)''' - Green color channel in the RGB color model. + +* ''' gcc''' - a C compiler. Part of the free [http://gcc.gnu.org/ GNU Compiler Collection]. On Linux it usually ships with your distribution. On Windows it's part of [http://www.mingw.org/ MinGW]. On OS X XCode versions before 4.2 used gcc; then Apple moved to llvm-gcc and Clang. FreeBSD 10 deprecates gcc support in favor of Clang. [5] Gcc is able to cross-compile, i.e. build GIMP for Windows on a Linux machine. + +* ''' GEGL''' - Generic Graphics Library, a graph based image processing framework. It is GIMP's foundation for nondestructive image editing in high bit depths. GEGL provides the infrastructure to do demand based, cached, nondestructive image editing on larger than RAM buffers. Through babl it provides support for a wide range of color models and pixel storage formats for input and output. GEGL support in current GIMP versions is experimental and will be official part of GIMP in version 2.10. + See also: [http://www.gegl.org/ GEGL website], GEGL porting matrix + +* ''' GEGL-chant''' - A way to hide some boilerplate code in GEGL and to reduce code duplications defining the parameters specifications of each operation. To achieve this it makes heavy use of C macro definitions and the C preprocessor. It allows defining a property on one line instead of the usual GObject way which needs 4 or 5 different locations in the class modified for each added property. The chanted properties can contain metadata, such as valid values, upper and lower bounds and their suitability for nonlinear compuation. +See also the file [https://git.gnome.org/browse/gegl/tree/gegl/gegl-chant.h gegl-chant.h] and the GEGL operations using it. + +* ''' GIF''' - Graphics Interchange Format. A bitmap image file format, especially for web graphics with low image depths and optionally transparency, i.e. logos or animations. In GIMP the GIF plug-in handles this format. +See also: [http://www.w3.org/Graphics/GIF/spec-gif89a.txt GIF89a specification], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-load.c GIMP's GIF loader], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-save.c GIMP's GIF saver] + +* ''' GIMP''' - GNU Image Manipulation Program, an advanced image editor. +See also: [http://www.gimp.org/ GIMP website], [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision GIMP product vision]. + +* ''' GIMP-Perl''' - A plug-in for GIMP allowing automation by the use of Perl scripts. + See also [http://search.cpan.org/dist/Gimp/ Distribution and technical documentation], [https://git.gnome.org/browse/gimp-perl Git repository]. + +* ''' GIO''' - part of GLib to input and output data. It abstracts from the actual filesystem to access files in a consistent, platform-independent way. +See also [https://developer.gnome.org/gio/ GIO reference manual], GIO porting matrix. + +* ''' GIR ''' - abbreviation for GObject introspection. + +* ''' Git''' - the version control system we use to manage the sources and documentation of babl, GEGL and GIMP since 16.04.2009. [17] It is a decentralized version control system, i.e. every user who has cloned a repository has a whole copy of it. This makes it easy to recover the repository if one server dies. [16] On the other hand you don't have to worry if you crashed your local repository - the chances to recover a working copy from the servers of the GNOME project or another GNOME developer are quite high. Many of us control Git by its [https://www.kernel.org/pub/software/scm/git/docs/git.html CLI commands] and [https://www.kernel.org/pub/software/scm/git/docs/gitk.html gitk], but there are also comfortable [http://git-scm.com/downloads/guis GUI clients] for it. If you have questions regarding Git usage, don't hesitate to ask - you wouldn't be the first one ;-) +See also [http://git-scm.com/ Git website], [http://git-scm.com/documentation Git documentation], [[Hacking:Developer_FAQ#GIT|Git in the Developer FAQ]], [https://git.gnome.org/browse/ GNOME's Git repositories]. + +* ''' GLib''' - the low level core library of GNOME. +See also [https://developer.gnome.org/glib/ GLib reference manual]. + +* ''' +* ''' - +: +** a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment. [11] +** The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. [11] +** a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment. [11] +** The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. [11] +* a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment. [11] +* The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. [11] + +* ''' GNOME HIG''' - the Human Interface Guidelines for the GNOME platform. We don't follow this spec to the word but we try to adopt as much of these guidelines as makes sense. Besides them we use our own [http://gui.gimp.org/index.php/Specifications specifications]. +See also [https://developer.gnome.org/hig-book/stable/ GNOME HIG website]. + +* ''' GNU coding standards''' - A [http://www.gnu.org/prep/standards/ guide] to writing portable, robust and reliable programs. Also defines the [http://www.gnu.org/prep/standards/standards.html#Formatting GNU coding style]. + +* ''' GObject''' - a library of GTK+ to enable object-oriented programming in C. +See also [https://developer.gnome.org/gobject/stable/ GObject reference manual]. + +* ''' GObject introspection''' - the implementation of object introspection in GLib. GEGL uses it to expose its interface to other programming languages ( Perl, Python, Javascript, Vala etc.) It is planned that GIMP will do the same. +See the [https://wiki.gnome.org/Projects/GObjectIntrospection detailed description of GObject introspection]. + +* ''' GP''' - abbreviation of GIMP-Perl. + +* ''' GPU computing''' - a means to utilize the computing power of graphic-cards processors for general purposes. + +* ''' gradation''' - relationship of reproduced lightness values to original lightness values in an imaging process. It is usually expressed as a 'tone curve', which is the Curves tool in GIMP. [1] + +* ''' graph''' - in computer science and mathematics a composition of nodes and edges. In [GEGL] the graph is a DAG. [14] This means, that every operation node is reached once at most, but never two or more times. + +* ''' GSoC''' - Google Summer of Code. Annual mentoring program hosted by Google Inc. to offer and award students to work on open source projects during summer. GIMP has been participating for many years. + See also: [https://developers.google.com/open-source/soc/ GSoC website], GIMP's GSoC participation + +* ''' GTK+''' - GIMP Toolkit, a multi-platform toolkit for creating graphical user interfaces. [19] It evolved out of GIMP and is now the foundation for the GNOME desktop among others. +See also [http://www.gtk.org/ GTK+ website], [http://www.gtk.org/documentation.php GTK+ documentation]. + +* ''' GUI''' - graphical user interface. A form of UI which uses graphical symbolic representations of objects (like icons, buttons, a canvas for drawing) which are manipulated with a pointing device or keyboard. + + +==H== + +* ''' Hackordnung''' - The last section from the file [https://git.gnome.org/browse/gimp/plain/HACKING HACKING] as found in the GIMP source tree explains how the GIMP source code should be formatted. + +* ''' HIG''' - Human Interface Guidelines. Set of visual and interaction guidelines to work with a particular platform. + + +==I== + +* ''' ICC''' - International Color Consortium. An organisation of industry vendors for the purpose of creating, promoting and encouraging the standardization and evolution of an open, vendor-neutral, cross-platform color management system architecture and components. [9] + +* ''' ICC Profiles in X specification''' - a specification for associating ICC color profiles with X screens. GIMP implements this proposed standard since version 2.4. +See also [http://www.burtonini.com/computing/x-icc-profiles-spec-latest.html detailed ICC Profiles in X specification] + +* ''' ICC specification''' - Specifies the profile format defined by the International Color Consortium (ICC). The intent of this format is to provide a cross-platform device profile format that can be used to translate color data between device colorspaces. The ICC specification is approved as international standard ISO 15076-1 +See also [http://www.color.org/icc_specs2.xalter detailed ICC specification]. + +* ''' ICCCM''' - Inter-Client Communication Conventions Manual. This spec defines the interaction between X11 clients. In particular it talks about selections, cut buffers, window and session management, manipulation of shared resources and device color characterization. +See also [http://tronche.com/gui/x/icccm/ ICCCM specification]. + +* ''' IDE''' - Integrated Development Environment. An integrated set of development tools, such as code editor, compiler, linker, debugger, documenter, testing tools, version control and deployment aid. Examples are [http://www.anjuta.org/ Anjuta], [http://www.codeblocks.org/ Code::Blocks], [http://www.eclipse.org/ Eclipse], [https://www.gnu.org/software/emacs/ Emacs], [http://kdevelop.org/ KDevelop] and [http://www.netbeans.org/ Netbeans]. We GIMP developers don't make rules about the development environment. Some of us use Emacs, Eclipse or Netbeans while others prefer simple editors ([http://www.geany.org/ Geany], [https://wiki.gnome.org/Apps/Gedit GEdit], Vi) and command line tools instead of an IDE. + +* ''' illuminance''' - measurement of the amount of light coming from a light source. Illuminance is measured in footcandles or Lux. [1] + +* ''' +* ''' - +: +** a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like D50 and D65. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. [1] +** [coll.] any kind of light falling on a body or scene [4]. +** a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like D50 and D65. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. [1] +** [coll.] any kind of light falling on a body or scene [4]. +* a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like D50 and D65. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. [1] +* [coll.] any kind of light falling on a body or scene [4]. + +* ''' ILV''' - International Lighting Vocabulary. A dictionary of the CIE with standard definitions regarding light. [4] + +* ''' image pyramid''' - a set of images with the same content, but pre-rendered in different sizes. The aim is to increase the rendering speed while reducing aliasing artifacts and assuring continuity within and between several target images. [15] + +* ''' input pad''' - [GEGL] a pad that consumes image data. It might also be seen as an image parameter to the operation. [14] + +* ''' introspection ''' - a method in object oriented programming techniques to gather information about other classes at runtime. GEGL uses GObject introspection and there are plans for GIMP to do the same. + +* ''' +* ''' - +: +** the International Organization for Standardization. An international association to develop and publish standards. [12] +** [photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. +** the International Organization for Standardization. An international association to develop and publish standards. [12] +** [photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. +* the International Organization for Standardization. An international association to develop and publish standards. [12] +* [photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. + + +==J== + +* ''' Jenkins''' - GIMP's Continuous Integration server. The product Jenkins is open source and a widely used Continuous Integration server. +See also: [https://gimptest.flamingtext.com:9090/ GIMP Jenkins website], [http://jenkins-ci.org/ Jenkins project website]. + +* ''' JNG''' - JPEG network graphics format. A bitmap image file format. GIMP doesn't use this format yet but it would be nice to extend the MNG plug-in to use it and to add a dedicated JNG plug-in. +See also [http://www.libpng.org/pub/mng/spec/jng.html specification]. + +* ''' +* ''' - +: +** Joint Photographic Experts Group. A lossy compression method standardised by the ISO. [8] +** An image file format and its filename extension, see JPEG JFIF +** Joint Photographic Experts Group. A lossy compression method standardised by the ISO. [8] +** An image file format and its filename extension, see JPEG JFIF +* Joint Photographic Experts Group. A lossy compression method standardised by the ISO. [8] +* An image file format and its filename extension, see JPEG JFIF + +* ''' JPEG JFIF''' - an image file format (usually referred to as JPEG) for the transport of single JPEG-compressed images. It has three color channels (Red, Green, Blue) with a bit depth of 8 bit each. JPEG JFIF doesn't support transparency. It's most often used for photographs. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/file-jpeg JPEG plug-in] handles this format. + +* ''' JPG''' - filename extension for JPEG JFIF images. + + +==K== + +* ''' +* ''' - +: +** Kelvin. Unit of color temperature . +** Key-color component of the CMYK color model to represent various shades of brightness . Usually black. +** Kelvin. Unit of color temperature . +** Key-color component of the CMYK color model to represent various shades of brightness . Usually black. +* Kelvin. Unit of color temperature . +* Key-color component of the CMYK color model to represent various shades of brightness . Usually black. + + +==L== + +* ''' L (uppercase)''' - The axis in the CIELAB color model which denotes the lightness component of the color. A low numerical value on this axis denotes a dark color and a high value a light color. + +* ''' L*a*b*''' - synonym for CIELAB + +* ''' Lab''' - synonym for CIELAB + +* ''' LCMS''' - Little Color Management System. LCMS is an open-source color management engine with focus on small footprint, accuracy and performance. It uses the ICC specification. +See also [http://www.littlecms.com/ the LCMS website]. + +* ''' LGM''' - Libre Graphics Meeting. Annual conference of developers and users of graphics open source software. GIMP has been participating for many years. +See also the [http://libregraphicsmeeting.org/ LGM website] + +* ''' LGW''' - Libre Graphics World. LGW is an online magazine for creatives using free applications for digital painting, graphic and web design, desktop publishing, photography and CAD. Its focus are news, tutorials and articles to provide most up to date information about evolution of these applications and best practices. One of LGW's authors is [http://prokoudine.info/ Alexandre Prokoudine] (prokoudine at IRC) +See also [http://libregraphicsworld.org/ LGW website]. + +* ''' light, linear''' - light as it is in nature and captured by camera sensors (and thus is encoded in RAW images). + +* ''' light, perceived''' - light as it is processed by eye and brain. The difference between linear and perceived light is that human eyes react to the same change of (linear) light with different sensitivity in dark or light environments. Perceived light is the basis of color (e.g. color is the result of light, processed by eyes and brain). + +* ''' lightness''' - [COL] a number that corresponds to the human perception of reflected light from a surface (e.g. the brightness of a color relative to the brightness of a similar illuminated white area) [1] [4]. + +* ''' link, dynamically''' - the process of creating a library that is not part of the program binary, but a separate file that is loaded at runtime. This makes it easy to reuse the same library for many programs. On the other hand, many versions of the same dynamic library can lead to usage of the wrong library version at runtime (the so-called DLL hell). Dynamically loaded libraries have the file extension .dll on Windows, .so on Linux and .dylib on OS X. +See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +* ''' link, statically''' - the process of creating a library that is included in the program binary and as such loaded at the same time with the program. Statically loaded libraries have the extension .lib on Windows, .a on Linux and OS X (until they get linked into the program). +See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +* ''' linker''' - a program to assemble single binary artifacts (so called 'object files') to a bigger piece of software (e.g. the program or a library). + +* ''' LLVM''' - Low Level Virtual Machine. A collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines [6]. You can get it for Linux, Windows and FreeBSD 9 from the [http://llvm.org/releases/download.html LLVM download page]. On OS X LLVM is part of XCode 4.2 and later. LLVM's Clang is also the default C compiler in FreeBSD 10. + +* ''' LMS''' - a color space model that describes colors in terms of the sensitivities of the three types of cone cells in the human eye, which have overlapping sensitivities to Long, Medium, and Short wavelengths of light. When chromatically adapting a color from one light source to another to maintain color constancy, the color is converted from XYZ to LMS using a chromatic adaptation model such as the Bradford transform. + +* ''' lpi ''' - lines per inch. measure of resolution or fineness of photo-mechanical reproduction. [2] + +* ''' luma''' - the weighted sum of R', G' and B' color component (=in perceived light). It is often confused with luminance which actually refers to linear light. [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] + +* ''' +* ''' - +: +** the weighted sum of R, G and B color component (=in linear light) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +** [COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) [1]. +** the weighted sum of R, G and B color component (=in linear light) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +** [COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) [1]. +* the weighted sum of R, G and B color component (=in linear light) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +* [COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) [1]. + +* ''' luminance, relative''' - luminance with numerical values normalized to 1...100 (100=reference white), see [http://en.wikipedia.org/wiki/Luminance_%28relative%29 Wikipedia]. + +* ''' LUT''' - Look-Up Table. A key-value-table, which is queried with a key and returns the assigned value. Synonyms are map or dictionary. It's a convenient way to get the results of a time-consuming or stochastic function quickly. The downside is that it potentially uses more memory than a computation. + +* ''' LUT profile''' - a color profile which internally uses a LUT to assign output color values to input color values. LUT profiles have a black and white point. For instance printer profiles are mostly LUT profiles. [22] + + +==M== + +* ''' M (uppercase)''' - Magenta color component of the CMY and CMYK color models. + +* ''' make''' - a programming tool to control the generation of executables and other non-source files of a program from the program's source files. [13] +See also [http://www.gnu.org/software/make/ GNU make website]. + +* ''' Makefile''' - a text file to control make. It contains all the make targets. In GIMP this file is generated from the Makefile.am file by the Autotools. + +* ''' make target''' - a CLI set of commands for make to trigger various actions, e.g. compiling a program from the sources. + +* ''' metadata''' - Information about a file, i.e. author, title, date and time of creation. +See also [http://www.metadataworkinggroup.org/ website of the Metadata Working Group]. + +* ''' meta operation''' - [GEGL] a composite operation, i.e. an operation that consists of other operations. + +* ''' mipmap''' - synonym for image pyramid. + +* ''' Mired''' - former, obsolete unit of reciprocal color temperature . + +* ''' MNG''' - Multiple-image Network Graphics. An image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-mng.c MNG plug-in] handles this format. +See also [http://www.libpng.org/pub/mng/spec/ MNG specification]. + +* ''' module''' - a part of GIMP providing optional functionality, such as input controllers, color selectors and display filters. Each module can be activated and deactivated in GIMP's Module manager; the changes apply at GIMPs next start. Technically a module is tightly integrated with the GIMP core. It is a shared object that runs in the GIMP process. +See also [https://git.gnome.org/browse/gimp/tree/modules GIMP's modules], plug-in. + + +==N== + +* ''' node''' - an element of a graph. In GEGL a node has an associated operation or can be a constructed graph. [14] + + +==O== + +* ''' OpenCL''' - open standard for parallel programming of heterogeneous systems, i.e. using additional CPU processors or GPU computing. OpenCL requires a driver from the manufacturer of the CPU or GPU. GEGL uses OpenCL to improve its own performance. +See also [http://www.khronos.org/opencl/ OpenCL website], GEGL porting matrix. + +* ''' OpenICC''' - a open source software project with two main goals. The first goal is to work out a common set of settings for color savvy applications to share profiles and settings. The second goal is to bring together those developers in areas like printing, display and desktop applications to work together to make color management end to end work for open source applications. [21] +See also: [http://freedesktop.org/wiki/OpenIcc/ website] + +* ''' operation''' - [GEGL]The processing primitive of GEGL, it is where the actual image processing takes place. Operations are plug-ins and provide the actual functionality of GEGL [14] + +* ''' out-of-tree-build''' - synonym for VPATH build + +* ''' output pad''' - [GEGL] a pad where data can be requested, multiple input pads can reference the same output pad. [14] + + +==P== + +* ''' pad''' - [GEGL] The part of a node that exchanges image content. The place where image "pipes" are used to connect the various operations in the composition. [14] +See also input pad, output pad. + +* ''' PCS''' - Profile Connection Space. The reference color space to convert from one ICC profile to another. Its purpose is to exchange color information across various devices. Usual PCS's are LAB and XYZ. The image editing RGB color spaces like sRGB use XYZ. + +* ''' PDB''' - Procedural DataBase. The PDB (Procedural DataBase) is the most important interface to access the image manipulation functions of GIMP. The libgimp library provides some functions to call functions from the PDB or enter new functions into the PDB. +See also [https://git.gnome.org/browse/gimp/tree/app/pdb PDB source code]. + +* ''' Perl''' - a programming language. Perl programs are interpreted. The filename extension is .pl. GIMP itself uses it to generate PDB interfaces from plug-ins, see the Perl files in [https://git.gnome.org/browse/gimp/tree/plug-ins/common /plug-ins/common] and [https://git.gnome.org/browse/gimp/tree/tools/pdbgen /tools/pdbgen]. Aside from that there's GIMP-Perl, which is a separate GIMP plug-in. +See also [http://www.perl.org/ Perl website]. + +* ''' plug-in''' - an optional part of GEGL and GIMP, providing extra functionality, like filters and file loaders/savers. GIMP plug-ins are programmed in C or Python. Plugins are limited mostly to accessing image data. +:The difference to scripts is not functional, but only technical. In fact, GIMP's Script-Fu interpreter is a plug-in. + +:The difference to modules is that modules tend to be more tightly integrated with the GIMP core, while plug-ins are almost standalone. Modules are shared objects that run in the GIMP process, while plug-ins are separate executables, which are run in a different process. This means that a crashing module will crash GIMP, while a crashing plug-in doesn't cause GIMP to crash. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins GIMP's plug-ins], [http://registry.gimp.org/ GIMP plug-in registry] + +* ''' PNG''' - Portable Network Graphics. A bitmap image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-png.c PNG plug-in] handles this format. GIMP also reads patterns in the PNG file format and it stores thumbnails as PNG images. +See also [http://www.w3.org/TR/PNG/ PNG specification]. + +* ''' ppi''' - points per inch; pixels per inch: Measure of input resolution e.g. of scanning device, measured as the number of points on the object at which a sample or measure is taken or which are resolved by the device per linear inch on a given axis: e.g. 600ppi means six hundred points per inch, usually along the axis of the scanner sensor. [2] Increasing the PPI count increases the image quality up to a certain degree: whether an image is perceived as fine or coarse granular also depends on the sensitivity of the human eye and the distance between eye and image. Image quality also depends on the contrast and the smoothness of the tonal values. +See also dpi, lpi. + +* ''' PS''' - Adobe Photoshop, a widely used, high-end image manipulation application in the commercial sector. Photoshop is available for Windows and OS X computers. Modified variants, such as Photoshop Express and Photoshop Touch, are available for mobile devices. Note that - although GIMP is often seen as Photoshop competitor - GIMP is not a for-free-Photoshop copy [23]. + +* ''' PSB''' - Photoshop Big. Adobe Photoshop's native file format for large documents with up to 300.000 Pixels in any dimension, otherwise identically to PSD. GIMP currently doesn't support PSB. + +* ''' PSD''' - Photoshop Document. Adobe Photoshop's native file format for images with up to 30.000 Pixels in any dimension. GIMP has basic support reading and writing PSD files. Advanced PS features with no equivalent in GIMP such as adjustment layers and layer effects are currently not supported. +See also [https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification]. + +* ''' primary''' - abbreviation for primary color, e.g. one of the colors in a color model of which all other colors are mixed from. In RGB these are Red, Green and Blue while in CMY these are Cyan, Magenta and Yellow. + +* ''' property''' - [GEGL] an attribute that controls the behavior of an operation. Through the use of [https://developer.gnome.org/gobject/unstable/gobject-GParamSpec.html GParamSpecs] properties are self documenting via introspection. [14] + +* ''' Python''' - a programming language. Python programs are usually interpreted. GIMP uses Python for [https://git.gnome.org/browse/gimp/tree/plug-ins/pygimp/plug-ins plug-ins], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/servertest.py the test driver for the Script-Fu server] and [https://git.gnome.org/browse/gimp/tree/tools some tools]. +See also [http://python.org/ Python website]. + + +==Q== + +''' QA''' - Quality Assurance. Actions to ensure quality during production. For software products these include for instance involvement of users and other relevant stakeholders, proper design of interactional and technical architectures, obeying coding standards, reviews and tests. + + + +==R== + +* ''' R (uppercase)''' - Red color channel in the RGB color model. + +* ''' RaGaBaA'''- [babl] a color model with the alpha premultiplied channels R, G, B and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' R'aG'aB'aA'''- [babl] a color model with the alpha premultiplied channels R, G, B and alpha. It operates in perceived light. + +* ''' Recent File Storage Specification''' - Provides a standard mechanism for storing a list of recently used files. Supported since GIMP version 2.1.6. +See also [http://standards.freedesktop.org/recent-file-spec/recent-file-spec-latest.html detailed Recent File Storage specification]. + +* ''' refactoring''' - to improve a small piece of code without neither changing its results nor introducing side effects. +See also: [http://refactoring.com/ Martin Fowlers website on refactoring] + +* ''' repository''' - the database in a version control system that contains all the file history. + +* ''' +* ''' (from +* ) - +: +** For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system. +Units: total number of usable pixels for digital cameras; ppi for scanners; line pairs per millimetre for objectives (not to be confused with lpi!). +** For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output. +Unit: dpi. +** Measure of system's ability to distinguish variations in colors or of density. +Unit: bit depth (total number of bits available for encoding values). +** For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. +** For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system. +Units: total number of usable pixels for digital cameras; ppi for scanners; line pairs per millimetre for objectives (not to be confused with lpi!). +** For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output. +Unit: dpi. +** Measure of system's ability to distinguish variations in colors or of density. +Unit: bit depth (total number of bits available for encoding values). +** For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. +* For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system. +Units: total number of usable pixels for digital cameras; ppi for scanners; line pairs per millimetre for objectives (not to be confused with lpi!). +* For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output. +Unit: dpi. +* Measure of system's ability to distinguish variations in colors or of density. +Unit: bit depth (total number of bits available for encoding values). +* For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. + +* ''' RGB''' - generally and in babl a color model with the channels R, G, B. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' R'G'B'''' - [babl] a color model with the channels R, G, B. It operates in perceived light with an sRGB TRC which is roughly perceptually uniform. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' RGBA''' - generally and in babl a color model with the channels R, G, B and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/babl-core.c source code] + +* ''' R'G'B'A''' - [babl] a color model with the channels R, G, B and alpha. It operates in perceived light with an sRGB TRC which is roughly perceptually uniform. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +* ''' ROI''' - [GEGL] - region of interest. It's the area you're currently working on in your GEGL operation. + + +==S== + +* ''' saturation''' - colorfulness of an area judged in proportion to its brightness [4] +See also: chroma + +* ''' Scheme ''' - a programming language. The current standard version is R6RS, while the TinyScheme, the version in GIMP implements a subset of the older version R5RS. The coming standard R7RS is [http://scheme-reports.org/ work in progress]. +See also [http://people.csail.mit.edu/jaffer/r5rs_toc.html Scheme R5RS language description]. + +* ''' scRGB ''' - an extended RGB color space. In GEGL most operations work in scRGB using 32bit floating point/HDR linear light RGBA. [18] +See also [http://webstore.iec.ch/webstore/webstore.nsf/artnum/029678 scRGB specification (charged)], [http://www.color.org/chardata/rgb/scrgb.xalter short overview at ICC], [http://en.wikipedia.org/wiki/ScRGB_color_space Wikipedia:scRGB]. + +* ''' script''' - a little program in Script-Fu. Scripts add optional extra functionality to GIMP. They have the filename extension .scm. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's scripts], distinction to plug-ins, [http://registry.gimp.org/ GIMP plug-in registry]. + +* ''' Script-Fu''' - a Scheme dialect. Developers can use Script-Fu for writing user-defined extensions. GIMP then interprets them using TinyScheme and FTX. +See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's Script-Fu scripts], [http://www.gimp.org/docs/scheme_plugin/ Script-Fu tutorial]. + +* ''' Shared MIME Database''' - The shared MIME database contains common MIME types, descriptions, and rules for determining the types of files. GIMP file plug-ins should use the MIME types and descriptions defined here. +See also [http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html Shared MIME Database specification]. + +* ''' sRGB''' - the default color space for the internet and other interested vendors. +See also [http://www.w3.org/Graphics/Color/sRGB detailed description at W3C]. + +* ''' Startup Notification''' - Specifies a mechanism allowing a desktop environment to track application startup to provide user feedback. GTK+ provides support for this protocol. +See also [http://standards.freedesktop.org/startup-notification-spec/startup-notification-latest.txt Startup Notification specification]. + +* ''' Subversion''' - a version control system the GNOME project used before it was superseded with Git in 2009. + +* ''' SVG 1.1''' - Scalable Vector Graphics. A vector graphics format. GIMP uses it to import vector graphics, import and export paths and load gradients from SVG files. In GIMP the SVG plug-in handles this format. To create standards conform SVG graphics with free, open source software you can use [http://www.inkscape.org/ Inkscape] for instance. +See also [http://www.w3.org/TR/SVG/ W3C recommendation] + +* ''' SVN''' - abbreviation for Subversion. + + +==T== + +* ''' Thumbnail Managing Standard''' - Deals with the permanent storage of previews for file content. In particular, it tries to define a general and widely accepted standard for this task. GIMP implements this standard and dropped support for the old-fashioned .xvpics. +See also [http://web.archive.org/ Thumbnail Managing Standard specification]. + +* ''' TIFF 6.0''' - Tagged Image File Format. + See also [http://partners.adobe.com/public/developer/tiff/ TIFF specification and other developer resources], [http://www.awaresystems.be/imaging/tiff.html Unofficial TIFF home page]. + +* ''' tile''' - [GEGL] Functionally a rectangular part of an operation's input, intermediate or output data. Technically tiles are internal implementation parts of GEGL buffers, i.e. not exposed in the GEGL buffer APIs. [14] + +* ''' tile backend''' - [GEGL] the implementation of pixel storage for a GeglBuffer (synonymous to a file system driver in an operating system). There are backends storing each tile as separate files, all tiles of a buffer in a file, communicate over gimps wire-protocol for plug-ins to operate on GeglBuffers where the tiles are stored in the main GIMP process. Other possible tile backends could communicate over the network to fetch spatial tiles from map providers (OpenStreetMap etc.) + +* ''' TinyScheme''' - a lightweight Scheme interpreter that implements a subset of the [http://people.csail.mit.edu/jaffer/r5rs_toc.html R5RS Scheme standard]. GIMP uses it to interpret Script-Fu. One of its maintainers is Kevin Cozens (kevin in IRC) +See also [http://tinyscheme.sourceforge.net/home.html TinyScheme website], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/tinyscheme TinyScheme in GIMP]. + +* ''' TRC''' - Tone Response Curve. A curve describing the signal response of the eye or an sensor to changes in linear light and as such the foundation for perceived light. + + +==U== + +* ''' UI''' - user interface. The part of the program the user interacts with. +See also: CLI, GUI. + + +==V== + +* ''' +* ''' - +: +** Level of brightness of a pixel or color as defined in HSV color model. [2] +** Designation of lightness of color in the Munsell system of color nomenclature. [2] +** Tone or brightness of a color as assessed subjectively: high values give light colors, low value colors appear dark. [2] +** [photo] in the Zone System the step or zone which corresponds to a certain range of subject brightness. [2] +** [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, luminance and film speed. [2] +** Level of brightness of a pixel or color as defined in HSV color model. [2] +** Designation of lightness of color in the Munsell system of color nomenclature. [2] +** Tone or brightness of a color as assessed subjectively: high values give light colors, low value colors appear dark. [2] +** [photo] in the Zone System the step or zone which corresponds to a certain range of subject brightness. [2] +** [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, luminance and film speed. [2] +* Level of brightness of a pixel or color as defined in HSV color model. [2] +* Designation of lightness of color in the Munsell system of color nomenclature. [2] +* Tone or brightness of a color as assessed subjectively: high values give light colors, low value colors appear dark. [2] +* [photo] in the Zone System the step or zone which corresponds to a certain range of subject brightness. [2] +* [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, luminance and film speed. [2] + +* ''' VCS''' - abbreviation of Version Control System. + +* ''' Version Control System''' - a software system that records all changes to arbitrary files and file sets over time. It's allows you to recall specific versions later, compare versions, review changes made over time, find out who last modified something or which change introduced a bug, revert changes etc. [16] We use Git for managing the babl, GEGL and GIMP source code and documentation. + +* ''' VPATH build''' - an Autotools build outside the source directory. Example: given the sources are in $HOME/src, then the compiled files could for instance be in $HOME/build. + See also [http://www.gnu.org/software/automake/manual/html_node/VPATH-Builds.html VPATH Builds in the Automake documentation] + + +==W== + +* ''' W3C''' - World Wide Web Consortium. The W3C is an international community where member organizations, a full-time staff, and the public work together to develop web standards, such as SVG 1.1, XML and XSL. [10] + +* ''' wgo''' - GIMP's main website [http://www.gimp.org/ www.gimp.org]. + +* ''' +* ''' - +: +** The nick name of the IRC chatbot. +See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +** GIMP's mascot. +** The nick name of the IRC chatbot. +See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +** GIMP's mascot. +* The nick name of the IRC chatbot. +See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +* GIMP's mascot. +:[[File:Wilber.png|Wilber, the GIMP mascot]] + +* ''' white point''' - the light-source's or sensor's interpretation of white. Practically it's a synonym for color temperature. +See also [http://eilv.cie.co.at/term/1430 CIE's definition], [http://www.colorwiki.com/wiki/White_Point ColorWiki]. + + +==X== + +* ''' +* ''' - eXperimental Computing Facility, the origin of GIMP. +: +** GIMP's file format. +See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +** Cinepaint's derivative of GIMP's XCF file format. Both are incompatible. [20] +See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] +** GIMP's file format. +See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +** Cinepaint's derivative of GIMP's XCF file format. Both are incompatible. [20] +See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] +* GIMP's file format. +See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +* Cinepaint's derivative of GIMP's XCF file format. Both are incompatible. [20] +See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] + +* ''' XDND''' - Drag-and-Drop Protocol for the X Window System. XDND defines a standard for drag and drop on X11. It is implemented by GTK+. +See also [http://freedesktop.org/Standards/XDND XDND specification]. + +* ''' XDS''' - Direct Save Protocol for the X Window System. XDS defines an extension to XDND that allow users to save a file by simply dragging it to a file manager window. GIMP supports this protocol since version 2.4. +See also [http://web.archive.org/ XDS specification]. + +* ''' XML''' - Extensible Markup Language. Describes the markup language used to store the [https://git.gnome.org/browse/gimp/tree/menus menu layout], the [https://git.gnome.org/browse/gimp/tree/data/tips/gimp-tips.xml.in startup tips], Docbook documents and other. +See also [http://www.w3.org/XML/ XML overview page at W3C], written by Liam Quin (Ankh in IRC) + +* ''' XMP''' - Extensible Metadata Platform. A labeling technology that allows to store metadata. This information is either embedded in the file itself or as separate file (a so-called XMP sidecar file). +See also [http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf XMP specification], [http://www.adobe.com/products/xmp/index.html XMP description at Adobe] + +* ''' XSETTINGS''' - The XSETTINGS protocol provides a mechanism for applications written with different toolkits to share simple configuration settings such as double-click-times and background colors. GTK+ hides this from us. +See also [http://standards.freedesktop.org/xsettings-spec/xsettings-spec-0.5.html XSETTINGS specification]. + +* ''' XSL''' - Extensible Stylesheet Language Family. XSL is a family of recommendations for defining XML document transformation and presentation. It consists of the parts XSLT, XML Path Language (XPath) and XSL Formatting Objects (XSL-FO). +See also: [http://www.w3.org/Style/XSL/ XSL website at W3C]. + +* ''' XSLT''' - XSL Transformations, a language for transforming XML documents into other formats, such as HTML, program code or plain text. GIMP uses XSLT to generate [https://git.gnome.org/browse/gimp/tree/menus/menus.xsl menus], [https://git.gnome.org/browse/gimp/tree/data/tips/fortunes.xsl startup tips] and [https://git.gnome.org/browse/gimp/tree/authors.xsl author attribution]. +See also [http://www.w3.org/TR/xslt W3C recommendation]. + +* ''' XYZ''' - color model, based on experimental observations on humans (the ' CIE standard observer'). It operates in linear light. + + +==Y== + +* ''' +* ''' - +: +** Yellow color component of the CMY and CMYK color models. +** [babl]: grayscale color model or lightness component in a color model. It's in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +** relative luminance in XYZ color model. +** luminance in xyY color model. +** Yellow color component of the CMY and CMYK color models. +** [babl]: grayscale color model or lightness component in a color model. It's in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +** relative luminance in XYZ color model. +** luminance in xyY color model. +* Yellow color component of the CMY and CMYK color models. +* [babl]: grayscale color model or lightness component in a color model. It's in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +* relative luminance in XYZ color model. +* luminance in xyY color model. + +* ''' Y' (uppercase)''' - *:* [babl]: grayscale color model or lightness component in a color model. It's in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' YA''' - [babl] a color model with the components Y and A, e.g. grayscale and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' YaA''' - [babl] a color model with the components alpha-premultiplied Y and A, e.g. grayscale and alpha. It operates in linear light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' Y'A''' - [babl] a color model with the components Y' and A, e.g. grayscale and alpha. It operates in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' Y'aA''' - [babl] a color model with the components alpha-premultiplied Y' and A, e.g. grayscale and alpha. It operates in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +* ''' YCbCr''' - a color model with the components Y (luminance), Cb and Cr. Unlike RGB it encodes the image information in luminance (channel Y) and chrominance (channels Cb and Cr). YCbCr operates in linear light. It is used for digital video and has good image compression capabilities. + +* ''' +* ''' - +: +** a color model with the components Y' (luma), Cb and Cr. It operates in perceived light. It is used for digital video and has good image compression capabilities. +** [babl] implementation of the Y'CbCr color model. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] +** a color model with the components Y' (luma), Cb and Cr. It operates in perceived light. It is used for digital video and has good image compression capabilities. +** [babl] implementation of the Y'CbCr color model. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] +* a color model with the components Y' (luma), Cb and Cr. It operates in perceived light. It is used for digital video and has good image compression capabilities. +* [babl] implementation of the Y'CbCr color model. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +* ''' Y'CbCrA''' - [babl] color model with the components Y' (luma), Cb, Cr and A. It operates in perceived light. +See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +* ''' YCC''' - abbreviation of YCbCr. + +* ''' YIQ''' - color model which separates luminance (Y component) from chroma (I, Q components). It is used for analog TV (NTSC in the U.S.) and thus irrelevant for digital image editing. + +* ''' YPbPr''' - the analog equivalent to YCbCr and thus irrelevant for digital image editing. + +* ''' YUV''' - color model which separates luminance (Y component) from chroma (U, V components). It is used for analog TV (PAL in Europe) and thus irrelevant for digital image editing. + + +==Z== + + +==References== + +# [http://www.colorwiki.com/wiki/Category:Glossary CHROMiX ColorWiki] +# [http://www.idigitalphoto.com/dictionary/ idigitalphoto Photography Dictionary] +# [http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia:HSL and HSV] +# CIE: [http://eilv.cie.co.at/ e-ILV: International Lighting Vocabulary] +# Michael Larabel: [http://www.phoronix.com/scan.php?page=news_item&px=MTEwMjI FreeBSD 10 To Use Clang Compiler, Deprecate GCC] +# [http://www.llvm.org/ LLVM website] +# Clang Team: [http://clang.llvm.org/docs/CrossCompilation.html Cross-compilation using Clang] +# W3C, Chris Lilley: [http://www.w3.org/Graphics/JPEG/ JPEG JFIF] +# ICC: [http://www.color.org/abouticc.xalter About ICC] +# [http://wwww.w3.org/ W3C website] +# [http://www.gnome.org/ GNOME website] +# [http://www.iso.org/ ISO website] +# [http://www.gnu.org/software/make/ GNU Make website] +# [http://gegl.org/#_glossary GEGL glossary] +# Lance, Williams: [http://staff.cs.psu.ac.th/iew/cs344-481/p1-williams.pdf Pyramidal parametrics], Computer Graphics 7.3 (1983): 1-11. +# Scott Chacon: [http://git-scm.com/book/en/Getting-Started-About-Version-Control Getting Started About Version Control], licensed under [http://creativecommons.org/licenses/by-nc-sa/3.0/ CC BY-NC-SA 3.0] +# Lucas Rocha, [https://mail.gnome.org/archives/devel-announce-list/2009-March/msg00005.html Announcement at GNOME's devel-announce-list], 19.03.2009 +# [http://www.gegl.org/ GEGL website] +# [http://www.gtk.org/ GTK+ website] +# [http://www.linuxdevcenter.com/pub/a/linux/2004/04/29/cinepaint.html?page=2 Linux Devcenter: Developer interview: Robin Rowe and Andrew Prock on Cinepaint] +# [http://freedesktop.org/wiki/OpenIcc/ OpenICC website] +# Stone, Elle: [http://ninedegreesbelow.com/photography/xyz-rgb.html Completely Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs ] +# The GIMP team: [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision Produkt vision] + + +==Trademarks== + +Adobe, Photoshop, Photoshop Express and Photoshop Touch are either trademarks or registered trademarks of Adobe Systems Incorporated in the United States and/or other countries. Apple and OS X are trademarks of Apple Computer, Inc. registered in the United States and other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. All other products are the property of their respective owners. + + diff --git a/wiki/Glossary-20210515121423-edit.txt b/wiki/Glossary-20210515121423-edit.txt new file mode 100644 index 0000000..39879db --- /dev/null +++ b/wiki/Glossary-20210515121423-edit.txt @@ -0,0 +1,638 @@ +This glossary contains definitions important for the GIMP development. These include functional definitions i.e. from computer graphics and color theory, photography, terms from babl and GEGL etc. + + +[https://bugzilla.gnome.org/enter_bug.cgi?product=gimp-web&component=wiki.gimp.org Report a bug] + + + +==Table of Contents== + +{{link|Legend}} + +{{link|A}} {{link|B}} {{link|C}} {{link|D}} {{link|E}} {{link|F}} {{link|G}} {{link|H}} {{link|I}} {{link|J}} {{link|K}} {{link|L}} {{link|M}} {{link|N}} {{link|O}} {{link|P}} {{link|Q}} {{link|R}} {{link|S}} {{link|T}} {{link|U}} {{link|V}} {{link|W}} {{link|X}} {{link|Y}} {{link|Z}} + +{{link|References}} + +{{link|Trademarks}} +__NOTOC__ + +==Legend== + +{| +|[babl] || specific to {{link|babl}} +|- +|[COL] || colorimetry +|- +|[coll.] || colloquial +|- +|[GEGL] || specific to {{link|GEGL}} +|- +|[GIMP] || specific to {{link|GIMP}} +|- +|[photo] || photography +|} + + +==A== +*{{term | a (lowercase)}} - {{link|babl | [babl]}} denotes a color channel to be premultiplied with {{link|alpha}}, for instance RaGaBa is premultiplied {{link|alpha}} {{link|RGB}} + +*{{term | a* (lowercase)}} - The axis in the {{link|CIELAB}} {{link|color model}} which denotes the green-magenta component of the color. A negative value on this axis denotes green and a positive value denotes magenta. + +*{{term | A (uppercase)}} - +*:*The {{link|alpha}} channel in a {{link|color model}}, for instance in {{link|RGBA}}. +*:*{{link|babl | [babl]}} the {{link|alpha}} value in a {{link|color model}}. If combined with alpha-premultiplied color channels: the alpha value each color channel R, G, B was multiplied with to achieve Ra, Ga, Ba. Needed to get from RaGaBa back to {{link|RGB}} . The same applies to {{link|R'aG'aB'aA}}, {{link|YaA}}, {{link|Y'aA}}. + +*{{term | abyss}} - {{link|GEGL|[GEGL]}} data from outside the input buffer. + +*{{term | abyss policy}} - {{link|GEGL|[GEGL]}} the behaviour rule to handle {{link|abyss}} data: to clamp to the border, loop in the buffer extent, or implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to GEGL_ABYSS_LOOP adds the tileability to the operation for free. + +*{{term | alpha}} - opacity. An alpha value of 0 means 'transparent', an alpha value of 100 means 'fully opaque', values in between mean 'partly opaque'. + +*{{term | API}} - Application Programmers Interface. The technical interface of a library to external developers who are intended use it. It defines the provided services, their semantic and syntax. On implementation level these are the public data types, enumerators and functions with their signatures.
    See also: [http://gegl.org/api.html GEGL API] , [http://gegl.org/#_operation_api GEGL operation API], [http://developer.gimp.org/api/2.0/index.html GIMP API]. + +*{{term | ArgyllCMS}} - an open source color management system for profiling input devices (scanner, camera, etc) and calibrating and profiling output devices (printer, monitor, etc), plus a suite of command line utilities for exploring, linking, and converting between ICC profiles.
    See also the [http://argyllcms.com/ ArgyllCMS website]. + +*{{term | Autohell}} - [coll.] synonym for {{link|Autotools}}, because they are practically hard to figure out. + +*{{term | Autotools}} - the GNU build system. They check the current configuration to ensure all dependencies are in place, generate the Makefiles and execute them to do several tasks like compiling, installing and testing a program.
    See also the [http://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html#Autotools-Introduction GNU Autotools website]. + +{{right | {{link|Table of Contents}}}} + +==B== +*{{term | b* (lowercase)}} - the axis in the {{link|CIELAB}} {{link|color model}} which denotes the blue-yellow component of the color. A negative value on this axis denotes blue and a positive value denotes yellow. + +*{{term | B (uppercase)}} - +*:*Blue color channel in the {{link|RGB}} {{link|color model}}. +*:*{{link|brightness}} component of the HSB {{link|color model}}. +*:*[photo] symbol for {{link|brightness}}: obsolete, but may be found on older light meters. {{fn_ref|2}} +*:*[photo] Bulb: used for long exposures timed by the photographer. Setting for shutter at which shutter opens when shutter button is pressed and stays open as long as shutter button is kept down. {{fn_ref|2}} + +*{{term | babl}} - a dynamic, any to any, pixel format translation library.
    See also: [http://www.gegl.org/babl babl website] + +*{{term | backend}} - generally the internal part of a library that implements its public {{link|API}}. In {{link|GEGL}} this could for instance be computing an {{link|operation}}, storing {{link|tile|tiles}} and memory management. + +*{{term | black point}} - the light-source's (e.g. a monitor) or sensor's interpretation of black. + +*{{term | Bradford transform}} - a matrix used to convert {{link|XYZ|XYZ}} colors to the {{link|LMS|LMS}} color space when {{link|chromatic adaptation|chromatically adapting}} a color in order to maintain constant color appearance under different light sources. The Bradford transform is recommended by the {{link|ICC|ICC}} and used by {{link|ArgyllCMS|ArgyllCMS}} and {{link|LCMS|LCMS}} when making ICC D50-adapted RGB profiles from color spaces such as the sRGB D65 color space. + +*{{term | brightness}} - attribute of a visual perception according to which an area or color appears to emit, or reflect, more or less light. This correlates directly with the amplitude of the lightwave. {{fn_ref|1}} {{fn_ref|4}} + +*{{term | bug}} - an error in a program, e.g. an existing feature doesn't work as specified or usually expected. Requests for new features are not bugs, but {{ link | enhancement request | enhancement requests}}. + +*{{term | bugtracker}} - a software system for gathering, managing and keeping track of {{link | bug | bugs }} and {{ link | enhancement request | enhancement requests}}. We use {{link | Bugzilla}} for bugtracking. + +*{{term | Bugzilla}} - the GIMP project uses [https://bugzilla.gnome.org/ Bugzilla] of the GNOME project, a {{link | bugtracker}} that allows us to coordinate bug reports. Bugzilla is also used for enhancement requests and the preferred way to submit patches for GIMP is to open a bug report and attach the patch to it.
    See also: [http://www.bugzilla.org/ Bugzilla website], [http://www.gimp.org/bugs/ Reporting bugs in GIMP]. + +*{{term | build}} - +*:* (verb) - the process of {{link|compiler|compiling}} and {{link|linker|linking}} a software from its sourcecode. +*:* (noun) - the result of the build process, i.e. a binary or archive, distributable file. + +*{{term | Bz }} - abbreviation for {{link | Bugzilla}}. + +{{right | {{link|Table of Contents}}}} + +==C== +*{{term | C (uppercase)}} - +*:*Cyan color component of the {{link|CMY}} and {{link|CMYK}} {{link|color model|color models}}. +*:*{{link|chroma}} component of the LCH {{link|color model}}. +*:*the programming language most of {{link|GIMP}}, {{link|GEGL}} and {{link|babl}} is programmed with. Specified in the [http://www.nirvani.net/docs/ansi_c.pdf ISO 9899] international standard. C itself is not object oriented, but GIMP and GEGL use object orientation by the use of {{link|GObject}}. + +*{{term | Cb}} - the Blue component of {{link|YCbCr}} {{link|chroma}}. + +*{{term | chroma}} - Colorfulness of an area judged as a proportion of the {{link|brightness}} of a similarly illuminated area that appears white or highly transmitting. {{fn_ref|1}} {{fn_ref|4}}
    See also {{link|saturation}}. + +*{{term | chromatic adaptation}} - +*:* (in everyday experience) - the process by which our eyes automatically adapt to light from different light sources so that color appearance remains constant. As the {{link|color temperature|color temperature}} of the ambient light changes, the respective sensitivities of the Long, Medium, and Short cone cells in the eyes also change. Without chromatic adaptation a white object might look blue in the shade, white in the sun, and yellow by candlelight, and a red object might look purple-red in the shade, red in the sun, and orange-red by candlelight. +*:* (mathematically) - the process of using a {{link|chromatic adaptation model|chromatic adaptation model}} to convert RGB colors as perceived under one light source to the equivalent colors as perceived under a different light source, to maintain constant color appearance under both light sources. Proposed models include XYZ, Von Kries, {{link|Bradford transform|Bradford}}, and Sharp. + +*{{term | chromatic adaptation model}} - a mathematical transform from the {{link|XYZ|XYZ}} color space to the {{link|LMS|LMS}} color space. A chromatic adaptation model is used to calculate the equivalent {{link|XYZ|XYZ}} colors required to maintain constant color appearance under different light sources. + +*{{term | chromaticity}} - The color properties of a sample judged independently of {{link|luminance}}, i.e. in terms of hue and {{link|saturation}} only. {{fn_ref|1}} + +*{{term | CI}} - abbreviation for {{link|Continuous Integration}}. + +*{{term | CIE}} - Commission Internationale de l'Eclairage (International Commission on Illumination). Independent, non-profit organization for recommendations on photometry and colorimetry. Its aim is to exchange information on all matters relating to the science and art of light and lighting, color and vision, photobiology and image technology worldwide. It is recognized by {{link|ISO}} as an international standardization body. The CIE has defined several {{link|color spaces}} that describe the range of visible colors in unambiguous numerical terms. {{fn_ref|1}} {{fn_ref|4}} + +*{{term | CIE 1976 L*a*b*}} - synonym of {{link|CIELAB}} + +*{{term | CIE Lab}} - {{link|babl|[babl]}} implementation of {{link|CIELAB}}. + +*{{term | CIE Lab alpha}} - {{link|babl|[babl]}} implementation of {{link|CIELAB}} with an alpha channel {{link|A (uppercase)|(A)}}. + +*{{term | CIEL*a*b*}} - synonym of {{link|CIELAB}} + +*{{term | CIELAB}} - a device independent {{link|color model}} defined by {{link|CIE}} in 1976. It describes colors as points on the three axes {{link|L (uppercase) | L}}, {{link|a (lowercase) | a}}, {{link|b (lowercase) | b}}. It is also said to be the reference {{link|color model}} in Adobe Photoshop (but not GIMP), e.g. internal computations from one {{link|color space}} to another are done there via CIELAB.
    See also [http://eilv.cie.co.at/term/157 CIELAB's formal definition] by the CIE. + +*{{term | Clang}} - the {{link|C | C}} {{link|compiler}} of the {{link|LLVM}} project. Clang is able to cross-compile code, i.e. build GIMP for Windows on a Linux machine {{fn_ref|7}}. + +*{{term | CLI}} - command line interface. A form of {{link|UI}} where the user interacts with the program by entering textual commands. This can e.g. be the set of commandline arguments that are passed to the the program on startup, or a commandline in the {{link|GUI}} to enter textual commands. You can get the set of GIMP's commandline arguments by entering '''gimp --help''' at the systems shell. + +*{{term | Clipboard Manager}} - The Clipboard Manager specification describes how applications can actively store the contents of the clipboard when the application is quit. This requires that a compliant clipboard manager is running. Standard specific to the X window system.
    See also [http://www.freedesktop.org/wiki/ClipboardManager Clipboard Manager specification]. + +*{{term | Clipboards}} - Explanation of the consensus of the Qt and {{link|GTK+}} developers on how the X clipboard works. Standard specific to the X window system.
    See also [http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt informal Clipboards specification]. + +*{{term | CMY}} - {{link|color model}} with the three primary colors Cyan, Magent and Yellow. The three "subtractive" primary colors used as the basis of all dye or pigment-based printing systems and color photography. A full range of colors including neutral grays and blacks can be produced with good cyan, yellow and magenta colorants (e.g. color film dyes) but typical printing inks are less than perfect. {{fn_ref|1}} + +*{{term | CMYK}} - +*:*{{link|color model}} with the four primary colors Cyan, Magenta, Yellow, Key color (usually Black). The four colors commonly used in process color printing. Black is added to {{link|CMY}} to enhance the density of dark areas and solve gray balance problems encountered when trying to make neutral grays with {{link|CMY}} alone. {{fn_ref|1}} +*:*{{link|babl|[babl]}} implementation of the CMYK color model. {{link|GEGL}} treats rendering CMYK as problem subset of rendering spot colors. +*:*pronouncation: C.M.Y.K., not schmuck nor smug + +*{{term | color management}} - an approach to ensure that colors look the same (or at least most similar) across various devices in a workflow. For instance it ensures that photos taken from a camera look the same at the editors screen and the printer output. If you have questions on color management, then Øyvind Kolås (IRC nick: pippin) or Elle Stone (IRC nick: elle) are the best persons to ask in the project. + +*{{term | color model}} - a mathematical model to describe colors and handle them formally, such as points in a coordinate system. This is the more theoretically abstract background of color computation. Practically this term is often used synonymously to {{link|color space}}.
    Examples are {{link|CIELAB}} , {{link|RGB}} and {{link|XYZ}} . + +*{{term | color space}} - a geometric representation of color in space, usually of 3 dimensions {{fn_ref|4}}. While {{link|color models}} are the theoretical background color spaces describe the set of visible or reproducable colors {{fn_ref|2}}. Practically this term is often used synonymously to {{link|color model}}. To get a visual notion of various color spaces and their relationships see [http://www.brucelindbloom.com/WorkingSpaceInfo.html#Viewer Bruce Lindblooms 3D Gamut Viewer] demo.
    Examples are AdobeRGB, {{link|sRGB}} and Wide Gamut RGB.
    To assign a numerical vector to a real color you need both a {{link|color model}} and a color space. As an example the numbers (0,1,0) are given. In {{link|XYZ}} {{link|color model}} with sRGB color space they represent a pure green. In {{link|XYZ}} {{link|color model}} with AdobeRGB color space you get a pure, but more saturated green. In HSB {{link|color model}}+sRGB color space these numbers represent a pure black. + +*{{term | color temperature}} - formally the temperature of an ideal black body radiator whose radiation has the same {{link|chromaticity}} as that of a given stimulus. {{fn_ref|4}} Practically it's a synonym for {{link|white point}} {{fn_ref|1}}. Not to be confused with the artistic classification into warm colors (i.e. yellow, orange) and cold colors (i.e. blue).
    Unit: K (Kelvin). + +*{{term | compiler}} - a program to translate code in a programming language into executable machine code, i.e. {{link|gcc}} or {{link|Clang}}. In GIMP there's no recommended default {{link|C}} compiler. Instead the platform default will be used automatically. + +*{{term | connection}} - {{link|GEGL | [GEGL]}} A link/pipe routing image flow between operations within the graph goes from an output pad to an input pad, in graph glossary this might also be referred to as an edge. {{fn_ref|14}} + +*{{term | Continuous Integration}} - a method to regularly fetch the source code from the {{link|Version Control System|version control system}}, build and test the software. Developers get almost immediate feedback whether their software builds and works well. By doing this on a regular basis bugs can be detected and fixed much earlier than if testing was the last step before the release or after release on the user's side. This increases the software quality. Modern continuous integration systems use a client-server architecture: a server does all the continuous integration jobs and users access it via a web browser (=the client). GIMP uses {{link|Jenkins}} as continuous integration server. + +*{{term | Cr}} - the Red component of {{link|YCbCr}} {{link|chroma}}. + +*{{term | CVS}} - a {{link|Version Control System|version control system}} the {{link|GNOME}} project had used a long time ago, before it was superseded with {{link|Subversion}}. Now we're using {{link|Git}}. + +{{right | {{link|Table of Contents}}}} + +==D== +*{{term | D-Bus }} - Desktop Message Bus. If available, GIMP uses it to detect if another GIMP instance is already running. In the future, GIMP might make even more use of D-Bus.
    See also [http://dbus.freedesktop.org/doc/dbus-specification.html D-Bus specification], [https://git.gnome.org/browse/gimp/tree/app/gui/dbus-service.xml GIMP's D-Bus service's interface descriptor], [http://raphael.slinckx.net/blog/documents/dbus-tutorial D-Bus tutorial]. + +*{{term | D50}} - a {{link|CIE}} standard {{link|illuminant}} with the spectral power distribution of daylight (which has a {{link|color temperature}} of 5003 Kelvin). It is chosen for the special needs of the paper printing industry and thus the preferred reference white for evaluating prints on paper. Compared to {{link|D65}} it's a bit more yellowish. + +*{{term | D65}} - a {{link|CIE}} standard {{link|illuminant}} with the spectral power distribution of noon mid-latitude daylight (which has a {{link|color temperature}} of 6504 Kelvin). It's the white balance standard used for sRGB {{link|color space}} and to calibrate display screens. Compared to {{link|D50}} it's a bit more bluish. + +*{{term | DAG}} - Directed Acyclic Graph. In computer science and mathematics a graph with directed edges and the attribute, that every node is reached never or only once on any path. For instance trees (as data structure) are DAGs. + +*{{term | deprecated}} - a term from software development. Code marked as '''deprecated''' is outdated or obsolete. It and the code using it need to be replaced by {{link|refactoring|refactored}} code soon. Deprecated code often occurs as result of {{link|API}} changes.
    Example: The code contains two functions '''do_this''' and '''do_that'''. Function '''do_that''' calls '''do_this'''. Function '''do_this''' is marked as deprecated. It soon needs to be replaced by a newer function '''do_this_better''' and '''do_that''' needs to call '''do_this_better''' instead. + +*{{term | Desktop Entry Specification}} - This document describes desktop entries: files describing information about an application such as the name, icon, and description. GIMP installs such a [https://git.gnome.org/browse/gimp/plain/desktop/gimp.desktop.in.in .desktop file].
    See also the [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html detailed Desktop Entry specification]. + +*{{term | DND}} - Drag and Drop. + +*{{term | DNG}} - Digital Negative. An image file format aiming to become a device-independent standard for storing raw data from digital cameras.
    See also [http://www.adobe.com/products/dng/pdfs/dng_spec.pdf DNG specification]. + +*{{term | DOAP}} - DOAP is an {{link|XML}} schema for describing software projects. The GNOME project uses it for instance to show a short project's description at the [https://git.gnome.org/browse/ project index].
    See also [https://github.com/edumbill/doap/ DOAP website], [https://git.gnome.org/browse/gimp/tree/gimp.doap GIMP's DOAP file]. + +*{{term | Docbook}} - DocBook is a general purpose {{link|XML}} schema particularly well suited to books and papers. In {{link|GIMP}} it is used for the [https://git.gnome.org/browse/gimp-help-2/tree/ user documentation] and [https://git.gnome.org/browse/gimp/tree/devel-docs/structure.xml structure of the technical documentation].
    See also the [http://www.docbook.org/specs/ Docbook specifications]. + +*{{term | dpi }} - dots per inch. Measure of resolution of a device as density or frequency of points or dots which can be addressed or referred to by the device.{{fn_ref|2}} It is often confused with {{link|lpi}} and {{link|ppi}}. DPI refers to the amount of ink dots in printing. Each of these dots has a certain {{link|primary}}, for instance a {{link|CMYK}} color. Pixels of secondary colors are created by plotting many of these dots side-by-side. Thus a high DPI count isn't the same as a high PPI count. Because of technological progress in ink printing this measure is of decreasing importance. + +*{{term | dynamic range}} - Measure of spread from the highest to lowest energy levels that can be captured by an imaging or recording or reproduced by a play-back device. E.g. a top-class scanning camera back can capture a range of 11 f/stops; a good film-scanner may be able to manage under 9 stops. The concept of energy levels is usually converted to densities in devices such as scanners e.g. dynamic range is '0.2 - 3.0D units'. {{fn_ref|2}} + +{{right | {{link|Table of Contents}}}} + +==E== +*{{term | enhancement request}} - the request for a new feature, that is not already in GIMP. An enhancement request should never be filed without prior discussion on the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list gimp-developer mailing list]. This is to make sure that the enhancement requests that are filed are well-specified and aligned with the overall goals the developers have for GIMP. + +*{{term | Extended Window Manager Hints}} - The Window Manager Specification is meant to unify the GNOME and KDE window manager hint conventions. Standard specific to the X window system.
    See also the [http://standards.freedesktop.org/wm-spec/wm-spec-latest.html Extended Window Manager Hints specification]. + +{{right | {{link|Table of Contents}}}} + +==F== +*{{term | File URI specification}} - Specifies how URIs for normal UNIX filenames (file: URIs) are interpreted and created. This functionality is provided by {{link|GLib}}.
    See also the [http://freedesktop.org/wiki/Specifications/file-uri-spec detailed File URI specification]. + +*{{term | FTX}} - File and Time Extensions for {{link|TinyScheme}}.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/ftx FTX in GIMP]. + +{{right | {{link|Table of Contents}}}} + +==G== +*{{term | G (uppercase)}} - Green color channel in the {{link|RGB}} {{link|color model}}. + +*{{term | gcc}} - a {{link|C}} {{link|compiler}}. Part of the free [http://gcc.gnu.org/ GNU Compiler Collection]. On Linux it usually ships with your distribution. On Windows it's part of [http://www.mingw.org/ MinGW]. On OS X XCode versions before 4.2 used gcc; then Apple moved to llvm-gcc and {{link|Clang}}. FreeBSD 10 deprecates gcc support in favor of {{link|Clang}}. {{fn_ref|5}} Gcc is able to cross-compile, i.e. build GIMP for Windows on a Linux machine. + +*{{term | GEGL}} - Generic Graphics Library, a graph based image processing framework. It is GIMP's foundation for nondestructive image editing in high bit depths. GEGL provides the infrastructure to do demand based, cached, nondestructive image editing on larger than RAM buffers. Through {{link|babl}} it provides support for a wide range of {{link|color models}} and pixel storage formats for input and output. GEGL support in current GIMP versions is experimental and will be official part of GIMP in version 2.10.
    See also: [http://www.gegl.org GEGL website], [[#Hacking:Porting_filters_to_GEGL | GEGL porting matrix]] + +*{{term | GEGL-chant}} - A way to hide some boilerplate code in {{link|GEGL}} and to reduce code duplications defining the parameters specifications of each operation. To achieve this it makes heavy use of {{link|C}} macro definitions and the C preprocessor. It allows defining a property on one line instead of the usual {{link|GObject}} way which needs 4 or 5 different locations in the class modified for each added property. The chanted properties can contain metadata, such as valid values, upper and lower bounds and their suitability for {{link|light, perceived|nonlinear}} compuation.
    See also the file [https://git.gnome.org/browse/gegl/tree/gegl/gegl-chant.h gegl-chant.h] and the GEGL operations using it. + +*{{term | GIF}} - Graphics Interchange Format. A bitmap image file format, especially for web graphics with low image depths and optionally transparency, i.e. logos or animations. In GIMP the GIF plug-in handles this format.
    See also: [http://www.w3.org/Graphics/GIF/spec-gif89a.txt GIF89a specification], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-load.c GIMP's GIF loader], [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gif-save.c GIMP's GIF saver] + +*{{term | GIMP}} - GNU Image Manipulation Program, an advanced image editor.
    See also: [http://www.gimp.org GIMP website], [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision GIMP product vision]. + +*{{term | GIMP-Perl}} - A plug-in for GIMP allowing automation by the use of {{link|Perl}} scripts.
    See also [http://search.cpan.org/dist/Gimp/ Distribution and technical documentation], [https://git.gnome.org/browse/gimp-perl Git repository]. + +*{{term | GIO}} - part of {{link|GLib}} to input and output data. It abstracts from the actual filesystem to access files in a consistent, platform-independent way.
    See also [https://developer.gnome.org/gio/ GIO reference manual], [[#Hacking:Porting file loaders/exporters to GIO | GIO porting matrix]]. + +*{{term | GIR }} - abbreviation for {{link|GObject introspection}}. + +*{{term | Git}} - the {{link|Version Control System|version control system}} we use to manage the sources and documentation of {{link|babl}}, {{link|GEGL}} and {{link|GIMP}} since 16.04.2009. {{fn_ref|17}} It is a decentralized version control system, i.e. every user who has cloned a {{link|repository}} has a whole copy of it. This makes it easy to recover the repository if one server dies.{{fn_ref|16}} On the other hand you don't have to worry if you crashed your local repository - the chances to recover a working copy from the servers of the {{link|GNOME}} project or another GNOME developer are quite high. Many of us control Git by its [https://www.kernel.org/pub/software/scm/git/docs/git.html CLI commands] and [https://www.kernel.org/pub/software/scm/git/docs/gitk.html gitk], but there are also comfortable [http://git-scm.com/downloads/guis GUI clients] for it. If you have questions regarding Git usage, don't hesitate to ask - you wouldn't be the first one ;-)
    See also [http://git-scm.com/ Git website], [http://git-scm.com/documentation Git documentation], [[Hacking:Developer_FAQ#GIT|Git in the Developer FAQ]], [https://git.gnome.org/browse/ GNOME's Git repositories]. + +*{{term | GLib}} - the low level core library of GNOME.
    See also [https://developer.gnome.org/glib/ GLib reference manual]. + +*{{term | GNOME}} - +*:* a free desktop environment for Unix-style operating systems with a GUI and software for daily use. GNOME applications can also be compiled and run on other platforms, such as Windows. GIMP is part of this desktop environment.{{fn_ref|11}} +*:* The GNOME Project is a diverse international community which involves thousands of contributors, many of whom are volunteers. Aim of the GNOME project is to make the GNOME desktop environment. {{fn_ref|11}} + +*{{term | GNOME HIG}} - the {{link|HIG | Human Interface Guidelines}} for the GNOME platform. We don't follow this spec to the word but we try to adopt as much of these guidelines as makes sense. Besides them we use our own [http://gui.gimp.org/index.php/Specifications specifications].
    See also [https://developer.gnome.org/hig-book/stable/ GNOME HIG website]. + +*{{term | GNU coding standards}} - A [http://www.gnu.org/prep/standards/ guide] to writing portable, robust and reliable programs. Also defines the [http://www.gnu.org/prep/standards/standards.html#Formatting GNU coding style]. + +*{{term | GObject}} - a library of {{link|GTK+}} to enable object-oriented programming in {{link|C}}.
    See also [https://developer.gnome.org/gobject/stable/ GObject reference manual]. + +*{{term | GObject introspection}} - the implementation of object {{link|introspection}} in {{link|GLib}}. {{link|GEGL}} uses it to expose its interface to other programming languages ({{link|Perl}}, {{link|Python}}, Javascript, Vala etc.) It is planned that GIMP will do the same.
    See the [https://wiki.gnome.org/Projects/GObjectIntrospection detailed description of GObject introspection]. + +*{{term | GP}} - abbreviation of {{link|GIMP-Perl}}. + +*{{term | GPU computing}} - a means to utilize the computing power of graphic-cards processors for general purposes. + +*{{term | gradation}} - relationship of reproduced {{link|lightness}} values to original {{link|lightness}} values in an imaging process. It is usually expressed as a 'tone curve', which is the Curves tool in GIMP. {{fn_ref|1}} + +*{{term | graph}} - in computer science and mathematics a composition of nodes and edges. In {{link|GEGL | [GEGL]}} the graph is a {{link|DAG}}.{{fn_ref|14}} This means, that every operation node is reached once at most, but never two or more times. + +*{{term | GSoC}} - Google Summer of Code. Annual mentoring program hosted by Google Inc. to offer and award students to work on open source projects during summer. GIMP has been participating for many years.
    See also: [https://developers.google.com/open-source/soc/ GSoC website], [[#Hacking:GSOC | GIMP's GSoC participation]] + +*{{term | GTK+}} - GIMP Toolkit, a multi-platform toolkit for creating graphical user interfaces.{{fn_ref|19}} It evolved out of {{link|GIMP}} and is now the foundation for the {{link|GNOME}} desktop among others.
    See also [http://www.gtk.org GTK+ website], [http://www.gtk.org/documentation.php GTK+ documentation]. + +*{{term | GUI}} - graphical user interface. A form of {{link|UI}} which uses graphical symbolic representations of objects (like icons, buttons, a canvas for drawing) which are manipulated with a pointing device or keyboard. + +{{right | {{link|Table of Contents}}}} + +==H== +*{{term | Hackordnung}} - The last section from the file [https://git.gnome.org/browse/gimp/plain/HACKING HACKING] as found in the GIMP source tree explains how the GIMP source code should be formatted. + +*{{term | HIG}} - Human Interface Guidelines. Set of visual and interaction guidelines to work with a particular platform. + +{{right | {{link|Table of Contents}}}} + +==I== +*{{term | ICC}} - International Color Consortium. An organisation of industry vendors for the purpose of creating, promoting and encouraging the standardization and evolution of an open, vendor-neutral, cross-platform color management system architecture and components. {{fn_ref|9}} + +*{{term | ICC Profiles in X specification}} - a specification for associating ICC color profiles with X screens. GIMP implements this proposed standard since version 2.4.
    See also [http://www.burtonini.com/computing/x-icc-profiles-spec-latest.html detailed ICC Profiles in X specification] + +*{{term | ICC specification}} - Specifies the profile format defined by the International Color Consortium (ICC). The intent of this format is to provide a cross-platform device profile format that can be used to translate color data between device colorspaces. The ICC specification is approved as international standard ISO 15076-1
    See also [http://www.color.org/icc_specs2.xalter detailed ICC specification]. + +*{{term | ICCCM}} - Inter-Client Communication Conventions Manual. This spec defines the interaction between X11 clients. In particular it talks about selections, cut buffers, window and session management, manipulation of shared resources and device color characterization.
    See also [http://tronche.com/gui/x/icccm/ ICCCM specification]. + +*{{term | IDE}} - Integrated Development Environment. An integrated set of development tools, such as code editor, compiler, linker, debugger, documenter, testing tools, version control and deployment aid. Examples are [http://www.anjuta.org Anjuta], [http://www.codeblocks.org/ Code::Blocks], [http://www.eclipse.org Eclipse], [https://www.gnu.org/software/emacs/ Emacs], [http://kdevelop.org/ KDevelop] and [http://www.netbeans.org Netbeans]. We GIMP developers don't make rules about the development environment. Some of us use Emacs, Eclipse or Netbeans while others prefer simple editors ([http://www.geany.org/ Geany], [https://wiki.gnome.org/Apps/Gedit GEdit], Vi) and command line tools instead of an IDE. + +*{{term | illuminance}} - measurement of the amount of light coming from a light source. Illuminance is measured in footcandles or Lux. {{fn_ref|1}} + +*{{term | illuminant}} - +*:* a mathematical description of a real or imaginary light source described by its spectral power distribution. This definition applies especially for standard illuminants like {{link|D50}} and {{link|D65}}. For examples and calculations see [http://files.cie.co.at/204.xls CIE's selected colorimetric tables (xls)]. Illuminant A was designated to represent tungsten light and Illuminant D was designated to represent daylight. {{fn_ref|1}} +*:* [coll.] any kind of light falling on a body or scene {{fn_ref|4}}. + +*{{term | ILV}} - International Lighting Vocabulary. A dictionary of the {{link|CIE}} with standard definitions regarding light. {{fn_ref|4}} + +*{{term | image pyramid}} - a set of images with the same content, but pre-rendered in different sizes. The aim is to increase the rendering speed while reducing aliasing artifacts and assuring continuity within and between several target images. {{fn_ref|15}} + +*{{term | input pad}} - {{link|GEGL | [GEGL]}} a {{link|pad}} that consumes image data. It might also be seen as an image parameter to the {{link|operation}}. {{fn_ref|14}} + +*{{term | introspection }} - a method in object oriented programming techniques to gather information about other classes at runtime. {{link|GEGL}} uses {{link|GObject introspection}} and there are plans for {{link|GIMP}} to do the same. + +*{{term | ISO}} - +*:*the International Organization for Standardization. An international association to develop and publish standards.{{fn_ref|12}} +*:*[photo] the film speed, e.g. the sensitivity of the film grain or camera sensor to light. The higher this sensitivity, the less light is necessary to take a photo, but the photo becomes more noisy resp. grainy. + +{{right | {{link|Table of Contents}}}} + +==J== +*{{term | Jenkins}} - GIMP's {{link | Continuous Integration}} server. The product Jenkins is open source and a widely used Continuous Integration server.
    See also: [https://gimptest.flamingtext.com:9090/ GIMP Jenkins website], [http://jenkins-ci.org/ Jenkins project website]. + +*{{term | JNG}} - {{link|JPEG}} network graphics format. A bitmap image file format. GIMP doesn't use this format yet but it would be nice to extend the MNG plug-in to use it and to add a dedicated JNG plug-in.
    See also [http://www.libpng.org/pub/mng/spec/jng.html specification]. + +*{{term | JPEG}} - +*:*Joint Photographic Experts Group. A lossy compression method standardised by the {{link|ISO}}. {{fn_ref|8}} +*:*An image file format and its filename extension, see {{link|JPEG JFIF}} + +*{{term | JPEG JFIF}} - an image file format (usually referred to as {{link|JPEG}}) for the transport of single JPEG-compressed images. It has three color channels (Red, Green, Blue) with a bit depth of 8 bit each. JPEG JFIF doesn't support transparency. It's most often used for photographs. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/file-jpeg JPEG plug-in] handles this format. + +*{{term | JPG}} - filename extension for {{link|JPEG JFIF}} images. + +{{right | {{link|Table of Contents}}}} + +==K== +*{{term | K (uppercase)}} - +*:*Kelvin. Unit of {{link|color temperature}} . +*:*Key-color component of the {{link|CMYK}} {{link|color model}} to represent various shades of {{link|brightness}} . Usually black. + +{{right | {{link|Table of Contents}}}} + +==L== +*{{term | L (uppercase)}} - The axis in the {{link|CIELAB}} {{link|color model}} which denotes the {{link|lightness}} component of the color. A low numerical value on this axis denotes a dark color and a high value a light color. + +*{{term | L*a*b*}} - synonym for {{link|CIELAB}} + +*{{term | Lab}} - synonym for {{link|CIELAB}} + +*{{term | LCMS}} - Little Color Management System. LCMS is an open-source color management engine with focus on small footprint, accuracy and performance. It uses the {{link|ICC specification}}.
    See also [http://www.littlecms.com/ the LCMS website]. + +*{{term | LGM}} - Libre Graphics Meeting. Annual conference of developers and users of graphics open source software. GIMP has been participating for many years.
    See also the [http://libregraphicsmeeting.org LGM website] + +*{{term | LGW}} - Libre Graphics World. LGW is an online magazine for creatives using free applications for digital painting, graphic and web design, desktop publishing, photography and CAD. Its focus are news, tutorials and articles to provide most up to date information about evolution of these applications and best practices. One of LGW's authors is [http://prokoudine.info/ Alexandre Prokoudine] (prokoudine at IRC)
    See also [http://libregraphicsworld.org/ LGW website]. + +*{{term | light, linear}} - light as it is in nature and captured by camera sensors (and thus is encoded in RAW images). + +*{{term | light, perceived}} - light as it is processed by eye and brain. The difference between linear and perceived light is that human eyes react to the same change of (linear) light with different sensitivity in dark or light environments. Perceived light is the basis of color (e.g. color is the result of light, processed by eyes and brain). + +*{{term | lightness}} - [COL] a number that corresponds to the human perception of reflected light from a surface (e.g. the {{link|brightness}} of a color relative to the {{link|brightness}} of a similar illuminated white area) {{fn_ref|1}} {{fn_ref|4}}. + +*{{term | link, dynamically}} - the process of creating a library that is not part of the program binary, but a separate file that is loaded at runtime. This makes it easy to reuse the same library for many programs. On the other hand, many versions of the same dynamic library can lead to usage of the wrong library version at runtime (the so-called DLL hell). Dynamically loaded libraries have the file extension .dll on Windows, .so on Linux and .dylib on OS X.
    See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +*{{term | link, statically}} - the process of creating a library that is included in the program binary and as such loaded at the same time with the program. Statically loaded libraries have the extension .lib on Windows, .a on Linux and OS X (until they get linked into the program).
    See also [http://stackoverflow.com/questions/311882/what-do-statically-linked-and-dynamically-linked-mean Stackoverflow article: What do 'statically linked' and 'dynamically linked' mean?]. + +*{{term | linker}} - a program to assemble single binary artifacts (so called 'object files') to a bigger piece of software (e.g. the program or a library). + +*{{term | LLVM}} - Low Level Virtual Machine. A collection of modular and reusable {{link|compiler}} and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines {{fn_ref|6}}. You can get it for Linux, Windows and FreeBSD 9 from the [http://llvm.org/releases/download.html LLVM download page]. On OS X LLVM is part of XCode 4.2 and later. LLVM's {{link|Clang}} is also the default {{link|C}} {{link|compiler}} in FreeBSD 10. + +*{{term | LMS}} - a color space model that describes colors in terms of the sensitivities of the three types of cone cells in the human eye, which have overlapping sensitivities to Long, Medium, and Short wavelengths of light. When chromatically adapting a color from one light source to another to maintain color constancy, the color is converted from {{link|XYZ|XYZ}} to LMS using a {{link|chromatic adaptation model|chromatic adaptation model}} such as the {{link|Bradford transform|Bradford transform}}. + +*{{term | lpi }} - lines per inch. measure of resolution or fineness of photo-mechanical reproduction.{{fn_ref|2}} + +*{{term | luma}} - the weighted sum of R', G' and B' color component (=in {{link|light, perceived | perceived light}}). It is often confused with {{link|luminance}} which actually refers to {{link|light, linear | linear light}}. [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] + +*{{term | luminance}} - +*:*the weighted sum of R, G and B color component (=in {{link|light, linear | linear light}}) [http://en.wikipedia.org/wiki/Luma_%28video%29 Wikipedia article] +*:*[COL] a measurement of the amount of light leaving the surface of an object in a particular direction. It is often expressed in candelas per square meter (cd/m2) {{fn_ref|1}}. + +*{{term | luminance, relative}} - {{link|luminance}} with numerical values normalized to 1...100 (100=reference white), see [http://en.wikipedia.org/wiki/Luminance_%28relative%29 Wikipedia]. + +*{{term | LUT}} - Look-Up Table. A key-value-table, which is queried with a key and returns the assigned value. Synonyms are map or dictionary. It's a convenient way to get the results of a time-consuming or stochastic function quickly. The downside is that it potentially uses more memory than a computation. + +*{{term | LUT profile}} - a color profile which internally uses a {{link|LUT}} to assign output color values to input color values. LUT profiles have a black and white point. For instance printer profiles are mostly LUT profiles. {{fn_ref|22}} + +{{right | {{link|Table of Contents}}}} + +==M== +*{{term | M (uppercase)}} - Magenta color component of the {{link|CMY}} and {{link|CMYK}} {{link|color model|color models}}. + +*{{term | make}} - a programming tool to control the generation of executables and other non-source files of a program from the program's source files. {{fn_ref|13}}
    See also [http://www.gnu.org/software/make/ GNU make website]. + +*{{term | Makefile}} - a text file to control {{link|make}}. It contains all the {{link|make target|make targets}}. In GIMP this file is generated from the Makefile.am file by the {{link|Autotools}}. + +*{{term | make target}} - a {{link|CLI}} set of commands for {{link|make}} to trigger various actions, e.g. compiling a program from the sources. + +*{{term | metadata}} - Information about a file, i.e. author, title, date and time of creation.
    See also [http://www.metadataworkinggroup.org/ website of the Metadata Working Group]. + +*{{term | meta operation}} - {{link|GEGL | [GEGL]}} a composite {{link|operation}}, i.e. an operation that consists of other operations. + +*{{term | mipmap}} - synonym for {{link|image pyramid}}. + +*{{term | Mired}} - former, obsolete unit of reciprocal {{link|color temperature}} . + +*{{term | MNG}} - Multiple-image Network Graphics. An image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-mng.c MNG plug-in] handles this format.
    See also [http://www.libpng.org/pub/mng/spec/ MNG specification]. + +*{{term | module}} - a part of GIMP providing optional functionality, such as input controllers, color selectors and display filters. Each module can be activated and deactivated in GIMP's Module manager; the changes apply at GIMPs next start. Technically a module is tightly integrated with the GIMP core. It is a shared object that runs in the GIMP process.
    See also [https://git.gnome.org/browse/gimp/tree/modules GIMP's modules], {{link|plug-in}}. + +{{right | {{link|Table of Contents}}}} + +==N== +*{{term | node}} - an element of a {{link|graph}}. In {{link|GEGL}} a node has an associated {{link|operation}} or can be a constructed {{link|graph}}. {{fn_ref|14}} + +{{right | {{link|Table of Contents}}}} + +==O== +*{{term | OpenCL}} - open standard for parallel programming of heterogeneous systems, i.e. using additional CPU processors or {{link|GPU computing}}. OpenCL requires a driver from the manufacturer of the CPU or GPU. {{link|GEGL}} uses OpenCL to improve its own performance.
    See also [http://www.khronos.org/opencl/ OpenCL website], [[#Hacking:Porting_filters_to_GEGL | GEGL porting matrix]]. + +*{{term | OpenICC}} - a open source software project with two main goals. The first goal is to work out a common set of settings for color savvy applications to share profiles and settings. The second goal is to bring together those developers in areas like printing, display and desktop applications to work together to make {{link|color management}} end to end work for open source applications.{{fn_ref|21}}
    See also: [http://freedesktop.org/wiki/OpenIcc/ website] + +*{{term | operation}} - {{link|GEGL | [GEGL]}}The processing primitive of GEGL, it is where the actual image processing takes place. Operations are plug-ins and provide the actual functionality of GEGL {{fn_ref|14}} + +*{{term | out-of-tree-build}} - synonym for {{link|VPATH build}} + +*{{term | output pad}} - {{link|GEGL | [GEGL]}} a {{link|pad}} where data can be requested, multiple {{link|input pad|input pads}} can reference the same output pad. {{fn_ref|14}} + +{{right | {{link|Table of Contents}}}} + +==P== +*{{term | pad}} - {{link|GEGL | [GEGL]}} The part of a {{link|node}} that exchanges image content. The place where image "pipes" are used to connect the various operations in the composition. {{fn_ref|14}}
    See also {{link|input pad}}, {{link|output pad}}. + +*{{term | PCS}} - Profile Connection Space. The reference {{link|color space}} to convert from one ICC profile to another. Its purpose is to exchange color information across various devices. Usual PCS's are {{link|CIELAB|LAB}} and {{link|XYZ}}. The image editing RGB color spaces like {{link|sRGB}} use XYZ. + +*{{term | PDB}} - Procedural DataBase. The PDB (Procedural DataBase) is the most important interface to access the image manipulation functions of GIMP. The libgimp library provides some functions to call functions from the PDB or enter new functions into the PDB.
    See also [https://git.gnome.org/browse/gimp/tree/app/pdb PDB source code]. + +*{{term | Perl}} - a programming language. Perl programs are interpreted. The filename extension is .pl. GIMP itself uses it to generate {{link|PDB}} interfaces from plug-ins, see the Perl files in [https://git.gnome.org/browse/gimp/tree/plug-ins/common /plug-ins/common] and [https://git.gnome.org/browse/gimp/tree/tools/pdbgen /tools/pdbgen]. Aside from that there's {{link|GIMP-Perl}}, which is a separate GIMP plug-in.
    See also [http://www.perl.org/ Perl website]. + +*{{term | plug-in}} - an optional part of GEGL and GIMP, providing extra functionality, like filters and file loaders/savers. GIMP plug-ins are programmed in {{link|C}} or {{link|Python}}. Plugins are limited mostly to accessing image data. +:The difference to {{link|script|scripts}} is not functional, but only technical. In fact, GIMP's {{link|Script-Fu}} interpreter is a plug-in. +:The difference to {{link|module|modules}} is that modules tend to be more tightly integrated with the GIMP core, while plug-ins are almost standalone. Modules are shared objects that run in the GIMP process, while plug-ins are separate executables, which are run in a different process. This means that a crashing module will crash GIMP, while a crashing plug-in doesn't cause GIMP to crash.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins GIMP's plug-ins], [http://registry.gimp.org/ GIMP plug-in registry] + +*{{term | PNG}} - Portable Network Graphics. A bitmap image file format. In GIMP the [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-png.c PNG plug-in] handles this format. GIMP also reads patterns in the PNG file format and it stores thumbnails as PNG images.
    See also [http://www.w3.org/TR/PNG/ PNG specification]. + +*{{term | ppi}} - points per inch; pixels per inch: Measure of input resolution e.g. of scanning device, measured as the number of points on the object at which a sample or measure is taken or which are resolved by the device per linear inch on a given axis: e.g. 600ppi means six hundred points per inch, usually along the axis of the scanner sensor. {{fn_ref|2}} Increasing the PPI count increases the image quality up to a certain degree: whether an image is perceived as fine or coarse granular also depends on the sensitivity of the human eye and the distance between eye and image. Image quality also depends on the contrast and the smoothness of the tonal values.
    See also {{link|dpi}}, {{link|lpi}}. + +* {{term | PS}} - Adobe Photoshop, a widely used, high-end image manipulation application in the commercial sector. Photoshop is available for Windows and OS X computers. Modified variants, such as Photoshop Express and Photoshop Touch, are available for mobile devices. Note that - although GIMP is often seen as Photoshop competitor - GIMP is not a for-free-Photoshop copy {{fn_ref|23}}. + +*{{term | PSB}} - Photoshop Big. Adobe Photoshop's native file format for large documents with up to 300.000 Pixels in any dimension, otherwise identically to {{link|PSD}}. GIMP currently doesn't support PSB. + +*{{term | PSD}} - Photoshop Document. Adobe Photoshop's native file format for images with up to 30.000 Pixels in any dimension. GIMP has basic support reading and writing PSD files. Advanced PS features with no equivalent in GIMP such as adjustment layers and layer effects are currently not supported.
    See also [https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification]. + +*{{term | primary}} - abbreviation for primary color, e.g. one of the colors in a {{link|color model}} of which all other colors are mixed from. In {{link|RGB}} these are Red, Green and Blue while in {{link|CMY}} these are Cyan, Magenta and Yellow. + +*{{term | property}} - {{link|GEGL | [GEGL]}} an attribute that controls the behavior of an {{link|operation}}. Through the use of [https://developer.gnome.org/gobject/unstable/gobject-GParamSpec.html GParamSpecs] properties are self documenting via introspection. {{fn_ref|14}} + +*{{term | Python}} - a programming language. Python programs are usually interpreted. GIMP uses Python for [https://git.gnome.org/browse/gimp/tree/plug-ins/pygimp/plug-ins plug-ins], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/servertest.py the test driver for the Script-Fu server] and [https://git.gnome.org/browse/gimp/tree/tools some tools].
    See also [http://python.org/ Python website]. + +{{right | {{link|Table of Contents}}}} + +==Q== +{{term | QA}} - Quality Assurance. Actions to ensure quality during production. For software products these include for instance involvement of users and other relevant stakeholders, proper design of interactional and technical architectures, obeying coding standards, reviews and tests. + +{{right | {{link|Table of Contents}}}} + +==R== +*{{term | R (uppercase)}} - Red color channel in the {{link|RGB}} {{link|color model}}. + +*{{term | RaGaBaA}}- {{link|babl | [babl]}} a {{link|color model}} with the {{link|alpha}} premultiplied channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, linear | linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | R'aG'aB'aA}}- {{link|babl | [babl]}} a {{link|color model}} with the {{link|alpha}} premultiplied channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, perceived | perceived light}}. + +*{{term | Recent File Storage Specification}} - Provides a standard mechanism for storing a list of recently used files. Supported since GIMP version 2.1.6.
    See also [http://standards.freedesktop.org/recent-file-spec/recent-file-spec-latest.html detailed Recent File Storage specification]. + +*{{term | refactoring}} - to improve a small piece of code without neither changing its results nor introducing side effects.
    See also: [http://refactoring.com/ Martin Fowlers website on refactoring] + +*{{term | repository}} - the database in a {{link|Version Control System|version control system}} that contains all the file history. + +*{{term | resolution}} (from {{fn_ref|2}}) - +*:* For input devices e.g. cameras, scanners: measure of the ability of a system to reproduce details present in a subject so that they are in the image. Measure of highest spatial frequency which can be recorded by the system.
    Units: total number of usable pixels for digital cameras; {{link|ppi}} for scanners; line pairs per millimetre for objectives (not to be confused with {{link|lpi}}!). +*:* For output devices e.g. printers, film-writers: measure of system's ability to address or refer to separate points or lines of output.
    Unit: {{link|dpi}}. +*:* Measure of system's ability to distinguish variations in colors or of density.
    Unit: bit depth (total number of bits available for encoding values). +*:* For positioning or focusing mechanisms: the minimum repeatable adjustment increment achievable. + +*{{term | RGB}} - generally and in {{link|babl}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}}. It operates in {{link|light, linear | linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | R'G'B'}} - {{link|babl | [babl]}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}}. It operates in {{link|light, perceived | perceived light}} with an sRGB {{link|TRC}} which is roughly perceptually uniform.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | RGBA}} - generally and in {{link|babl}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, linear | linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/babl-core.c source code] + +*{{term | R'G'B'A}} - {{link|babl | [babl]}} a {{link|color model}} with the channels {{link|R (uppercase | R}},{{link|G (uppercase) | G}},{{link|B (uppercase) | B}} and {{link|alpha}}. It operates in {{link|light, perceived | perceived light}} with an sRGB {{link|TRC}} which is roughly perceptually uniform.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-rgb.c source code] + +*{{term | ROI}} - {{link|GEGL | [GEGL]}} - region of interest. It's the area you're currently working on in your GEGL operation. + +{{right | {{link|Table of Contents}}}} + +==S== +*{{term | saturation}} - colorfulness of an area judged in proportion to its {{link|brightness}} {{fn_ref|4}}
    See also: {{link|chroma}} + +*{{term | Scheme }} - a programming language. The current standard version is R6RS, while the {{link|TinyScheme}}, the version in GIMP implements a subset of the older version R5RS. The coming standard R7RS is [http://scheme-reports.org/ work in progress].
    See also [http://people.csail.mit.edu/jaffer/r5rs_toc.html Scheme R5RS language description]. + +*{{term | scRGB }} - an extended {{link|RGB}} {{link|color space}}. In {{link|GEGL}} most operations work in scRGB using 32bit floating point/HDR {{link|light, linear|linear light}} {{link|RGBA}}.{{fn_ref|18}}
    See also [http://webstore.iec.ch/webstore/webstore.nsf/artnum/029678 scRGB specification (charged)], [http://www.color.org/chardata/rgb/scrgb.xalter short overview at ICC], [http://en.wikipedia.org/wiki/ScRGB_color_space Wikipedia:scRGB]. + +*{{term | script}} - a little program in {{link|Script-Fu}}. Scripts add optional extra functionality to GIMP. They have the filename extension .scm.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's scripts], {{link|plug-in|distinction to plug-ins}}, [http://registry.gimp.org/ GIMP plug-in registry]. + +*{{term | Script-Fu}} - a {{link|Scheme}} dialect. Developers can use Script-Fu for writing user-defined extensions. GIMP then interprets them using {{link|TinyScheme}} and {{link|FTX}}.
    See also [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/scripts GIMP's Script-Fu scripts], [http://www.gimp.org/docs/scheme_plugin/ Script-Fu tutorial]. + +*{{term | Shared MIME Database}} - The shared MIME database contains common MIME types, descriptions, and rules for determining the types of files. GIMP file plug-ins should use the MIME types and descriptions defined here.
    See also [http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html Shared MIME Database specification]. + +*{{term | sRGB}} - the default {{link|color space}} for the internet and other interested vendors.
    See also [http://www.w3.org/Graphics/Color/sRGB detailed description at W3C]. + +*{{term | Startup Notification}} - Specifies a mechanism allowing a desktop environment to track application startup to provide user feedback. {{link|GTK+}} provides support for this protocol.
    See also [http://standards.freedesktop.org/startup-notification-spec/startup-notification-latest.txt Startup Notification specification]. + +*{{term | Subversion}} - a {{link|Version Control System|version control system}} the {{link|GNOME}} project used before it was superseded with {{link|Git}} in 2009. + +*{{term | SVG 1.1}} - Scalable Vector Graphics. A vector graphics format. GIMP uses it to import vector graphics, import and export paths and load gradients from SVG files. In GIMP the SVG plug-in handles this format. To create standards conform SVG graphics with free, open source software you can use [http://www.inkscape.org Inkscape] for instance.
    See also [http://www.w3.org/TR/SVG/ W3C recommendation] + +*{{term | SVN}} - abbreviation for {{link|Subversion}}. + +{{right | {{link|Table of Contents}}}} + +==T== +*{{term | Thumbnail Managing Standard}} - Deals with the permanent storage of previews for file content. In particular, it tries to define a general and widely accepted standard for this task. GIMP implements this standard and dropped support for the old-fashioned .xvpics.
    See also [http://web.archive.org/web/20110818223906/http://jens.triq.net/thumbnail-spec/ Thumbnail Managing Standard specification]. + +*{{term | TIFF 6.0}} - Tagged Image File Format.
    See also [http://partners.adobe.com/public/developer/tiff/ TIFF specification and other developer resources], [http://www.awaresystems.be/imaging/tiff.html Unofficial TIFF home page]. + +*{{term | tile}} - {{link|GEGL | [GEGL]}} Functionally a rectangular part of an {{link|operation|operation's}} input, intermediate or output data. Technically tiles are internal implementation parts of GEGL buffers, i.e. not exposed in the GEGL buffer {{link|API|APIs}}. {{fn_ref|14}} + +*{{term | tile backend}} - {{link|GEGL | [GEGL]}} the implementation of pixel storage for a GeglBuffer (synonymous to a file system driver in an operating system). There are backends storing each tile as separate files, all tiles of a buffer in a file, communicate over gimps wire-protocol for plug-ins to operate on GeglBuffers where the tiles are stored in the main {{link|GIMP}} process. Other possible tile backends could communicate over the network to fetch spatial tiles from map providers (OpenStreetMap etc.) + +*{{term | TinyScheme}} - a lightweight {{link|Scheme}} interpreter that implements a subset of the [http://people.csail.mit.edu/jaffer/r5rs_toc.html R5RS Scheme standard]. GIMP uses it to interpret {{link|Script-Fu}}. One of its maintainers is Kevin Cozens (kevin in IRC)
    See also [http://tinyscheme.sourceforge.net/home.html TinyScheme website], [https://git.gnome.org/browse/gimp/tree/plug-ins/script-fu/tinyscheme TinyScheme in GIMP]. + +*{{term | TRC}} - Tone Response Curve. A curve describing the signal response of the eye or an sensor to changes in {{link|light, linear | linear light}} and as such the foundation for {{link|light, perceived | perceived light}}. + +{{right | {{link|Table of Contents}}}} + +==U== +*{{term | UI}} - user interface. The part of the program the user interacts with.
    See also: {{link|CLI}}, {{link|GUI}}. + +{{right | {{link|Table of Contents}}}} + +==V== +*{{term | Value}} - +*:* Level of {{link|brightness}} of a pixel or color as defined in HSV {{link|color model}}. {{fn_ref|2}} +*:* Designation of {{link|lightness}} of color in the Munsell system of color nomenclature. {{fn_ref|2}} +*:* Tone or {{link|brightness}} of a color as assessed subjectively: high values give light colors, low value colors appear dark.{{fn_ref|2}} +*:* [photo] in the Zone System the step or zone which corresponds to a certain range of subject {{link|brightness}}. {{fn_ref|2}} +*:* [photo] Camera setting or range of settings based on scales of shutter time, lens aperture, exposure value, {{link|luminance}} and film speed. {{fn_ref|2}} + +*{{term | VCS}} - abbreviation of {{link|Version Control System}}. + +*{{term | Version Control System}} - a software system that records all changes to arbitrary files and file sets over time. It's allows you to recall specific versions later, compare versions, review changes made over time, find out who last modified something or which change introduced a bug, revert changes etc.{{fn_ref|16}} We use {{link|Git}} for managing the {{link|babl}}, {{link|GEGL}} and {{link|GIMP}} source code and documentation. + +*{{term | VPATH build}} - an {{link|Autotools}} build outside the source directory. Example: given the sources are in $HOME/src, then the compiled files could for instance be in $HOME/build.
    See also [http://www.gnu.org/software/automake/manual/html_node/VPATH-Builds.html VPATH Builds in the Automake documentation] + +{{right | {{link|Table of Contents}}}} + +==W== +*{{term | W3C}} - World Wide Web Consortium. The W3C is an international community where member organizations, a full-time staff, and the public work together to develop web standards, such as {{link | SVG 1.1}}, {{link|XML}} and {{link|XSL}}. {{fn_ref|10}} + +*{{term | wgo}} - GIMP's main website [http://www.gimp.org www.gimp.org]. + +* {{term | Wilber}} - +*:* The nick name of the IRC chatbot.
    See also: [http://supybook.fealdia.org/devel/ Supybook Supybot command reference]. +*:* GIMP's mascot. +:[[File:Wilber.png|Wilber, the GIMP mascot]] + +*{{term | white point}} - the light-source's or sensor's interpretation of white. Practically it's a synonym for {{link|color temperature}}.
    See also [http://eilv.cie.co.at/term/1430 CIE's definition], [http://www.colorwiki.com/wiki/White_Point ColorWiki]. + +{{right | {{link|Table of Contents}}}} + +==X== +*{{term | XCF}} - eXperimental Computing Facility, the origin of GIMP. +*:*GIMP's file format.
    See also [https://git.gnome.org/browse/gimp/tree/devel-docs/xcf.txt GIMP's XCF specification draft], [https://git.gnome.org/browse/gimp/tree/app/xcf source code]. +*:*Cinepaint's derivative of GIMP's XCF file format. Both are incompatible.{{fn_ref|20}}
    See also [http://www.cinepaint.org/more/docs/xcf.html Cinepaint's XCF specification and differences to GIMP] + +*{{term | XDND}} - Drag-and-Drop Protocol for the X Window System. XDND defines a standard for drag and drop on X11. It is implemented by {{link|GTK+}}.
    See also [http://freedesktop.org/Standards/XDND XDND specification]. + +*{{term | XDS}} - Direct Save Protocol for the X Window System. XDS defines an extension to {{link|XDND}} that allow users to save a file by simply dragging it to a file manager window. GIMP supports this protocol since version 2.4.
    See also [http://web.archive.org/web/20060924165119/http://freedesktop.org/wiki/Standards_2fdirect_2dsave XDS specification]. + +*{{term | XML}} - Extensible Markup Language. Describes the markup language used to store the [https://git.gnome.org/browse/gimp/tree/menus menu layout], the [https://git.gnome.org/browse/gimp/tree/data/tips/gimp-tips.xml.in startup tips], {{link|Docbook}} documents and other.
    See also [http://www.w3.org/XML/ XML overview page at W3C], written by Liam Quin (Ankh in IRC) + +*{{term | XMP}} - Extensible Metadata Platform. A labeling technology that allows to store {{link|metadata}}. This information is either embedded in the file itself or as separate file (a so-called XMP sidecar file).
    See also [http://partners.adobe.com/public/developer/en/xmp/sdk/XMPspecification.pdf XMP specification], [http://www.adobe.com/products/xmp/index.html XMP description at Adobe] + +*{{term | XSETTINGS}} - The XSETTINGS protocol provides a mechanism for applications written with different toolkits to share simple configuration settings such as double-click-times and background colors. {{link|GTK+}} hides this from us.
    See also [http://standards.freedesktop.org/xsettings-spec/xsettings-spec-0.5.html XSETTINGS specification]. + +*{{term | XSL}} - Extensible Stylesheet Language Family. XSL is a family of recommendations for defining XML document transformation and presentation. It consists of the parts {{link|XSLT}}, {{link|XML}} Path Language (XPath) and XSL Formatting Objects (XSL-FO).
    See also: [http://www.w3.org/Style/XSL/ XSL website at W3C]. + +*{{term | XSLT}} - {{link|XSL Transformations}}, a language for transforming {{link|XML}} documents into other formats, such as HTML, program code or plain text. GIMP uses XSLT to generate [https://git.gnome.org/browse/gimp/tree/menus/menus.xsl menus], [https://git.gnome.org/browse/gimp/tree/data/tips/fortunes.xsl startup tips] and [https://git.gnome.org/browse/gimp/tree/authors.xsl author attribution].
    See also [http://www.w3.org/TR/xslt W3C recommendation]. + +*{{term | XYZ}} - {{link|color model}}, based on experimental observations on humans (the '{{link|CIE}} standard observer'). It operates in {{link|light, linear | linear light}}. + +{{right | {{link|Table of Contents}}}} + +==Y== +*{{term | Y (uppercase)}} - +*:*Yellow color component of the {{link|CMY}} and {{link|CMYK}} {{link|color model|color models}}. +*:*{{link|babl | [babl]}}: grayscale {{link|color model}} or {{link|lightness}} component in a {{link|color model}}. It's in {{link|light, linear|linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] +*:*{{link|luminance, relative | relative luminance}} in {{link|XYZ}} {{link|color model}}. +*:*{{link|luminance}} in xyY {{link|color model}}. + +*{{term | Y' (uppercase)}} - *:*{{link|babl | [babl]}}: grayscale {{link|color model}} or {{link|lightness}} component in a {{link|color model}}. It's in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | YA}} - {{link|babl|[babl]}} a {{link|color model}} with the components {{link|Y (uppercase)|Y}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, linear|linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | YaA}} - {{link|babl|[babl]}} a {{link|color model}} with the components alpha-premultiplied {{link|Y (uppercase)|Y}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, linear|linear light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | Y'A}} - {{link|babl|[babl]}} a {{link|color model}} with the components {{link|Y' (uppercase)|Y'}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | Y'aA}} - {{link|babl|[babl]}} a {{link|color model}} with the components alpha-premultiplied {{link|Y' (uppercase)|Y'}} and {{link|A (uppercase)|A}}, e.g. grayscale and alpha. It operates in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-gray.c source code] + +*{{term | YCbCr}} - a {{link|color model}} with the components {{link|Y (uppercase)|Y}} {{link|luma|(luminance)}}, {{link|Cb}} and {{link|Cr}}. Unlike RGB it encodes the image information in luminance (channel Y) and chrominance (channels Cb and Cr). YCbCr operates in {{link|light, linear|linear light}}. It is used for digital video and has good image compression capabilities. + +*{{term | Y'CbCr}} - +*:*a {{link|color model}} with the components {{link|Y' (uppercase)|Y'}} {{link|luma|(luma)}}, {{link|Cb}} and {{link|Cr}}. It operates in {{link|light, perceived|perceived light}}. It is used for digital video and has good image compression capabilities. +*:*{{link|babl|[babl]}} implementation of the Y'CbCr color model.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +*{{term | Y'CbCrA}} - {{link|babl|[babl]}} {{link|color model}} with the components {{link|Y' (uppercase)|Y'}} {{link|luma|(luma)}}, {{link|Cb}}, {{link|Cr}} and {{link|A (uppercase)|A}}. It operates in {{link|light, perceived|perceived light}}.
    See also [https://git.gnome.org/browse/babl/tree/babl/base/model-ycbcr.c source code] + +*{{term | YCC}} - abbreviation of {{link|YCbCr}}. + +*{{term | YIQ}} - {{link|color model}} which separates {{link|luminance}} (Y component) from {{link|chroma}} (I, Q components). It is used for analog TV (NTSC in the U.S.) and thus irrelevant for digital image editing. + +*{{term | YPbPr}} - the analog equivalent to {{link|YCbCr}} and thus irrelevant for digital image editing. + +*{{term | YUV}} - {{link|color model}} which separates {{link|luminance}} (Y component) from {{link|chroma}} (U, V components). It is used for analog TV (PAL in Europe) and thus irrelevant for digital image editing. + +{{right | {{link|Table of Contents}}}} + +==Z== +{{right | {{link|Table of Contents}}}} + +==References== + + +
      +{{fn|1|[http://www.colorwiki.com/wiki/Category:Glossary CHROMiX ColorWiki]}} +{{fn|2|[http://www.idigitalphoto.com/dictionary/ idigitalphoto Photography Dictionary]}} +{{fn|3|[http://en.wikipedia.org/wiki/HSL_and_HSV Wikipedia:HSL and HSV]}} +{{fn|4|CIE: [http://eilv.cie.co.at/ e-ILV: International Lighting Vocabulary]}} +{{fn|5|Michael Larabel: [http://www.phoronix.com/scan.php?page=news_item&px=MTEwMjI FreeBSD 10 To Use Clang Compiler, Deprecate GCC]}} +{{fn|6|[http://www.llvm.org LLVM website]}} +{{fn|7|Clang Team: [http://clang.llvm.org/docs/CrossCompilation.html Cross-compilation using Clang]}} +{{fn|8|W3C, Chris Lilley: [http://www.w3.org/Graphics/JPEG/ JPEG JFIF]}} +{{fn|9|ICC: [http://www.color.org/abouticc.xalter About ICC]}} +{{fn|10|[http://wwww.w3.org W3C website]}} +{{fn|11|[http://www.gnome.org GNOME website]}} +{{fn|12|[http://www.iso.org ISO website]}} +{{fn|13|[http://www.gnu.org/software/make/ GNU Make website]}} +{{fn|14|[http://gegl.org/#_glossary GEGL glossary]}} +{{fn|15|Lance, Williams: [http://staff.cs.psu.ac.th/iew/cs344-481/p1-williams.pdf Pyramidal parametrics], Computer Graphics 7.3 (1983): 1-11.}} +{{fn|16|Scott Chacon: [http://git-scm.com/book/en/Getting-Started-About-Version-Control Getting Started About Version Control], licensed under [http://creativecommons.org/licenses/by-nc-sa/3.0/ CC BY-NC-SA 3.0]}} +{{fn|17|Lucas Rocha, [https://mail.gnome.org/archives/devel-announce-list/2009-March/msg00005.html Announcement at GNOME's devel-announce-list], 19.03.2009}} +{{fn|18|[http://www.gegl.org GEGL website]}} +{{fn|19|[http://www.gtk.org GTK+ website]}} +{{fn|20|[http://www.linuxdevcenter.com/pub/a/linux/2004/04/29/cinepaint.html?page=2 Linux Devcenter: Developer interview: Robin Rowe and Andrew Prock on Cinepaint]}} +{{fn|21|[http://freedesktop.org/wiki/OpenIcc/ OpenICC website]}} +{{fn|22|Stone, Elle: [http://ninedegreesbelow.com/photography/xyz-rgb.html Completely Painless Programmer's Guide to XYZ, RGB, ICC, xyY, and TRCs ]}} +{{fn|23|The GIMP team: [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision Produkt vision]}} +
    +{{right | {{link|Table of Contents}}}} + +==Trademarks== +Adobe, Photoshop, Photoshop Express and Photoshop Touch are either trademarks or registered trademarks of Adobe Systems Incorporated in the United States and/or other countries. Apple and OS X are trademarks of Apple Computer, Inc. registered in the United States and other countries. Microsoft and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. Linux is the registered trademark of Linus Torvalds in the U.S. and other countries. All other products are the property of their respective owners. + +{{right | {{link|Table of Contents}}}} diff --git a/wiki/Graphic_tablets_support-20210622010105-edit.txt b/wiki/Graphic_tablets_support-20210622010105-edit.txt new file mode 100644 index 0000000..5d4e215 --- /dev/null +++ b/wiki/Graphic_tablets_support-20210622010105-edit.txt @@ -0,0 +1,21 @@ += Windows = + +{| class="wikitable sortable" style="text-align: left;" +!'''Brand''' || '''Model''' || '''Version of GIMP''' || '''Version of OS''' || '''Status''' +|- +| Genius || MousePen 8x6 || 2.10.6 || ? || Not supported +|- +| Huion || 1060P || 2.10.8 || 7 || Not supported +|- +| Wacom || One (CTL-671) || 2.10.8 || 7 || Supported +|- +|} + += macOS = + +{| class="wikitable sortable" style="text-align: left;" +!'''Brand''' || '''Model''' || '''Version of GIMP''' || '''Version of OS''' || '''Status''' +|- +| ? || ? || 2.10.? || ? || ? +|- +|} diff --git a/wiki/Hacking:API_documentation-20201124150526-edit.txt b/wiki/Hacking:API_documentation-20201124150526-edit.txt new file mode 100644 index 0000000..ced03ec --- /dev/null +++ b/wiki/Hacking:API_documentation-20201124150526-edit.txt @@ -0,0 +1,53 @@ +There are several ways to get GIMP's API documentation. + +* Read it [http://developer.gimp.org/api/2.0/index.html online]. +* Download the archives from [https://gimptest.flamingtext.com:9090/view/AllDownloads/ our continuous integration server]. They are in the column 'Developer documentation'. +* Generate it yourself: + +:{| +| 1. || '''configure --prefix=$PREFIX --enable-gtk-doc --enable-gtk-doc-app''' +|- +| || If you got the sources directly from the Git repository, use '''autogen.sh''' instead of configure. +|- +| || The parameters have the following meaning: +|- +| ||--enable-gtk-doc : use gtk-doc to build documentation +|- +| || --enable-gtk-doc-app : build developer documentation for app (not only the libgimp* libraries). +|- +| || To find out more parameters, run '''configure --help''' +|- +| || ''$PREFIX'' is a variable for the directory you will install GIMP in. +|- +|2. ||'''make''' +|- +|3. || '''make install''' +|- +|4. || '''cd $PREFIX/share/gtk-doc/html''' +|- +|5. || From the desired subdirectory open the file ''index.html'' for an overview of that module. +|} + + + + +* Generate and browse the Gimp API docs, for a language binding, from your local GI repository: + +This assumes you are a builder, +have installed tools for GObject Introspection such as g-ir-doc-tool, +have installed the Gnome help tool yelp, and that when you built or installed Gimp it created the .gir files. + +:{| +| 1. || '''g-ir-doc-tool --language=Python -o ~/gimp-python-docs /usr/local/share/gir-1.0/Gimp-3.0.gir''' +|- +| || The parameters have the following meaning: +|- +| || --language=Python : generate docs for Python programmers (try C, Lua, JS, ... ?) +|- +| || -o : where to store the output document (in .xml format) +|- +| || /usr/... the .gir xml file to generate docs from (try Gegl-1.0, Babl-1.0, ...) +|- +|2. ||'''yelp ~/gimp-python-docs''' +|- +|} diff --git a/wiki/Hacking:API_documentation-20210513021905-edit.txt b/wiki/Hacking:API_documentation-20210513021905-edit.txt new file mode 100644 index 0000000..ced03ec --- /dev/null +++ b/wiki/Hacking:API_documentation-20210513021905-edit.txt @@ -0,0 +1,53 @@ +There are several ways to get GIMP's API documentation. + +* Read it [http://developer.gimp.org/api/2.0/index.html online]. +* Download the archives from [https://gimptest.flamingtext.com:9090/view/AllDownloads/ our continuous integration server]. They are in the column 'Developer documentation'. +* Generate it yourself: + +:{| +| 1. || '''configure --prefix=$PREFIX --enable-gtk-doc --enable-gtk-doc-app''' +|- +| || If you got the sources directly from the Git repository, use '''autogen.sh''' instead of configure. +|- +| || The parameters have the following meaning: +|- +| ||--enable-gtk-doc : use gtk-doc to build documentation +|- +| || --enable-gtk-doc-app : build developer documentation for app (not only the libgimp* libraries). +|- +| || To find out more parameters, run '''configure --help''' +|- +| || ''$PREFIX'' is a variable for the directory you will install GIMP in. +|- +|2. ||'''make''' +|- +|3. || '''make install''' +|- +|4. || '''cd $PREFIX/share/gtk-doc/html''' +|- +|5. || From the desired subdirectory open the file ''index.html'' for an overview of that module. +|} + + + + +* Generate and browse the Gimp API docs, for a language binding, from your local GI repository: + +This assumes you are a builder, +have installed tools for GObject Introspection such as g-ir-doc-tool, +have installed the Gnome help tool yelp, and that when you built or installed Gimp it created the .gir files. + +:{| +| 1. || '''g-ir-doc-tool --language=Python -o ~/gimp-python-docs /usr/local/share/gir-1.0/Gimp-3.0.gir''' +|- +| || The parameters have the following meaning: +|- +| || --language=Python : generate docs for Python programmers (try C, Lua, JS, ... ?) +|- +| || -o : where to store the output document (in .xml format) +|- +| || /usr/... the .gir xml file to generate docs from (try Gegl-1.0, Babl-1.0, ...) +|- +|2. ||'''yelp ~/gimp-python-docs''' +|- +|} diff --git a/wiki/Hacking:API_documentation-20210818153228-show.txt b/wiki/Hacking:API_documentation-20210818153228-show.txt new file mode 100644 index 0000000..f701c00 --- /dev/null +++ b/wiki/Hacking:API_documentation-20210818153228-show.txt @@ -0,0 +1,59 @@ + + +There are several ways to get GIMP's API documentation. + + +* Read it [http://developer.gimp.org/api/2.0/index.html online]. +* Download the archives from [https://gimptest.flamingtext.com:9090/view/AllDownloads/ our continuous integration server]. They are in the column 'Developer documentation'. +* Generate it yourself: +: +{| class="wikitable" +|- +| 1. | '''configure --prefix=$PREFIX --enable-gtk-doc --enable-gtk-doc-app''' +|- +| | If you got the sources directly from the Git repository, use '''autogen.sh''' instead of configure. +|- +| | The parameters have the following meaning: +|- +| | --enable-gtk-doc : use gtk-doc to build documentation +|- +| | --enable-gtk-doc-app : build developer documentation for app (not only the libgimp* libraries). +|- +| | To find out more parameters, run '''configure --help''' +|- +| | ''$PREFIX'' is a variable for the directory you will install GIMP in. +|- +| 2. | '''make''' +|- +| 3. | '''make install''' +|- +| 4. | '''cd $PREFIX/share/gtk-doc/html''' +|- +| 5. | From the desired subdirectory open the file ''index.html'' for an overview of that module. +|} + + + + + +* Generate and browse the Gimp API docs, for a language binding, from your local GI repository: + +This assumes you are a builder, +have installed tools for GObject Introspection such as g-ir-doc-tool, +have installed the Gnome help tool yelp, and that when you built or installed Gimp it created the .gir files. + +: +{| class="wikitable" +|- +| 1. | '''g-ir-doc-tool --language=Python -o ~/gimp-python-docs /usr/local/share/gir-1.0/Gimp-3.0.gir''' +|- +| | The parameters have the following meaning: +|- +| | --language=Python : generate docs for Python programmers (try C, Lua, JS, ... ?) +|- +| | -o  : where to store the output document (in .xml format) +|- +| | /usr/... the .gir xml file to generate docs from (try Gegl-1.0, Babl-1.0, ...) +|- +| 2. | '''yelp ~/gimp-python-docs''' +|} diff --git a/wiki/Hacking:API_documentation-20210818153245-show.txt b/wiki/Hacking:API_documentation-20210818153245-show.txt new file mode 100644 index 0000000..f701c00 --- /dev/null +++ b/wiki/Hacking:API_documentation-20210818153245-show.txt @@ -0,0 +1,59 @@ + + +There are several ways to get GIMP's API documentation. + + +* Read it [http://developer.gimp.org/api/2.0/index.html online]. +* Download the archives from [https://gimptest.flamingtext.com:9090/view/AllDownloads/ our continuous integration server]. They are in the column 'Developer documentation'. +* Generate it yourself: +: +{| class="wikitable" +|- +| 1. | '''configure --prefix=$PREFIX --enable-gtk-doc --enable-gtk-doc-app''' +|- +| | If you got the sources directly from the Git repository, use '''autogen.sh''' instead of configure. +|- +| | The parameters have the following meaning: +|- +| | --enable-gtk-doc : use gtk-doc to build documentation +|- +| | --enable-gtk-doc-app : build developer documentation for app (not only the libgimp* libraries). +|- +| | To find out more parameters, run '''configure --help''' +|- +| | ''$PREFIX'' is a variable for the directory you will install GIMP in. +|- +| 2. | '''make''' +|- +| 3. | '''make install''' +|- +| 4. | '''cd $PREFIX/share/gtk-doc/html''' +|- +| 5. | From the desired subdirectory open the file ''index.html'' for an overview of that module. +|} + + + + + +* Generate and browse the Gimp API docs, for a language binding, from your local GI repository: + +This assumes you are a builder, +have installed tools for GObject Introspection such as g-ir-doc-tool, +have installed the Gnome help tool yelp, and that when you built or installed Gimp it created the .gir files. + +: +{| class="wikitable" +|- +| 1. | '''g-ir-doc-tool --language=Python -o ~/gimp-python-docs /usr/local/share/gir-1.0/Gimp-3.0.gir''' +|- +| | The parameters have the following meaning: +|- +| | --language=Python : generate docs for Python programmers (try C, Lua, JS, ... ?) +|- +| | -o  : where to store the output document (in .xml format) +|- +| | /usr/... the .gir xml file to generate docs from (try Gegl-1.0, Babl-1.0, ...) +|- +| 2. | '''yelp ~/gimp-python-docs''' +|} diff --git a/wiki/Hacking:Basic_build-20150912093455-show.txt b/wiki/Hacking:Basic_build-20150912093455-show.txt new file mode 100644 index 0000000..ace34e9 --- /dev/null +++ b/wiki/Hacking:Basic_build-20150912093455-show.txt @@ -0,0 +1,76 @@ + +'''page is being written; please be patient''' + + +==Introduction== + +This page describes how to set up an environment to build Gimp from source, to get the source, and to +build Gimp (and the necessary prerequisites). + +The goal will be to keep the Gimp development environment separate from the rest of the system, to make +sure that instabilities in the Gimp development code do not impact the system as a whole. It will allow +you to keep using a stable Gimp version while working on the development version. + +The initial description on this page is based on working on Linux. Developers with +experience developing on other systems are encourage to add details. + + +* Define the Development Environment +* Getting the necessary source +* Running autoconf / configure +* Running make / make install +* References + +==Define the Development Environment== + +The first decision to make is where to set up the Gimp development environment. For instance, you could +create a directory gimpdev under your home directory, or maybe you have a different +place on your system where you do all your development work. Personally, I do all my development on a +separately mounted drive at /mnt/lincoln/d3. + +Set the environment variable GIMPDEV to the location where you do your Gimp development +(obviously, use your actual location rather than the example given here): + +
    export GIMPDEV=/mnt/lincoln/d3/gimpdev
    + +In the $GIMPDEV directory, create two sub-directories: source (where all +the source code will be located), and deploy (where the libraries and executable programms +are going to be installed). + +With those directories created, four more environment variables should be defined. The PREFIX +variable will be used as the --prefix attribute for configure, and point to the deploy +directory. The PATH, LD_LIBRARY_PATH and PKG_CONFIG_PATH +variables are re-defined to include the Gimp development versions of the component before the +version installed on the system. + +
    export PREFIX=$GIMPDEV/deploy
    +export PATH=$PREFIX/bin:$PATH
    +export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
    +export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
    + +In order to keep the Gimp development environment separate from regular work, these settings should not +be added to the standard settings. A better solution would be to create a batch file with these settings +(e.g. startgimpdev) and invoke that: + +
    source startgimpdev
    + +Note the use of the source command; that is the only way to get the settings in the current +shell, rather than being lost when the batch file is done. + +My complete startgimpdev batch file looks like this: + +
    #!/bin/bash
    +
    +export GIMPDEV=/mnt/lincoln/d3/gimpdev
    +export PREFIX=$GIMPDEV/deploy
    +export PATH=$PREFIX/bin:$PATH
    +export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
    +export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
    +
    +cd $GIMPDEV/source
    + +==References== + +* [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html Blog post by Martin Nordholts on keeping Gimp up-to-date using git.] +
  • [http://www.graphics-muse.org/artistsguide/?p=247 Blog post by Michael J. Hammel on building Gimp 2.7 from source.]
  • +* [http://www.graphics-muse.org/artistsguide/?p=247 Blog post by Michael J. Hammel on building Gimp 2.7 from source.] diff --git a/wiki/Hacking:Basic_build-20151228090519-edit.txt b/wiki/Hacking:Basic_build-20151228090519-edit.txt new file mode 100644 index 0000000..6b611f4 --- /dev/null +++ b/wiki/Hacking:Basic_build-20151228090519-edit.txt @@ -0,0 +1,75 @@ +page is being written; please be patient + +== Introduction == + +This page describes how to set up an environment to build Gimp from source, to get the source, and to +build Gimp (and the necessary prerequisites). + +The goal will be to keep the Gimp development environment separate from the rest of the system, to make +sure that instabilities in the Gimp development code do not impact the system as a whole. It will allow +you to keep using a stable Gimp version while working on the development version. + +The initial description on this page is based on working on Linux. Developers with +experience developing on other systems are encourage to add details. + +
      +
    • Define the Development Environment
    • +
    • Getting the necessary source
    • +
    • Running autoconf / configure
    • +
    • Running make / make install
    • +
    • References
    • +
    + +

    Define the Development Environment

    + +The first decision to make is where to set up the Gimp development environment. For instance, you could +create a directory gimpdev under your home directory, or maybe you have a different +place on your system where you do all your development work. Personally, I do all my development on a +separately mounted drive at /mnt/lincoln/d3. + +Set the environment variable GIMPDEV to the location where you do your Gimp development +(obviously, use your actual location rather than the example given here): + +
    export GIMPDEV=/mnt/lincoln/d3/gimpdev
    + +In the $GIMPDEV directory, create two sub-directories: source (where all +the source code will be located), and deploy (where the libraries and executable programms +are going to be installed). + +With those directories created, four more environment variables should be defined. The PREFIX +variable will be used as the --prefix attribute for configure, and point to the deploy +directory. The PATH, LD_LIBRARY_PATH and PKG_CONFIG_PATH +variables are re-defined to include the Gimp development versions of the component before the +version installed on the system. + +
    export PREFIX=$GIMPDEV/deploy
    +export PATH=$PREFIX/bin:$PATH
    +export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
    +export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
    + +In order to keep the Gimp development environment separate from regular work, these settings should not +be added to the standard settings. A better solution would be to create a batch file with these settings +(e.g. startgimpdev) and invoke that: + +
    source startgimpdev
    + +Note the use of the source command; that is the only way to get the settings in the current +shell, rather than being lost when the batch file is done. + +My complete startgimpdev batch file looks like this: + +
    #!/bin/bash
    +
    +export GIMPDEV=/mnt/lincoln/d3/gimpdev
    +export PREFIX=$GIMPDEV/deploy
    +export PATH=$PREFIX/bin:$PATH
    +export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
    +export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
    +
    +cd $GIMPDEV/source
    + +

    References

    +
      +
    • [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html Blog post by Martin Nordholts on keeping Gimp up-to-date using git.] +
    • [http://www.graphics-muse.org/artistsguide/?p=247 Blog post by Michael J. Hammel on building Gimp 2.7 from source.]
    • +
    diff --git a/wiki/Hacking:Building%2FLinux-20140901172111-history.txt b/wiki/Hacking:Building%2FLinux-20140901172111-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:Building%2FLinux-20140901172111-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:Building%2FLinux-20140901172119-edit.txt b/wiki/Hacking:Building%2FLinux-20140901172119-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:Building%2FLinux-20140901172119-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:Building%2FLinux-20140901175130-show.txt b/wiki/Hacking:Building%2FLinux-20140901175130-show.txt new file mode 100644 index 0000000..cec72a4 --- /dev/null +++ b/wiki/Hacking:Building%2FLinux-20140901175130-show.txt @@ -0,0 +1,243 @@ + + +This guide will explain you how to install GIMP, even without root/admin permissions/privileges. It will explain how to install GIMP to a custom location so that it won’t conflict with your existing GIMP installation. Through this guide, I’m going to use the bash shell for executing stuff from the command line – it’s usually located in /bin/bash. + +'''Perquisites:''' + +* You should know roughly what is a command-line/terminal/shell. You should also know how to open the command-line/terminal/shell. +* You should know roughly what are environment variables. +* You should read and understand [[Hacking:Building]] +''Note:'' This page is heavily based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this guide] +'''DO NOT BUILD GIMP OR ITS DEPENDENCIES IN PREFIX /usr/local''' + +Just don't. Start a new prefix either in /opt or /home/yourusername/blah. If you do and you run into problems, feel free to clean up and start over elsewhere. + + +{| class="wikitable" +|- +|

    Contents

    + +** 1.1 PATH +** 1.2 PKG_CONFIG_PATH +** 1.3 LD_LIBRARY_PATH +** 1.4 CFLAGS, CPPFLAGS, LIBS +** 1.5 What’s the problem with environment variables? +** 1.1 PATH +** 1.2 PKG_CONFIG_PATH +** 1.3 LD_LIBRARY_PATH +** 1.4 CFLAGS, CPPFLAGS, LIBS +** 1.5 What’s the problem with environment variables? +* 1.1 PATH +* 1.2 PKG_CONFIG_PATH +* 1.3 LD_LIBRARY_PATH +* 1.4 CFLAGS, CPPFLAGS, LIBS +* 1.5 What’s the problem with environment variables? +* 2 Preparing for compilation +* 3 Dependencies +** 4.1 Getting the sources +** 4.2 Actual Building +** 4.1 Getting the sources +** 4.2 Actual Building +* 4.1 Getting the sources +* 4.2 Actual Building +* 5 Running our compiled version of GIMP +* 6 Troubleshooting +* 7 Building the Documentation +|} + +== The Basics - Environment Variables == + +The main "problem" (don't worry, it's solvable) with compiling gimp on Linux, is environment variables. There are 3 environment variables which we should get to know when compiling things on Linux, and we’ll now present them: + + +=== PATH === + +First of all, this environment variable specifies where to look for executables. When you type "gimp" in the command line, all the directories inside the path will be searched. + +
    lightning@nova:~$ echo $PATH
    +/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/local32/bin:.
    + +As you can see, the path is composed out of a list of paths to directories, separated by ':' signs. The order of directories inside the path does matter! Directories which are listed first, are searched first! + + +=== PKG_CONFIG_PATH === + +This environment variable tells the pkg-config tool (a tool which is used to resolve most dependencies in GIMP’s compilation) where to look for the config files (which are used by pkg-config) for installed libraries. + + +=== LD_LIBRARY_PATH === + +Many executables used files which are called shared libraries – these files contain functionality that should be shared between executables. One example which you should know (if you are a Linux user) is Gtk+ – the library which is used by many applications (including GIMP) to create the user interface. + +The executables search for these libraries inside some directories which are considered as “default”. So, in order for us to install and use libraries in other locations we need to update this variable to point to the directory leading to these libraries. + + +=== CFLAGS, CPPFLAGS, LIBS === + +These variables are used to specify additional arguments to the C compiler (CFLAGS), the C Pre-Processor (CPPFLAGS) and the linker (LIBS). Since we install things in paths other than the default, we will possibly need to use them to specify the tools where to look for our installed stuff. + + +=== What’s the problem with environment variables? === + +We don’t want to compile GIMP and install it in the default location, because then it may conflict with our existing installation. But if we install GIMP at a different location, we need to configure the environment variables so that the correct versions of libraries will be found and used, both for compilation and for running GIMP. + + +== Preparing for compilation == + +First of all, we need to decide where do we want to install the alternative version of GIMP. To make it easy to remember and use, we’ll define an environment variable containing that path: + +
    export INSTALL_PREFIX=/vol/scratch/gimp-beta/build
    + +We will also need a directory to download the sources to; this is the directory I used: + +
    export SRC_DIR=/vol/scratch/gimp-beta/src
    + +You’ll need to make sure both of these directories actually exist, and if not, create them. You can do it by running following commands: + +
    mkdir -p $INSTALL_PREFIX
    +mkdir -p $SRC_DIR
    + +Now, remember the discussion we had about environment variables? Here are the updates we need to do: + +
    export PATH=$INSTALL_PREFIX/bin:$PATH
    +export PKG_CONFIG_PATH=$INSTALL_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH
    +export LD_LIBRARY_PATH=$INSTALL_PREFIX/lib:$LD_LIBRARY_PATH
    + +In the first line, we update the PATH variable, so that looking for executables will begin in our installation directory (executables will be installed into the bin subdirectory). +In the second line, we tell pkg-config that it should begin searching for library config files in our installation directory. '''This will resolve many compilation issues!''' For example, this will allow us to compile plug-ins against our updated version of the GIMP libraries, even if we have the old ones installed. +In the third line, we tell the library loader that it should first of all try to look for libraries in our installation directory – this will prevent it from loading the libraries of other GIMP versions (that can cause trouble...). + + +== Dependencies == + +Since you already read about GIMP's dependancies in [[Hacking:Building]], you should already know roughly what does GIMP rely on. Any recent linux distribution should have most dependancies listed in the previous page, except for babl and GEGL. If you'll encounter errors in the process, about missing dependencies or too old versions of dependencies, see the troubleshooting section at the bottom of this page. + + +== Compiling babl, GEGL and GIMP from source == + +The procedure for compiling babl, GEGL and GIMP is very easy once you have the dependencies. Note that the order here matters – we first need to have babl, then GEGL and finally GIMP. + + +=== Getting the sources === + +You can download the source tarballs of all 3 from the GIMP ftp: + +
    ftp://ftp.gimp.org/pub/babl/
    +ftp://ftp.gimp.org/pub/gegl/
    +ftp://ftp.gimp.org/pub/gimp/
    + +Or you can download the sources from Git (you'll need to have git installed): + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +If you downloaded the source tarballs (the filename will end with .tar.gz or .tar.bz2), you'll need to extract them by executing + +
    tar -xf FILE -C DIR
    + +Where FILE should be the path to the file you want to extract and DIR is the directory into which you wish to extract the sources. + + +=== Actual Building === + +For each one of babl, GEGL and GIMP (in this order!) do: + + +# Enter the source directory
    cd PATH/TO/DIRECTORY
    Replace with apropriate path +# If you downloaded a source Tarball, run the configure script with our desired install prefix
    ./configure --prefix=$INSTALL_PREFIX
    Ohterwise, if you downloaded the source from git, run the autogen script with same argument
    ./autogen.sh --prefix=$INSTALL_PREFIX
    If you encounter errors about missing dependancies, look at these suggestions: + +* When running it for GIMP, if you don't have Python and PyGtk, you'll need to disable them explicitly by appending the following argument to the command above
    --disable-python
    +* When running it for GIMP, if you don't have gtk-doc, you'll need to disable it explicitly by appending the following argument to the command above
    --disable-gtk-doc
    +* When running it for GIMP, if you got some error message about some missing libraries, and they weren't listed as the core dependancies of GIMP in [[Hacking:Building]], you can try to disable them. You can list the options that the configure script accepts by running
    ./configure --help
    You can do the same with the autogen script (since it passes it's flags to the configure script!) +Now, look for some option which is called --disable-XXX or --without-XXX, where XXX is the thing which causes your problem. If you found such an option, simply append it to the list of arguments (without the --help) and try again. +# Run make
    make
    +# Run make install
    make install
    + +== Running our compiled version of GIMP == + +Now, we should be careful before running GIMP. Our compilation was done with some very specific environment variables, and running GIMP will depend on them! So, let’s save our environment variables into a script that runs GIMP: + +
    echo "#! /bin/bash
    +
    +# set the path to the installation directory
    +export INSTALL_PREFIX=$INSTALL_PREFIX
    +
    +# set the path to the directory into which we download the sources
    +export SRC_DIR=$SRC_DIR
    +
    +# Now, set mandatory enviroment variables
    +export PATH=\$INSTALL_PREFIX/bin:\$PATH
    +export LD_LIBRARY_PATH=\$INSTALL_PREFIX/lib:\$LD_LIBRARY_PATH
    +
    +# Not needed for running GIMP directly, but needed if you want to compile anything against our
    +# builds (think of plug-ins, etc.)
    +export PKG_CONFIG_PATH=\$INSTALL_PREFIX/lib/pkgconfig:\$PKG_CONFIG_PATH
    +
    +# Now you can run executables our other stuff depending on our environment
    +# Here we run GIMP, and pass it any arguments given to this script
    +\$INSTALL_PREFIX/bin/gimp-2.7 \$@
    +
    +# If you want to run something else, copy paste into bash everything before the line that
    +# runs GIMP, and then run it
    +" > $INSTALL_PREFIX/run-gimp.sh
    +
    +chmod +x $INSTALL_PREFIX/run-gimp.sh
    + +This command creates a script file called run-gimp.sh (inside our installation directory), which sets our environment variables, and then runs GIMP. The script will also contain instructions about running things other than GIMP using our environment. If you finished this step without errors, you should now have a working build of GIMP! +''Note:'' If you compiled a gimp version other than 2.7, replace the 2.7 with the correct version. + + +== Troubleshooting == + +* I’m getting an error about a too low of GTK+/GLib while compiling XXX +: You can either update your version of GTK+/GLib using your system’s package manager, or compile GTK+/GLib from source! Compiling these is done exactly like we compiled babl – download the source (either the latest from Git, or a package from the official site), compile and install. You may also need to do something like this to a library called ATK. +* I’m getting some error about relative path in the prefix +: The installation directory of libraries/executables must be specified in an absolute path and not in a relative path. If you got this error, it means that one of the paths in your environment variables is relative and not absolute – fix that! +* I'm getting errors about missing/old version of Gtk+/Glib/etc. +: The 3/4 step process described in [[Hacking:Building]] for building should work for building most if not all of GIMP's dependancies. Like we compiled GIMP, you should download the sources, run configure then make and finally make install. Use Google or some other search engine to find the website of the package and download it's source from it. Of course that if possible, you should try to install these dependencies through your system's package manager (if you have root permissions) and by that you'll save the time and effort of the compilation. + + + + +== Building the Documentation == + +To build the documentation + +
    git clone --depth=0 git://git.gnome.org/gimp-help-2
    +cd gimp-help-2
    +./autogen.sh [--without-gimp ALL_LINGUAS="en"]
    +LINGUAS=en make
    +LINGUAS=en make pdf-local
    +
    + +Substitute your language options in the above. + +'''Notes''' + +The production of the documentation requires '''''docbook''''' and ancillary programs. Here are some of the other programs; + +'''''gettext''''' + +'''''automake''''' + +'''''docbook2odf''''' + +'''''pngcrush''''' + +'''''pngnq''''' + +'''''docbook-xsl ''''' + +'''''docbook-utils''''' + +'''''dblatex''''' + +Which may or may not already installed. Running autogen will stop at the failed dependency, so install and repeat the process till autogen finishes. + + + + +It is recommended that you read the '''README'''. + + \ No newline at end of file diff --git a/wiki/Hacking:Building%2FLinux-20201022143903-edit.txt b/wiki/Hacking:Building%2FLinux-20201022143903-edit.txt new file mode 100644 index 0000000..633932f --- /dev/null +++ b/wiki/Hacking:Building%2FLinux-20201022143903-edit.txt @@ -0,0 +1,61 @@ +The main GIMP building instructions are at [[Hacking:Building]]. + +This page is for Linux-specific additions to that page. + +== Dependencies == + +GIMP depends on many packages in addition to babl, gegl, libmypaint and mypaint-brushes. + +Gimp.org may change the requirements for each Gimp release. +Gimp.org changes which packages are required. +The package names generally do not change. +Build options affect which packages are required. + +This page lists dependencies for some linux distributions, on certain dates, with all build options enabled. + +==== Ubuntu 19.10 ==== +Working in October 2019. + sudo apt install \ + libtool intltool \ + meson \ + asciidoc \ + exiv2 libgexiv2-dev \ + gjs \ + gtk-3-examples \ + gtk-doc-tools \ + jasper \ + libaa1-dev \ + libappstream-glib-dev \ + libarchive-dev \ + libavcodec-dev libavformat-dev libavutil-dev \ + libbz2-dev \ + libgs-dev \ + libgtk-3-dev libgtk2.0-dev gobject-introspection \ + libgirepository1.0-dev \ + libgudev-1.0-dev \ + libheif-dev \ + libjson-c-dev libjson-glib-dev \ + liblcms2-dev \ + liblensfun-dev \ + libmng-dev \ + libopenexr-dev \ + libjpeg-dev libopenjp2-7-dev \ + libpoppler-glib-dev \ + libraw-dev \ + librsvg2-bin librsvg2-dev \ + libsdl2-dev \ + libspiro-dev \ + libswscale-dev \ + libtiff-dev \ + libumfpack5 \ + libv4l-dev \ + libwebkit2gtk-4.0-dev \ + libwebp-dev \ + luajit \ + python-gi-dev python3-venv python3-wheel \ + ruby \ + w3m \ + xsltproc + +Added in 2020: + valac diff --git a/wiki/Hacking:Building%2FLinux-20210512194925-edit.txt b/wiki/Hacking:Building%2FLinux-20210512194925-edit.txt new file mode 100644 index 0000000..9bca8f0 --- /dev/null +++ b/wiki/Hacking:Building%2FLinux-20210512194925-edit.txt @@ -0,0 +1,63 @@ +The main GIMP building instructions are at [[Hacking:Building]]. + +This page is for Linux-specific additions to that page. + +== Dependencies == + +GIMP depends on many packages in addition to babl, gegl, libmypaint and mypaint-brushes. + +Gimp.org may change the requirements for each Gimp release. +Gimp.org changes which packages are required. +The package names generally do not change. +Build options affect which packages are required. + +This page lists dependencies for some linux distributions, on certain dates, with all build options enabled. + +==== Ubuntu 19.10 ==== +Working in October 2019. + sudo apt install \ + libtool intltool \ + meson \ + asciidoc \ + exiv2 libgexiv2-dev \ + gjs \ + gtk-3-examples \ + gtk-doc-tools \ + jasper \ + libaa1-dev \ + libappstream-glib-dev \ + libarchive-dev \ + libavcodec-dev libavformat-dev libavutil-dev \ + libbz2-dev \ + libgs-dev \ + libgtk-3-dev libgtk2.0-dev gobject-introspection \ + libgirepository1.0-dev \ + libgudev-1.0-dev \ + libheif-dev \ + libjson-c-dev libjson-glib-dev \ + liblcms2-dev \ + liblensfun-dev \ + libmng-dev \ + libopenexr-dev \ + libjpeg-dev libopenjp2-7-dev \ + libpoppler-glib-dev \ + libraw-dev \ + librsvg2-bin librsvg2-dev \ + libsdl2-dev \ + libspiro-dev \ + libswscale-dev \ + libtiff-dev \ + libumfpack5 \ + libv4l-dev \ + libwebkit2gtk-4.0-dev \ + libwebp-dev \ + luajit \ + python-gi-dev python3-venv python3-wheel \ + ruby \ + w3m \ + xsltproc + +Added in 2020: + valac + +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg, an executable binary, has moved from package gtk-3-examples to package libgtk-3-bin. diff --git a/wiki/Hacking:Building%2FWindows-20140901110311-show.txt b/wiki/Hacking:Building%2FWindows-20140901110311-show.txt new file mode 100644 index 0000000..baff31f --- /dev/null +++ b/wiki/Hacking:Building%2FWindows-20140901110311-show.txt @@ -0,0 +1,388 @@ + + +A developer can build and develop GIMP using Windows. One reason to do so is to fix any GIMP bugs specific to the Windows platform. However, there is already a package of GIMP for Windows (at: [http://gimp-win.sourceforge.net/ GIMP Windows installers by Jernej Simončič.]). A GIMP debugger or developer would still need to submit patches to the GIMP development team. + + +{| class="wikitable" +|- +|

    Contents

    + +* 1 Building GIMP natively under Windows using MinGW +** 2.1 Create a separate environment prefix +** 2.2 Install mingw-w64 +** 2.3 Install GIMP Dependencies +** 2.4 Set your cross-compiling environment +** 2.5 Build BABL +** 2.6 Build GEGL +*** 2.7.1 Compression support +*** 2.7.2 Multi-Language support +*** 2.7.1 Compression support +*** 2.7.2 Multi-Language support +** 2.7.1 Compression support +** 2.7.2 Multi-Language support +** 2.8 Build GIMP +** 2.9 Install On Windows +*** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +*** 2.10.2 Some fonts, like Sans, are shown improperly +*** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +*** 2.10.2 Some fonts, like Sans, are shown improperly +** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +** 2.10.2 Some fonts, like Sans, are shown improperly +** 2.1 Create a separate environment prefix +** 2.2 Install mingw-w64 +** 2.3 Install GIMP Dependencies +** 2.4 Set your cross-compiling environment +** 2.5 Build BABL +** 2.6 Build GEGL +*** 2.7.1 Compression support +*** 2.7.2 Multi-Language support +*** 2.7.1 Compression support +*** 2.7.2 Multi-Language support +** 2.7.1 Compression support +** 2.7.2 Multi-Language support +** 2.8 Build GIMP +** 2.9 Install On Windows +*** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +*** 2.10.2 Some fonts, like Sans, are shown improperly +*** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +*** 2.10.2 Some fonts, like Sans, are shown improperly +** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +** 2.10.2 Some fonts, like Sans, are shown improperly +* 2.1 Create a separate environment prefix +* 2.2 Install mingw-w64 +* 2.3 Install GIMP Dependencies +* 2.4 Set your cross-compiling environment +* 2.5 Build BABL +* 2.6 Build GEGL +** 2.7.1 Compression support +** 2.7.2 Multi-Language support +** 2.7.1 Compression support +** 2.7.2 Multi-Language support +* 2.7.1 Compression support +* 2.7.2 Multi-Language support +* 2.8 Build GIMP +* 2.9 Install On Windows +** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +** 2.10.2 Some fonts, like Sans, are shown improperly +** 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +** 2.10.2 Some fonts, like Sans, are shown improperly +* 2.10.1 Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown. +* 2.10.2 Some fonts, like Sans, are shown improperly +* 3 Building GIMP using Microsoft tools +* 4 Building GIMP plug-ins using Microsoft tools +* 5 Packaging third-party GIMP plug-ins for Windows +|} + +== Building GIMP natively under Windows using MinGW == + +MinGW is an open source Linux environment available on the Windows platform. + +The following articles discuss building GIMP on and for the Windows platform using MinGW: + +[http://partha.com/articles/groundwork.html Groundwork] by Partha Bagchi + +[http://partha.com/articles/buildinggimp.html Building GIMP for Windows] by Partha Bagchi + +[http://article.gmane.org/gmane.comp.video.gimp.devel/19203 Building GIMP and plug-ins for Windows] by Jernej Simončič + +[http://lightningismyname.blogspot.de/p/compiling-gimp.html Building GIMP for Linux and Windows] by Barak Itkin + + + +You find MinGW (the programming tool) and MSYS (a Bourne shell command line) at [http://www.mingw.org/ the MinGW website]. + + +== Cross-Compiling GIMP under UNIX using MinGW-w64 == + +Experience shows that working with the MinGW environment on a UNIX machine provides a much faster compilation, and you are still able to compile for any Windows target (32 and 64 bits). + +NOTE: the following procedure should be distribution-independent and does not rely on your package management system, even though it uses some OpenSuse packages. It would probably work on OSX or any other UNIX as well (add a note on the list below if you know this procedure works on another OS). + +Has been known to work on at least: Linux Mint 15, Ubuntu 12.04LST and Mageia 2 distributions. + +''Source of the original procedure from an [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email by Victor Oliveira].'' + + +=== Create a separate environment prefix === + +You obviously don't want to mix your Windows binaries with your normal distribution (and also you want to avoid ever having to use ''root''). +For instance you can choose: + + +$ mkdir $HOME/w64/ + +$ cd $HOME/w64 + + + +=== Install mingw-w64 === + +The original [http://www.mingw.org/wiki/LinuxCrossMinGW MinGW] projects can only compile for Windows 32 bits. Hence this procedure relies on the newer [http://mingw-w64.sourceforge.net/ MinGW-w64] project. + +If your distribution provides the mingw-w64 tools, you may install them with your package manager. Otherwise you can download directly on SourceForge the last [http://sourceforge.net/apps/trac/mingw-w64/wiki/download%20filename%20structure daily snapshot] from the project. + +For instance if you are on Linux 64 bits and want to compile for Windows 64 bits, you should download '''mingw-w64-bin_x86_64-linux_20121031.tar.bz2'''. +Note that you can install alongside '''mingw-w32-bin_x86_64-linux_20121031.tar.bz2''' if you want to be able to cross-compile for Windows 32 bits as well. + +$ tar xjf mingw-w64-bin_x86_64-linux_20121031.tar.bz2 + +This will extract all the cross-compiling tools and generate a prefix tree inside your $HOME/w64 directory. + + +=== Install GIMP Dependencies === + +The default environment provided by MinGW does not have the huge list of dependencies that GIMP requires. +Fortunately the [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email] linked above has bash script named '''grab-stuff.sh''' (which calls itself a python3 script named "download-mingw-rpm.py", so you have to download both and have python3), which downloads pre-compiled version of all needed dependencies for cross-compiling (it uses OpenSuse repositories as source, but it does not mean at all you need rpm support). + +From the root of your cross-compiling prefix ($HOME/w64) run: + +$ bash grab-stuff.sh + +You will notice in particular a new usr/ folder, and inside i686-w64-mingw32/ and x86_64-w64-mingw32/ sub-folders. + + +=== Set your cross-compiling environment === + +1. Choose your target: + +For building Windows 32 bits executables: + +$ export HOST=i686-w64-mingw32 + +For building Windows 64 bits executables: + +$ export HOST=x86_64-w64-mingw32 + + +2. Create a dependencies prefix: + +$ export DEP_PREFIX=$HOME/w64/usr/$HOST/sys-root/mingw + + +3. Create an installation prefix, that you chose earlier: + +$ export PREFIX=$HOME/w64 + + +4. You don't want any library linked from your normal Linux environment, so let's reset pkg-config: + +$ export PKG_CONFIG_LIBDIR= +$ export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$DEP_PREFIX/lib/pkgconfig +$ export LD_LIBRARY_PATH=$PREFIX/lib:$DEP_PREFIX/lib + + +5. Used tools though may still use the old path as well, but preferably the downloaded MinGW. + +NOTE: This step is useless if you installed MinGW-w64 from your distribution. + +$ export PATH=$PREFIX/bin:$DEP_PREFIX/bin:$PATH + + +6. Let GEGLs and GIMPs configure scripts find JPEG, MNG and EXIF2 support. If you set this, you won't need the ''--without-libjpeg'' option in GIMPs configure step: + +$ export C_INCLUDE_PATH=$DEP_PREFIX/include + + +7. Finally let's add some compilation flags: + +$ export ACLOCAL_FLAGS="-I $DEP_PREFIX/share/aclocal" +$ export CFLAGS="-I$DEP_PREFIX/include -I$PREFIX/include" +$ export CPATH="$DEP_PREFIX/include:$PREFIX/include" +$ export LDFLAGS="-L$DEP_PREFIX/lib -L$PREFIX/lib" + +NOTE: If you installed MinGW-w64 from your distribution, the ''"-L$DEP_PREFIX/lib"'' or ''"-I$DEP_PREFIX/include"'' will have to be replaced by your +distribution default profile, likely respectively ''"-L/usr/x86_64-w64-mingw32/lib"'' and ''"-I/usr/x86_64-w64-mingw32/include"''. + + + +8. You will probably want to save these values if you have to cross-compile again for Windows. +The best is to save them in a file "env-64.sh" (and env-32.sh), that you can ''source'' at anytime. + + +=== Build BABL === + +You can use released versions if they have a version big enough. As the time of writing this, GIMP from git requires BABL and GEGL from git as well. + +$ cd src/ + +$ git clone git://git.gnome.org/babl + +$ cd babl + +$ ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no + +$ make + +$ make install + + + +=== Build GEGL === + + +1. $ cd .. + +2. $ git clone git://git.gnome.org/gegl + +3. $ cd gegl + + + +4. Checkout the right branch from your GEGL git repository. + +:For GIMP 2.8: $ git checkout gegl-0-2 + + +:For the latest development version of GIMP: $ git checkout master + +5. $ ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-docs --disable-glibtest + +6. $ make + +7. $ make install + + + +=== Build any optional dependency === + +This step is not necessary if you compile GIMP with the minimum set of dependency as indicated at the next section. + + +==== Compression support ==== + +Nevertheless if for instance, you needed compression support (hence be able to load and save your images in various compressed format), you would need zlib,libbzip2 and liblzma installed. In particular the cross-compilation environment described on this page has no pre-compiled liblzma. You would need to cross-compile it first yourself. + +In my case xz-5.0.4 worked well. + + +$ cd .. + +$ wget [http://tukaani.org/xz/xz-5.0.4.tar.xz http://tukaani.org/xz/xz-5.0.4.tar.xz] + +$ tar xf xz-5.0.4.tar.xz + +$ rm xz-5.0.4.tar.xz + +$ cd xz-5.0.4 + +$ ./configure --prefix=$PREFIX --host=$HOST + +$ make + +$ make install + + +Finally obviously in the GIMP configure step, remove the ''--without-liblzma'' option on the autogen.sh command line before compiling GIMP. + +You should be able to do similar things for other optional features that you would want on your cross-compiled GIMP. + +Alternatively there exists a [http://eternallybored.org/misc/gimp/configrue-libbz2.patch patch] to get compression support working in 32 bit builds. + + +==== Multi-Language support ==== + +Multi-Language support is installed with the grab-stuff.sh script. Due to a bug in the package mingw32-iso-codes-devel the pkgconfig program can't find the iso-codes package. +In this case you will notice, that GIMPs autogen.sh reports + +Language selection: no + +and the finished GIMP build has no language selector listbox in ''Edit/Preferences/Interface''. +To solve this, copy ''$HOME/w64/usr/$HOST/sys-root/mingw/share/pkgconfig/iso-codes.pc'' to ''$HOME/w64/usr/$HOST/sys-root/mingw/lib/pkgconfig'' before executing autogen.sh or configure for GIMP. +Note you have to do this for every value of $HOST you want to build (e.g. i686 and x86_64 architecture). +Also merge the MinGW and GIMP build folders when installing it on Windows (see the Troubleshooting section). + + +=== Build GIMP === + + +$ cd .. + +$ git clone git://git.gnome.org/gimp + +$ cd gimp + +$ ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-glibtest --disable-gtktest --disable-docs --without-libjpeg --disable-python --without-xmc --without-dbus --without-libzma + +$ make + +$ make install + + + +=== Install On Windows === + +To test your compiled installation, I found nothing better than moving the whole tree (in my case $HOME/w64) into Windows, because libraries are dynamically linked, then run $HOME/w64/bin/gimp-2.9.exe under Windows. + +If you really want to build a self contained GIMP, you should compile everything as static libraries. +GIMP will probably still rely on some external files though, for instance what you find under $HOME/w64/share/gimp/2.0/. Maybe other things. But this will have to be tested if needed. + + + + + +=== Troubleshooting === + +==== Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== + +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + + +==== Some fonts, like Sans, are shown improperly ==== + +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + + +== Building GIMP using Microsoft tools == + +Microsoft Visual Studio comes with its own C compiler. +Most of GIMP development is done with the GCC and its MinGW Windows port. + +Unfortunately both are not fully compatible, so integrating GCC into the +Visual Studio build chain has its flaws, even while it might work in some points. + +Because of this you are recommended to use MinGW for building GIMP on Windows. + + +== Building GIMP plug-ins using Microsoft tools == + +[http://registry.gimp.org/node/24883 How to build a GIMP plug-in with Visual Studio] + + +== Packaging third-party GIMP plug-ins for Windows == + +Users on the Windows and Mac OSX platforms expect software to be packaged in a self-installing file (an installer). Even though GIMP plugins (whether scripts in Python or Scheme, or executables in the C language) are relatively easy to install, you might want to package them using an installer such as [http://www.jrsoftware.org/isinfo.php Inno Setup]. + + \ No newline at end of file diff --git a/wiki/Hacking:Building%2FWindows-20140901122002-edit.txt b/wiki/Hacking:Building%2FWindows-20140901122002-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:Building%2FWindows-20140901122002-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:Building%2FWindows-20201028000025-edit.txt b/wiki/Hacking:Building%2FWindows-20201028000025-edit.txt new file mode 100644 index 0000000..9d3245e --- /dev/null +++ b/wiki/Hacking:Building%2FWindows-20201028000025-edit.txt @@ -0,0 +1,487 @@ +The main GIMP building instructions are at [[Hacking:Building]]. This page is for Windows-specific additions to that page. + +Note: the instructions are not always kept up to date. The primary development platform is the Debian Testing GNU/Linux distribution, so the very latest code from Git might not always build on other platforms. + +== Building GIMP natively under Windows using MSYS2 == + +Msys2 is a POSIX environment with basically everything you would find on a Linux system (shell, package manager, GCC…). It allows to use POSIX tools to build Windows softwares. + +=== Setting up the environment === + +First, '''follow the installation instructions''' for msys2 available at [https://msys2.github.io msys2.github.io]. + +To open a terminal, you need to execute msys2.exe or mingw64.exe + +Update the system : + pacman -Syyuu + +If the shell tells you to close the terminal, close MSYS2 and run it again. That is a normal procedure. + +=== Install the dependencies === + +==== If you want to build gimp 2.10 ==== + +If you have Windows 64bits: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-x86_64-toolchain \ + mingw-w64-x86_64-asciidoc \ + mingw-w64-x86_64-drmingw \ + mingw-w64-x86_64-gexiv2 \ + mingw-w64-x86_64-ghostscript \ + mingw-w64-x86_64-glib-networking \ + mingw-w64-x86_64-graphviz \ + mingw-w64-x86_64-gtk2 \ + mingw-w64-x86_64-gobject-introspection \ + mingw-w64-x86_64-iso-codes \ + mingw-w64-x86_64-json-c \ + mingw-w64-x86_64-json-glib \ + mingw-w64-x86_64-lcms2 \ + mingw-w64-x86_64-lensfun \ + mingw-w64-x86_64-libheif \ + mingw-w64-x86_64-libraw \ + mingw-w64-x86_64-libspiro \ + mingw-w64-x86_64-libwebp \ + mingw-w64-x86_64-libwmf \ + mingw-w64-x86_64-meson \ + mingw-w64-x86_64-mypaint-brushes \ + mingw-w64-x86_64-openexr \ + mingw-w64-x86_64-poppler \ + mingw-w64-x86_64-python2-pygtk \ + mingw-w64-x86_64-SDL2 \ + mingw-w64-x86_64-suitesparse \ + mingw-w64-x86_64-xpm-nox + +If you have Windows 32 bit: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-i686-toolchain \ + mingw-w64-i686-asciidoc \ + mingw-w64-i686-drmingw \ + mingw-w64-i686-gexiv2 \ + mingw-w64-i686-ghostscript \ + mingw-w64-i686-glib-networking \ + mingw-w64-i686-graphviz \ + mingw-w64-i686-gtk2 \ + mingw-w64-i686-gobject-introspection \ + mingw-w64-i686-iso-codes \ + mingw-w64-i686-json-c \ + mingw-w64-i686-json-glib \ + mingw-w64-i686-lcms2 \ + mingw-w64-i686-lensfun \ + mingw-w64-i686-libheif \ + mingw-w64-i686-libraw \ + mingw-w64-i686-libspiro \ + mingw-w64-i686-libwebp \ + mingw-w64-i686-libwmf \ + mingw-w64-i686-meson \ + mingw-w64-i686-mypaint-brushes \ + mingw-w64-i686-openexr \ + mingw-w64-i686-poppler \ + mingw-w64-i686-python2-pygtk \ + mingw-w64-i686-SDL2 \ + mingw-w64-i686-suitesparse \ + mingw-w64-i686-xpm-nox + +==== If you want to build gimp master ==== + +If you have Windows 64bits: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-x86_64-toolchain \ + mingw-w64-x86_64-appstream-glib \ + mingw-w64-x86_64-asciidoc \ + mingw-w64-x86_64-drmingw \ + mingw-w64-x86_64-gexiv2 \ + mingw-w64-x86_64-ghostscript \ + mingw-w64-x86_64-glib-networking \ + mingw-w64-x86_64-graphviz \ + mingw-w64-x86_64-gtk3 \ + mingw-w64-x86_64-gobject-introspection \ + mingw-w64-x86_64-iso-codes \ + mingw-w64-x86_64-json-c \ + mingw-w64-x86_64-json-glib \ + mingw-w64-x86_64-lcms2 \ + mingw-w64-x86_64-lensfun \ + mingw-w64-x86_64-libarchive \ + mingw-w64-x86_64-libheif \ + mingw-w64-x86_64-libraw \ + mingw-w64-x86_64-libspiro \ + mingw-w64-x86_64-libwebp \ + mingw-w64-x86_64-libwmf \ + mingw-w64-x86_64-luajit \ + mingw-w64-x86_64-meson \ + mingw-w64-x86_64-mypaint-brushes \ + mingw-w64-x86_64-openexr \ + mingw-w64-x86_64-poppler \ + mingw-w64-x86_64-python3-gobject \ + mingw-w64-x86_64-SDL2 \ + mingw-w64-x86_64-suitesparse \ + mingw-w64-x86_64-vala \ + mingw-w64-x86_64-xpm-nox + +If you have Windows 32bits: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-i686-toolchain \ + mingw-w64-i686-appstream-glib \ + mingw-w64-i686-asciidoc \ + mingw-w64-i686-drmingw \ + mingw-w64-i686-gexiv2 \ + mingw-w64-i686-ghostscript \ + mingw-w64-i686-glib-networking \ + mingw-w64-i686-graphviz \ + mingw-w64-i686-gtk3 \ + mingw-w64-i686-gobject-introspection \ + mingw-w64-i686-iso-codes \ + mingw-w64-i686-json-c \ + mingw-w64-i686-json-glib \ + mingw-w64-i686-lcms2 \ + mingw-w64-i686-lensfun \ + mingw-w64-i686-libarchive \ + mingw-w64-i686-libheif \ + mingw-w64-i686-libraw \ + mingw-w64-i686-libspiro \ + mingw-w64-i686-libwebp \ + mingw-w64-i686-libwmf \ + mingw-w64-i686-luajit \ + mingw-w64-i686-meson \ + mingw-w64-i686-mypaint-brushes \ + mingw-w64-i686-openexr \ + mingw-w64-i686-poppler \ + mingw-w64-i686-python3-gobject \ + mingw-w64-i686-SDL2 \ + mingw-w64-i686-suitesparse \ + mingw-w64-i686-vala \ + mingw-w64-i686-xpm-nox + +Simply hit enter at the prompts for which packages to install (default=all). This step will download a ton of packages, and may take a while. + +=== Building the software === + +You can now just follow the instruction on the main page [[Hacking:Building]]. Just be careful of the following changes : + + export GIMP_PREFIX=`realpath ~/gimp_prefix` + export PATH="$GIMP_PREFIX/bin:$PATH" + export PKG_CONFIG_PATH="$GIMP_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH="$GIMP_PREFIXshare/pkgconfig:$PKG_CONFIG_PATH" + export LD_LIBRARY_PATH="$GIMP_PREFIX/lib:$LD_LIBRARY_PATH" + +* If you are on Windows 64bits, you need to add mingw64 on 32bits mingw32 + #environment variable for Autotools + export ACLOCAL_FLAGS="-I/c/msys64/mingw64/share/aclocal" + #environment variable for introspection + export XDG_DATA_DIRS="$XDG_DATA_DIRS:$GIMP_PREFIX/share:/usr/local/share/:/usr/share/:/mingw64/share/" + + +You can add all the environment variable on C:\msys64_or_msys32\home\{USERNAME}\.bash_profile then run + + . .bash_profile + + +* Disable docs for Babl : -Dwith-docs=false while calling Meson. + +* Disable docs for Gegl : -Ddocs=false while calling Meson. + + +You may want to disable the docs while building Gimp : + +* Meson build : -Dgtk-doc=false -Dgtk-doc-app=false +* Autotools build : --disable-docs + +== Cross-Compiling GIMP under UNIX using crossroad == + +A tool named [https://pypi.python.org/pypi/crossroad crossroad] has been developed to cross-build for Windows under Linux (it was even originally started to crossbuild GIMP specifically). + +See the [http://girinstud.io/news/2016/05/crossroad-0-6-released-cross-building-gimp-as-an-example/ tutorial explaining how to build GIMP with it]. + +Condensed, here is the process: + + crossroad w64 gimp-build + + crossroad install \ + glib2-devel \ + libexiv2-devel \ + json-glib-devel \ + libjpeg8-devel \ + libpng-devel \ + cairo-devel \ + libtiff-devel \ + librsvg-2-2 \ + librsvg-devel \ + pango-devel \ + libwebp5 \ + libwebp-devel \ + libjasper-devel \ + gdk-pixbuf-devel \ + libSDL-devel \ + libjson-c2 \ + libjson-c-devel \ + atk-devel \ + gtk2-devel \ + libbz2-1 \ + libbz2-devel \ + liblzma-devel \ + liblcms2-2 \ + liblcms2-devel \ + libgs8 \ + libgs-devel \ + libmng1 \ + libmng-devel \ + libpoppler-glib8 \ + libpoppler-glib-devel \ + poppler-data \ + xpm-nox-devel headers \ + iso-codes-devel \ + libwmf-devel \ + libgexiv2-devel headers + + wget http://prdownloads.sourceforge.net/libpng/libpng-1.6.29.tar.xz + tar xf libpng-1.6.29.tar.xz + pushd libpng-1.6.29 + crossroad configure + make && make install + popd + + git clone git://git.gnome.org/babl + pushd babl + crossroad configure + make && make install + popd + + git clone git://git.gnome.org/gegl + pushd gegl + crossroad configure + make && make install + popd + + git clone https://github.com/mypaint/libmypaint.git + cd libmypaint + crossroad configure + make && make install + popd + + git clone git://git.gnome.org/gimp + crossroad configure --disable-python + make && make install + popd + +Check out the full tutorial for more details. + +Note: this is basically the same thing as the Mingw64 cross build, simply crossroad wraps all the complicated parts! + +== Cross-Compiling GIMP under Linux using MinGW-w64 == + +Experience shows that working with the MinGW environment on a Linux machine provides a much faster compilation, and you are still able to compile for any Windows target (32 and 64 bits). + +NOTE: the following procedure should be distribution-independent and does not rely on your package management system, even though it uses some OpenSuse packages. It would probably work on OSX or any other UNIX as well (add a note on the list below if you know this procedure works on another OS). + +Has been known to work on at least: Linux Mint 15, Ubuntu 12.04LST and Mageia 2 distributions. + +''Source of the original procedure from an [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email by Victor Oliveira].'' + +=== Install mingw-w64 === +This procedure relies on the newer [http://mingw-w64.sourceforge.net/ MinGW-w64] project. + +If your distribution provides the mingw-w64 tools, you may install them with your package manager. + +Otherwise, download directly the last release [https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release on Sourceforge]. + +The archive contains a prefix tree, that you can consider as read-only (just like your linux system). + +=== Install GIMP Dependencies === + +The default environment provided by MinGW does not have the huge list of dependencies that GIMP requires. + +Fortunately the [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email] linked above has bash script named '''grab-stuff.sh''' (which calls itself a python3 script named "download-mingw-rpm.py", so you have to download both and have python3), which downloads pre-compiled version of all needed dependencies for cross-compiling (it uses OpenSuse repositories as source, but it does not mean at all you need rpm support). + +From the root of your cross-compiling prefix ($HOME/w64) run: + bash grab-stuff.sh + +You will notice in particular a new usr/ folder, and inside i686-w64-mingw32/ and x86_64-w64-mingw32/ sub-folders. + +TODO : Make a proper dependency list. + +=== Set your cross-compiling environment === + +Define the environment variables as described in [[Hacking:Building]]. You may also need to reset pkg-config: + export PKG_CONFIG_LIBDIR= + +=== Build BABL === + git clone git://git.gnome.org/babl + cd babl + ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no + make + make install + +=== Build GEGL === + git clone git://git.gnome.org/gegl + cd gegl + ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-docs --disable-glibtest + make + make install + +=== Build any optional dependency === + +This step is not necessary if you compile GIMP with the minimum set of dependency as indicated at the next section. + +==== Compression support ==== +Nevertheless if for instance, you needed compression support (hence be able to load and save your images in various compressed format), you would need zlib,libbzip2 and liblzma installed. In particular the cross-compilation environment described on this page has no pre-compiled liblzma. You would need to cross-compile it first yourself. + +In my case xz-5.0.4 worked well. + + cd .. + wget http://tukaani.org/xz/xz-5.0.4.tar.xz + tar xf xz-5.0.4.tar.xz + rm xz-5.0.4.tar.xz + cd xz-5.0.4 + ./configure --prefix=$PREFIX --host=$HOST + make + make install + +Finally obviously in the GIMP configure step, remove the ''--without-liblzma'' option on the autogen.sh command line before compiling GIMP. + +You should be able to do similar things for other optional features that you would want on your cross-compiled GIMP. + +Alternatively there exists a [http://eternallybored.org/misc/gimp/configrue-libbz2.patch patch] to get compression support working in 32 bit builds. + +==== Multi-Language support ==== +Multi-Language support is installed with the grab-stuff.sh script. Due to a bug in the package mingw32-iso-codes-devel the pkgconfig program can't find the iso-codes package. +In this case you will notice, that GIMPs autogen.sh reports + +Language selection: no + +and the finished GIMP build has no language selector listbox in ''Edit/Preferences/Interface''. +To solve this, copy ''$HOME/w64/usr/$HOST/sys-root/mingw/share/pkgconfig/iso-codes.pc'' to ''$HOME/w64/usr/$HOST/sys-root/mingw/lib/pkgconfig'' before executing autogen.sh or configure for GIMP. +Note you have to do this for every value of $HOST you want to build (e.g. i686 and x86_64 architecture). +Also merge the MinGW and GIMP build folders when installing it on Windows (see the [[#Troubleshooting | Troubleshooting section]]). + +=== Build GIMP === + + cd .. + git clone git://git.gnome.org/gimp + cd gimp + ./autogen.sh --prefix=$PREFIX --host=$HOST \ + --enable-introspection=no \ + --disable-glibtest \ + --disable-gtktest \ + --disable-docs \ + --without-libjpeg \ + --disable-python \ + --without-xmc \ + --without-dbus \ + --without-libzma \ + make + make install + +=== Install On Windows === + +To test your compiled installation, I found nothing better than moving the whole tree (in my case $HOME/w64) into Windows, because libraries are dynamically linked, then run $HOME/w64/bin/gimp-2.9.exe under Windows. + +If you really want to build a self contained GIMP, you should compile everything as static libraries. +GIMP will probably still rely on some external files though, for instance what you find under $HOME/w64/share/gimp/2.0/. Maybe other things. But this will have to be tested if needed. + + +=== Troubleshooting === + +==== Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + +==== Some fonts, like Sans, are shown improperly ==== +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + +== Troubleshooting == + +==== Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + +==== Some fonts, like Sans, are shown improperly ==== +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + +== Building GIMP using Microsoft tools == + +Microsoft Visual Studio comes with its own C compiler. +Most of GIMP development is done with the GCC and its MinGW Windows port. + +Unfortunately both are not fully compatible, so integrating GCC into the +Visual Studio build chain has its flaws, even while it might work in some points. + +Because of this you are recommended to use MinGW for building GIMP on Windows. + +== Building GIMP plug-ins using Microsoft tools == + +[http://web.archive.org/web/20150906090521/http://registry.gimp.org/node/24883 How to build a GIMP plug-in with Visual Studio] (archive.org link salvaged, original link, now broken, was: http://registry.gimp.org/node/24883) + +== Packaging third-party GIMP plug-ins for Windows == + +Users on the Windows and Mac OSX platforms expect software to be packaged in a self-installing file (an installer). Even though GIMP plugins (whether scripts in Python or Scheme, or executables in the C language) are relatively easy to install, you might want to package them using an installer such as [http://www.jrsoftware.org/isinfo.php Inno Setup]. diff --git a/wiki/Hacking:Building%2FWindows-20210513030349-edit.txt b/wiki/Hacking:Building%2FWindows-20210513030349-edit.txt new file mode 100644 index 0000000..b5f3dd8 --- /dev/null +++ b/wiki/Hacking:Building%2FWindows-20210513030349-edit.txt @@ -0,0 +1,489 @@ +The main GIMP building instructions are at [[Hacking:Building]]. This page is for Windows-specific additions to that page. + +Note: the instructions are not always kept up to date. The primary development platform is the Debian Testing GNU/Linux distribution, so the very latest code from Git might not always build on other platforms. + +== Building GIMP natively under Windows using MSYS2 == + +Msys2 is a POSIX environment with basically everything you would find on a Linux system (shell, package manager, GCC…). It allows to use POSIX tools to build Windows softwares. + +=== Setting up the environment === + +First, '''follow the installation instructions''' for msys2 available at [https://msys2.github.io msys2.github.io]. + +To open a terminal, you need to execute msys2.exe or mingw64.exe + +Update the system : + pacman -Syyuu + +If the shell tells you to close the terminal, close MSYS2 and run it again. That is a normal procedure. + +=== Install the dependencies === + +==== If you want to build gimp 2.10 ==== + +If you have Windows 64bits: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-x86_64-toolchain \ + mingw-w64-x86_64-asciidoc \ + mingw-w64-x86_64-drmingw \ + mingw-w64-x86_64-gexiv2 \ + mingw-w64-x86_64-ghostscript \ + mingw-w64-x86_64-glib-networking \ + mingw-w64-x86_64-graphviz \ + mingw-w64-x86_64-gtk2 \ + mingw-w64-x86_64-gobject-introspection \ + mingw-w64-x86_64-iso-codes \ + mingw-w64-x86_64-json-c \ + mingw-w64-x86_64-json-glib \ + mingw-w64-x86_64-lcms2 \ + mingw-w64-x86_64-lensfun \ + mingw-w64-x86_64-libheif \ + mingw-w64-x86_64-libraw \ + mingw-w64-x86_64-libspiro \ + mingw-w64-x86_64-libwebp \ + mingw-w64-x86_64-libwmf \ + mingw-w64-x86_64-meson \ + mingw-w64-x86_64-mypaint-brushes \ + mingw-w64-x86_64-openexr \ + mingw-w64-x86_64-poppler \ + mingw-w64-x86_64-python2-pygtk \ + mingw-w64-x86_64-SDL2 \ + mingw-w64-x86_64-suitesparse \ + mingw-w64-x86_64-xpm-nox + +If you have Windows 32 bit: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-i686-toolchain \ + mingw-w64-i686-asciidoc \ + mingw-w64-i686-drmingw \ + mingw-w64-i686-gexiv2 \ + mingw-w64-i686-ghostscript \ + mingw-w64-i686-glib-networking \ + mingw-w64-i686-graphviz \ + mingw-w64-i686-gtk2 \ + mingw-w64-i686-gobject-introspection \ + mingw-w64-i686-iso-codes \ + mingw-w64-i686-json-c \ + mingw-w64-i686-json-glib \ + mingw-w64-i686-lcms2 \ + mingw-w64-i686-lensfun \ + mingw-w64-i686-libheif \ + mingw-w64-i686-libraw \ + mingw-w64-i686-libspiro \ + mingw-w64-i686-libwebp \ + mingw-w64-i686-libwmf \ + mingw-w64-i686-meson \ + mingw-w64-i686-mypaint-brushes \ + mingw-w64-i686-openexr \ + mingw-w64-i686-poppler \ + mingw-w64-i686-python2-pygtk \ + mingw-w64-i686-SDL2 \ + mingw-w64-i686-suitesparse \ + mingw-w64-i686-xpm-nox + +==== If you want to build gimp master ==== + +If you have Windows 64bits: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-x86_64-toolchain \ + mingw-w64-x86_64-appstream-glib \ + mingw-w64-x86_64-asciidoc \ + mingw-w64-x86_64-drmingw \ + mingw-w64-x86_64-gexiv2 \ + mingw-w64-x86_64-ghostscript \ + mingw-w64-x86_64-glib-networking \ + mingw-w64-x86_64-graphviz \ + mingw-w64-x86_64-gtk3 \ + mingw-w64-x86_64-gobject-introspection \ + mingw-w64-x86_64-iso-codes \ + mingw-w64-x86_64-json-c \ + mingw-w64-x86_64-json-glib \ + mingw-w64-x86_64-lcms2 \ + mingw-w64-x86_64-lensfun \ + mingw-w64-x86_64-libarchive \ + mingw-w64-x86_64-libheif \ + mingw-w64-x86_64-libraw \ + mingw-w64-x86_64-libspiro \ + mingw-w64-x86_64-libwebp \ + mingw-w64-x86_64-libwmf \ + mingw-w64-x86_64-luajit \ + mingw-w64-x86_64-maxflow \ + mingw-w64-x86_64-meson \ + mingw-w64-x86_64-mypaint-brushes \ + mingw-w64-x86_64-openexr \ + mingw-w64-x86_64-poppler \ + mingw-w64-x86_64-python3-gobject \ + mingw-w64-x86_64-SDL2 \ + mingw-w64-x86_64-suitesparse \ + mingw-w64-x86_64-vala \ + mingw-w64-x86_64-xpm-nox + +If you have Windows 32bits: + pacman -S --needed \ + base-devel \ + git \ + mingw-w64-i686-toolchain \ + mingw-w64-i686-appstream-glib \ + mingw-w64-i686-asciidoc \ + mingw-w64-i686-drmingw \ + mingw-w64-i686-gexiv2 \ + mingw-w64-i686-ghostscript \ + mingw-w64-i686-glib-networking \ + mingw-w64-i686-graphviz \ + mingw-w64-i686-gtk3 \ + mingw-w64-i686-gobject-introspection \ + mingw-w64-i686-iso-codes \ + mingw-w64-i686-json-c \ + mingw-w64-i686-json-glib \ + mingw-w64-i686-lcms2 \ + mingw-w64-i686-lensfun \ + mingw-w64-i686-libarchive \ + mingw-w64-i686-libheif \ + mingw-w64-i686-libraw \ + mingw-w64-i686-libspiro \ + mingw-w64-i686-libwebp \ + mingw-w64-i686-libwmf \ + mingw-w64-i686-luajit \ + mingw-w64-i686-maxflow \ + mingw-w64-i686-meson \ + mingw-w64-i686-mypaint-brushes \ + mingw-w64-i686-openexr \ + mingw-w64-i686-poppler \ + mingw-w64-i686-python3-gobject \ + mingw-w64-i686-SDL2 \ + mingw-w64-i686-suitesparse \ + mingw-w64-i686-vala \ + mingw-w64-i686-xpm-nox + +Simply hit enter at the prompts for which packages to install (default=all). This step will download a ton of packages, and may take a while. + +=== Building the software === + +You can now just follow the instruction on the main page [[Hacking:Building]]. Just be careful of the following changes : + + export GIMP_PREFIX=`realpath ~/gimp_prefix` + export PATH="$GIMP_PREFIX/bin:$PATH" + export PKG_CONFIG_PATH="$GIMP_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH="$GIMP_PREFIXshare/pkgconfig:$PKG_CONFIG_PATH" + export LD_LIBRARY_PATH="$GIMP_PREFIX/lib:$LD_LIBRARY_PATH" + +* If you are on Windows 64bits, you need to add mingw64 on 32bits mingw32 + #environment variable for Autotools + export ACLOCAL_FLAGS="-I/c/msys64/mingw64/share/aclocal" + #environment variable for introspection + export XDG_DATA_DIRS="$XDG_DATA_DIRS:$GIMP_PREFIX/share:/usr/local/share/:/usr/share/:/mingw64/share/" + + +You can add all the environment variable on C:\msys64_or_msys32\home\{USERNAME}\.bash_profile then run + + . .bash_profile + + +* Disable docs for Babl : -Dwith-docs=false while calling Meson. + +* Disable docs for Gegl : -Ddocs=false while calling Meson. + + +You may want to disable the docs while building Gimp : + +* Meson build : -Dgtk-doc=false -Dgtk-doc-app=false +* Autotools build : --disable-docs + +== Cross-Compiling GIMP under UNIX using crossroad == + +A tool named [https://pypi.python.org/pypi/crossroad crossroad] has been developed to cross-build for Windows under Linux (it was even originally started to crossbuild GIMP specifically). + +See the [http://girinstud.io/news/2016/05/crossroad-0-6-released-cross-building-gimp-as-an-example/ tutorial explaining how to build GIMP with it]. + +Condensed, here is the process: + + crossroad w64 gimp-build + + crossroad install \ + glib2-devel \ + libexiv2-devel \ + json-glib-devel \ + libjpeg8-devel \ + libpng-devel \ + cairo-devel \ + libtiff-devel \ + librsvg-2-2 \ + librsvg-devel \ + pango-devel \ + libwebp5 \ + libwebp-devel \ + libjasper-devel \ + gdk-pixbuf-devel \ + libSDL-devel \ + libjson-c2 \ + libjson-c-devel \ + atk-devel \ + gtk2-devel \ + libbz2-1 \ + libbz2-devel \ + liblzma-devel \ + liblcms2-2 \ + liblcms2-devel \ + libgs8 \ + libgs-devel \ + libmng1 \ + libmng-devel \ + libpoppler-glib8 \ + libpoppler-glib-devel \ + poppler-data \ + xpm-nox-devel headers \ + iso-codes-devel \ + libwmf-devel \ + libgexiv2-devel headers + + wget http://prdownloads.sourceforge.net/libpng/libpng-1.6.29.tar.xz + tar xf libpng-1.6.29.tar.xz + pushd libpng-1.6.29 + crossroad configure + make && make install + popd + + git clone git://git.gnome.org/babl + pushd babl + crossroad configure + make && make install + popd + + git clone git://git.gnome.org/gegl + pushd gegl + crossroad configure + make && make install + popd + + git clone https://github.com/mypaint/libmypaint.git + cd libmypaint + crossroad configure + make && make install + popd + + git clone git://git.gnome.org/gimp + crossroad configure --disable-python + make && make install + popd + +Check out the full tutorial for more details. + +Note: this is basically the same thing as the Mingw64 cross build, simply crossroad wraps all the complicated parts! + +== Cross-Compiling GIMP under Linux using MinGW-w64 == + +Experience shows that working with the MinGW environment on a Linux machine provides a much faster compilation, and you are still able to compile for any Windows target (32 and 64 bits). + +NOTE: the following procedure should be distribution-independent and does not rely on your package management system, even though it uses some OpenSuse packages. It would probably work on OSX or any other UNIX as well (add a note on the list below if you know this procedure works on another OS). + +Has been known to work on at least: Linux Mint 15, Ubuntu 12.04LST and Mageia 2 distributions. + +''Source of the original procedure from an [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email by Victor Oliveira].'' + +=== Install mingw-w64 === +This procedure relies on the newer [http://mingw-w64.sourceforge.net/ MinGW-w64] project. + +If your distribution provides the mingw-w64 tools, you may install them with your package manager. + +Otherwise, download directly the last release [https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release on Sourceforge]. + +The archive contains a prefix tree, that you can consider as read-only (just like your linux system). + +=== Install GIMP Dependencies === + +The default environment provided by MinGW does not have the huge list of dependencies that GIMP requires. + +Fortunately the [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email] linked above has bash script named '''grab-stuff.sh''' (which calls itself a python3 script named "download-mingw-rpm.py", so you have to download both and have python3), which downloads pre-compiled version of all needed dependencies for cross-compiling (it uses OpenSuse repositories as source, but it does not mean at all you need rpm support). + +From the root of your cross-compiling prefix ($HOME/w64) run: + bash grab-stuff.sh + +You will notice in particular a new usr/ folder, and inside i686-w64-mingw32/ and x86_64-w64-mingw32/ sub-folders. + +TODO : Make a proper dependency list. + +=== Set your cross-compiling environment === + +Define the environment variables as described in [[Hacking:Building]]. You may also need to reset pkg-config: + export PKG_CONFIG_LIBDIR= + +=== Build BABL === + git clone git://git.gnome.org/babl + cd babl + ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no + make + make install + +=== Build GEGL === + git clone git://git.gnome.org/gegl + cd gegl + ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-docs --disable-glibtest + make + make install + +=== Build any optional dependency === + +This step is not necessary if you compile GIMP with the minimum set of dependency as indicated at the next section. + +==== Compression support ==== +Nevertheless if for instance, you needed compression support (hence be able to load and save your images in various compressed format), you would need zlib,libbzip2 and liblzma installed. In particular the cross-compilation environment described on this page has no pre-compiled liblzma. You would need to cross-compile it first yourself. + +In my case xz-5.0.4 worked well. + + cd .. + wget http://tukaani.org/xz/xz-5.0.4.tar.xz + tar xf xz-5.0.4.tar.xz + rm xz-5.0.4.tar.xz + cd xz-5.0.4 + ./configure --prefix=$PREFIX --host=$HOST + make + make install + +Finally obviously in the GIMP configure step, remove the ''--without-liblzma'' option on the autogen.sh command line before compiling GIMP. + +You should be able to do similar things for other optional features that you would want on your cross-compiled GIMP. + +Alternatively there exists a [http://eternallybored.org/misc/gimp/configrue-libbz2.patch patch] to get compression support working in 32 bit builds. + +==== Multi-Language support ==== +Multi-Language support is installed with the grab-stuff.sh script. Due to a bug in the package mingw32-iso-codes-devel the pkgconfig program can't find the iso-codes package. +In this case you will notice, that GIMPs autogen.sh reports + +Language selection: no + +and the finished GIMP build has no language selector listbox in ''Edit/Preferences/Interface''. +To solve this, copy ''$HOME/w64/usr/$HOST/sys-root/mingw/share/pkgconfig/iso-codes.pc'' to ''$HOME/w64/usr/$HOST/sys-root/mingw/lib/pkgconfig'' before executing autogen.sh or configure for GIMP. +Note you have to do this for every value of $HOST you want to build (e.g. i686 and x86_64 architecture). +Also merge the MinGW and GIMP build folders when installing it on Windows (see the [[#Troubleshooting | Troubleshooting section]]). + +=== Build GIMP === + + cd .. + git clone git://git.gnome.org/gimp + cd gimp + ./autogen.sh --prefix=$PREFIX --host=$HOST \ + --enable-introspection=no \ + --disable-glibtest \ + --disable-gtktest \ + --disable-docs \ + --without-libjpeg \ + --disable-python \ + --without-xmc \ + --without-dbus \ + --without-libzma \ + make + make install + +=== Install On Windows === + +To test your compiled installation, I found nothing better than moving the whole tree (in my case $HOME/w64) into Windows, because libraries are dynamically linked, then run $HOME/w64/bin/gimp-2.9.exe under Windows. + +If you really want to build a self contained GIMP, you should compile everything as static libraries. +GIMP will probably still rely on some external files though, for instance what you find under $HOME/w64/share/gimp/2.0/. Maybe other things. But this will have to be tested if needed. + + +=== Troubleshooting === + +==== Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + +==== Some fonts, like Sans, are shown improperly ==== +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + +== Troubleshooting == + +==== Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + +==== Some fonts, like Sans, are shown improperly ==== +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + +== Building GIMP using Microsoft tools == + +Microsoft Visual Studio comes with its own C compiler. +Most of GIMP development is done with the GCC and its MinGW Windows port. + +Unfortunately both are not fully compatible, so integrating GCC into the +Visual Studio build chain has its flaws, even while it might work in some points. + +Because of this you are recommended to use MinGW for building GIMP on Windows. + +== Building GIMP plug-ins using Microsoft tools == + +[http://web.archive.org/web/20150906090521/http://registry.gimp.org/node/24883 How to build a GIMP plug-in with Visual Studio] (archive.org link salvaged, original link, now broken, was: http://registry.gimp.org/node/24883) + +== Packaging third-party GIMP plug-ins for Windows == + +Users on the Windows and Mac OSX platforms expect software to be packaged in a self-installing file (an installer). Even though GIMP plugins (whether scripts in Python or Scheme, or executables in the C language) are relatively easy to install, you might want to package them using an installer such as [http://www.jrsoftware.org/isinfo.php Inno Setup]. diff --git a/wiki/Hacking:Building%2Linux-20210108005109-show.txt b/wiki/Hacking:Building%2Linux-20210108005109-show.txt new file mode 100644 index 0000000..1e1bd91 --- /dev/null +++ b/wiki/Hacking:Building%2Linux-20210108005109-show.txt @@ -0,0 +1,74 @@ + + +The main GIMP building instructions are at [[Hacking:Building]]. + +This page is for Linux-specific additions to that page. + + +==Dependencies== + +GIMP depends on many packages in addition to babl, gegl, libmypaint and mypaint-brushes. + +Gimp.org may change the requirements for each Gimp release. +Gimp.org changes which packages are required. +The package names generally do not change. +Build options affect which packages are required. + +This page lists dependencies for some linux distributions, on certain dates, with all build options enabled. + + +====Ubuntu 19.10==== + +Working in October 2019. + +
    sudo apt install \
    +    libtool intltool \
    +    meson \
    +    asciidoc \
    +    exiv2 libgexiv2-dev \
    +    gjs \
    +    gtk-3-examples \
    +    gtk-doc-tools \
    +    jasper \
    +    libaa1-dev \
    +    libappstream-glib-dev \
    +    libarchive-dev \
    +    libavcodec-dev libavformat-dev libavutil-dev \
    +    libbz2-dev \
    +    libgs-dev \
    +    libgtk-3-dev libgtk2.0-dev gobject-introspection \
    +    libgirepository1.0-dev \
    +    libgudev-1.0-dev \
    +    libheif-dev \
    +    libjson-c-dev libjson-glib-dev \
    +    liblcms2-dev \
    +    liblensfun-dev \
    +    libmng-dev \
    +    libopenexr-dev \
    +    libjpeg-dev libopenjp2-7-dev \
    +    libpoppler-glib-dev \
    +    libraw-dev \
    +    librsvg2-bin librsvg2-dev \
    +    libsdl2-dev \
    +    libspiro-dev \
    +    libswscale-dev \
    +    libtiff-dev \
    +    libumfpack5 \
    +    libv4l-dev \
    +    libwebkit2gtk-4.0-dev \
    +    libwebp-dev \
    +    luajit \
    +    python-gi-dev python3-venv python3-wheel \
    +    ruby \
    +    w3m \
    +    xsltproc
    +
    + +Added in 2020: + +
        valac
    +
    + +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg, an executable binary, has moved from package gtk-3-examples to package libgtk-3-bin. + + \ No newline at end of file diff --git a/wiki/Hacking:Building%2Linux-20210818145611-show.txt b/wiki/Hacking:Building%2Linux-20210818145611-show.txt new file mode 100644 index 0000000..17f0703 --- /dev/null +++ b/wiki/Hacking:Building%2Linux-20210818145611-show.txt @@ -0,0 +1,77 @@ + + +The main GIMP building instructions are at [[Hacking:Building]]. + +This page is for Linux-specific additions to that page. + + +==Dependencies== + +GIMP depends on many packages in addition to babl, gegl, libmypaint and mypaint-brushes. + +Gimp.org may change the requirements for each Gimp release. +Gimp.org changes which packages are required. +The package names generally do not change. +Build options affect which packages are required. + +This page lists dependencies for some linux distributions, on certain dates, with all build options enabled. + + +====Ubuntu 19.10==== + +Working in October 2019. + +
    sudo apt install \
    +    libtool intltool \
    +    meson \
    +    asciidoc \
    +    exiv2 libgexiv2-dev \
    +    gjs \
    +    gtk-3-examples \
    +    gtk-doc-tools \
    +    jasper \
    +    libaa1-dev \
    +    libappstream-glib-dev \
    +    libarchive-dev \
    +    libavcodec-dev libavformat-dev libavutil-dev \
    +    libbz2-dev \
    +    libgs-dev \
    +    libgtk-3-dev libgtk2.0-dev gobject-introspection \
    +    libgirepository1.0-dev \
    +    libgudev-1.0-dev \
    +    libheif-dev \
    +    libjson-c-dev libjson-glib-dev \
    +    liblcms2-dev \
    +    liblensfun-dev \
    +    libmng-dev \
    +    libopenexr-dev \
    +    libjpeg-dev libopenjp2-7-dev \
    +    libpoppler-glib-dev \
    +    libraw-dev \
    +    librsvg2-bin librsvg2-dev \
    +    libsdl2-dev \
    +    libspiro-dev \
    +    libswscale-dev \
    +    libtiff-dev \
    +    libumfpack5 \
    +    libv4l-dev \
    +    libwebkit2gtk-4.0-dev \
    +    libwebp-dev \
    +    luajit \
    +    python-gi-dev python3-venv python3-wheel \
    +    ruby \
    +    w3m \
    +    xsltproc
    +
    + +Added in 2020, when building optional vala language plugins, the vala compiler tool: + +
        valac
    +
    + +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg, an executable binary, has moved from package gtk-3-examples to package libgtk-3-bin. + +Since 2021, when building using the clang compiler, the OpenMP library i.e. -lomp : + +
        libomp-dev
    +
    diff --git a/wiki/Hacking:Building%2Windows-20201108092724-show.txt b/wiki/Hacking:Building%2Windows-20201108092724-show.txt new file mode 100644 index 0000000..2cd0f52 --- /dev/null +++ b/wiki/Hacking:Building%2Windows-20201108092724-show.txt @@ -0,0 +1,543 @@ + + +The main GIMP building instructions are at [[Hacking:Building]]. This page is for Windows-specific additions to that page. + +Note: the instructions are not always kept up to date. The primary development platform is the Debian Testing GNU/Linux distribution, so the very latest code from Git might not always build on other platforms. + + +__TOC__ + +==Building GIMP natively under Windows using MSYS2== + +Msys2 is a POSIX environment with basically everything you would find on a Linux system (shell, package manager, GCC…). It allows to use POSIX tools to build Windows softwares. + + +===Setting up the environment=== + +First, '''follow the installation instructions''' for msys2 available at [https://msys2.github.io/ msys2.github.io]. + +To open a terminal, you need to execute msys2.exe or mingw64.exe + +Update the system : + +
    pacman -Syyuu
    +
    + +If the shell tells you to close the terminal, close MSYS2 and run it again. That is a normal procedure. + + +===Install the dependencies=== + +====If you want to build gimp 2.10==== + +If you have Windows 64bits: + +
    pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-x86_64-toolchain \
    +    mingw-w64-x86_64-asciidoc \
    +    mingw-w64-x86_64-drmingw \
    +    mingw-w64-x86_64-gexiv2 \
    +    mingw-w64-x86_64-ghostscript \
    +    mingw-w64-x86_64-glib-networking \
    +    mingw-w64-x86_64-graphviz \
    +    mingw-w64-x86_64-gtk2 \
    +    mingw-w64-x86_64-gobject-introspection \
    +    mingw-w64-x86_64-iso-codes \
    +    mingw-w64-x86_64-json-c \
    +    mingw-w64-x86_64-json-glib \
    +    mingw-w64-x86_64-lcms2 \
    +    mingw-w64-x86_64-lensfun \
    +    mingw-w64-x86_64-libheif \
    +    mingw-w64-x86_64-libraw \
    +    mingw-w64-x86_64-libspiro \
    +    mingw-w64-x86_64-libwebp \
    +    mingw-w64-x86_64-libwmf \
    +    mingw-w64-x86_64-meson \
    +    mingw-w64-x86_64-mypaint-brushes \
    +    mingw-w64-x86_64-openexr \
    +    mingw-w64-x86_64-poppler \
    +    mingw-w64-x86_64-python2-pygtk \
    +    mingw-w64-x86_64-SDL2 \
    +    mingw-w64-x86_64-suitesparse \
    +    mingw-w64-x86_64-xpm-nox
    +
    + +If you have Windows 32 bit: + +
    pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-i686-toolchain \
    +    mingw-w64-i686-asciidoc \
    +    mingw-w64-i686-drmingw \
    +    mingw-w64-i686-gexiv2 \
    +    mingw-w64-i686-ghostscript \
    +    mingw-w64-i686-glib-networking \
    +    mingw-w64-i686-graphviz \
    +    mingw-w64-i686-gtk2 \
    +    mingw-w64-i686-gobject-introspection \
    +    mingw-w64-i686-iso-codes \
    +    mingw-w64-i686-json-c \
    +    mingw-w64-i686-json-glib \
    +    mingw-w64-i686-lcms2 \
    +    mingw-w64-i686-lensfun \
    +    mingw-w64-i686-libheif \
    +    mingw-w64-i686-libraw \
    +    mingw-w64-i686-libspiro \
    +    mingw-w64-i686-libwebp \
    +    mingw-w64-i686-libwmf \
    +    mingw-w64-i686-meson \
    +    mingw-w64-i686-mypaint-brushes \
    +    mingw-w64-i686-openexr \
    +    mingw-w64-i686-poppler \
    +    mingw-w64-i686-python2-pygtk \
    +    mingw-w64-i686-SDL2 \
    +    mingw-w64-i686-suitesparse \
    +    mingw-w64-i686-xpm-nox
    +
    + +====If you want to build gimp master==== + +If you have Windows 64bits: + +
    pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-x86_64-toolchain \
    +    mingw-w64-x86_64-appstream-glib \
    +    mingw-w64-x86_64-asciidoc \
    +    mingw-w64-x86_64-drmingw \
    +    mingw-w64-x86_64-gexiv2 \
    +    mingw-w64-x86_64-ghostscript \
    +    mingw-w64-x86_64-glib-networking \
    +    mingw-w64-x86_64-graphviz \
    +    mingw-w64-x86_64-gtk3 \
    +    mingw-w64-x86_64-gobject-introspection \
    +    mingw-w64-x86_64-iso-codes \
    +    mingw-w64-x86_64-json-c \
    +    mingw-w64-x86_64-json-glib \
    +    mingw-w64-x86_64-lcms2 \
    +    mingw-w64-x86_64-lensfun \
    +    mingw-w64-x86_64-libarchive \
    +    mingw-w64-x86_64-libheif \
    +    mingw-w64-x86_64-libraw \
    +    mingw-w64-x86_64-libspiro \
    +    mingw-w64-x86_64-libwebp \
    +    mingw-w64-x86_64-libwmf \
    +    mingw-w64-x86_64-luajit \
    +    mingw-w64-x86_64-meson \
    +    mingw-w64-x86_64-mypaint-brushes \
    +    mingw-w64-x86_64-openexr \
    +    mingw-w64-x86_64-poppler \
    +    mingw-w64-x86_64-python3-gobject \
    +    mingw-w64-x86_64-SDL2 \
    +    mingw-w64-x86_64-suitesparse \
    +    mingw-w64-x86_64-vala \
    +    mingw-w64-x86_64-xpm-nox
    +
    + +If you have Windows 32bits: + +
      pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-i686-toolchain \
    +    mingw-w64-i686-appstream-glib \
    +    mingw-w64-i686-asciidoc \
    +    mingw-w64-i686-drmingw \
    +    mingw-w64-i686-gexiv2 \
    +    mingw-w64-i686-ghostscript \
    +    mingw-w64-i686-glib-networking \
    +    mingw-w64-i686-graphviz \
    +    mingw-w64-i686-gtk3 \
    +    mingw-w64-i686-gobject-introspection \
    +    mingw-w64-i686-iso-codes \
    +    mingw-w64-i686-json-c \
    +    mingw-w64-i686-json-glib \
    +    mingw-w64-i686-lcms2 \
    +    mingw-w64-i686-lensfun \
    +    mingw-w64-i686-libarchive \
    +    mingw-w64-i686-libheif \
    +    mingw-w64-i686-libraw \
    +    mingw-w64-i686-libspiro \
    +    mingw-w64-i686-libwebp \
    +    mingw-w64-i686-libwmf \
    +    mingw-w64-i686-luajit \
    +    mingw-w64-i686-meson \
    +    mingw-w64-i686-mypaint-brushes \
    +    mingw-w64-i686-openexr \
    +    mingw-w64-i686-poppler \
    +    mingw-w64-i686-python3-gobject \
    +    mingw-w64-i686-SDL2 \
    +    mingw-w64-i686-suitesparse \
    +    mingw-w64-i686-vala \
    +    mingw-w64-i686-xpm-nox
    +
    + +Simply hit enter at the prompts for which packages to install (default=all). This step will download a ton of packages, and may take a while. + + +===Building the software=== + +You can now just follow the instruction on the main page [[Hacking:Building]]. Just be careful of the following changes : + +
    export GIMP_PREFIX=`realpath ~/gimp_prefix`
    +export PATH="$GIMP_PREFIX/bin:$PATH"
    +export PKG_CONFIG_PATH="$GIMP_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
    +export PKG_CONFIG_PATH="$GIMP_PREFIXshare/pkgconfig:$PKG_CONFIG_PATH"
    +export LD_LIBRARY_PATH="$GIMP_PREFIX/lib:$LD_LIBRARY_PATH"
    +
    + +* If you are on Windows 64bits, you need to add mingw64 on 32bits mingw32 +
    #environment variable for Autotools
    +export ACLOCAL_FLAGS="-I/c/msys64/mingw64/share/aclocal"
    +#environment variable for introspection
    +export XDG_DATA_DIRS="$XDG_DATA_DIRS:$GIMP_PREFIX/share:/usr/local/share/:/usr/share/:/mingw64/share/"
    +
    + + +You can add all the environment variable on C:\msys64_or_msys32\home\{USERNAME}\.bash_profile then run + +
    . .bash_profile
    +
    + + + +* Disable docs for Babl : -Dwith-docs=false while calling Meson. + +* Disable docs for Gegl : -Ddocs=false while calling Meson. + + +You may want to disable the docs while building Gimp : + + +* Meson build : -Dgtk-doc=false -Dgtk-doc-app=false +* Autotools build : --disable-docs + +==Cross-Compiling GIMP under UNIX using crossroad== + +A tool named [https://pypi.python.org/pypi/crossroad crossroad] has been developed to cross-build for Windows under Linux (it was even originally started to crossbuild GIMP specifically). + +See the [http://girinstud.io/news/2016/05/crossroad-0-6-released-cross-building-gimp-as-an-example/ tutorial explaining how to build GIMP with it]. + +Condensed, here is the process: + +
    crossroad w64 gimp-build
    +
    +crossroad install \
    +    glib2-devel \
    +    libexiv2-devel \
    +    json-glib-devel \
    +    libjpeg8-devel \
    +    libpng-devel \
    +    cairo-devel \
    +    libtiff-devel \
    +    librsvg-2-2 \
    +    librsvg-devel \
    +    pango-devel \
    +    libwebp5 \
    +    libwebp-devel \
    +    libjasper-devel \
    +    gdk-pixbuf-devel \
    +    libSDL-devel \
    +    libjson-c2 \
    +    libjson-c-devel \
    +    atk-devel \
    +    gtk2-devel \
    +    libbz2-1 \
    +    libbz2-devel \
    +    liblzma-devel \
    +    liblcms2-2 \
    +    liblcms2-devel \
    +    libgs8 \
    +    libgs-devel \
    +    libmng1 \
    +    libmng-devel \
    +    libpoppler-glib8 \
    +    libpoppler-glib-devel \
    +    poppler-data \
    +    xpm-nox-devel headers \
    +    iso-codes-devel \
    +    libwmf-devel \
    +    libgexiv2-devel headers
    +
    +wget [http://prdownloads.sourceforge.net/libpng/libpng-1.6.29.tar.xz http://prdownloads.sourceforge.net/libpng/libpng-1.6.29.tar.xz]
    +tar xf libpng-1.6.29.tar.xz
    +pushd libpng-1.6.29
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone git://git.gnome.org/babl
    +pushd babl
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone git://git.gnome.org/gegl
    +pushd gegl
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone [https://github.com/mypaint/libmypaint.git https://github.com/mypaint/libmypaint.git]
    +cd libmypaint
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone git://git.gnome.org/gimp
    +crossroad configure --disable-python
    +make && make install
    +popd
    +
    + +Check out the full tutorial for more details. + +Note: this is basically the same thing as the Mingw64 cross build, simply crossroad wraps all the complicated parts! + + +==Cross-Compiling GIMP under Linux using MinGW-w64== + +Experience shows that working with the MinGW environment on a Linux machine provides a much faster compilation, and you are still able to compile for any Windows target (32 and 64 bits). + +NOTE: the following procedure should be distribution-independent and does not rely on your package management system, even though it uses some OpenSuse packages. It would probably work on OSX or any other UNIX as well (add a note on the list below if you know this procedure works on another OS). + +Has been known to work on at least: Linux Mint 15, Ubuntu 12.04LST and Mageia 2 distributions. + +''Source of the original procedure from an [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email by Victor Oliveira].'' + + +===Install mingw-w64=== + +This procedure relies on the newer [http://mingw-w64.sourceforge.net/ MinGW-w64] project. + +If your distribution provides the mingw-w64 tools, you may install them with your package manager. + +Otherwise, download directly the last release [https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release on Sourceforge]. + +The archive contains a prefix tree, that you can consider as read-only (just like your linux system). + + +===Install GIMP Dependencies=== + +The default environment provided by MinGW does not have the huge list of dependencies that GIMP requires. + +Fortunately the [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email] linked above has bash script named '''grab-stuff.sh''' (which calls itself a python3 script named "download-mingw-rpm.py", so you have to download both and have python3), which downloads pre-compiled version of all needed dependencies for cross-compiling (it uses OpenSuse repositories as source, but it does not mean at all you need rpm support). + +From the root of your cross-compiling prefix ($HOME/w64) run: + +
    bash grab-stuff.sh
    +
    + +You will notice in particular a new usr/ folder, and inside i686-w64-mingw32/ and x86_64-w64-mingw32/ sub-folders. + +TODO : Make a proper dependency list. + + +===Set your cross-compiling environment=== + +Define the environment variables as described in [[Hacking:Building]]. You may also need to reset pkg-config: + +
    export PKG_CONFIG_LIBDIR=
    +
    + +===Build BABL=== +
    git clone git://git.gnome.org/babl
    +cd babl
    +./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no
    +make
    +make install
    +
    + +===Build GEGL=== +
    git clone git://git.gnome.org/gegl
    +cd gegl
    +./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-docs --disable-glibtest
    +make
    +make install
    +
    + +===Build any optional dependency=== + +This step is not necessary if you compile GIMP with the minimum set of dependency as indicated at the next section. + + +====Compression support==== + +Nevertheless if for instance, you needed compression support (hence be able to load and save your images in various compressed format), you would need zlib,libbzip2 and liblzma installed. In particular the cross-compilation environment described on this page has no pre-compiled liblzma. You would need to cross-compile it first yourself. + +In my case xz-5.0.4 worked well. + +
    cd ..
    +wget [http://tukaani.org/xz/xz-5.0.4.tar.xz http://tukaani.org/xz/xz-5.0.4.tar.xz]
    +tar xf xz-5.0.4.tar.xz
    +rm xz-5.0.4.tar.xz
    +cd xz-5.0.4
    +./configure --prefix=$PREFIX --host=$HOST
    +make
    +make install
    +
    + +Finally obviously in the GIMP configure step, remove the ''--without-liblzma'' option on the autogen.sh command line before compiling GIMP. + +You should be able to do similar things for other optional features that you would want on your cross-compiled GIMP. + +Alternatively there exists a [http://eternallybored.org/misc/gimp/configrue-libbz2.patch patch] to get compression support working in 32 bit builds. + + +====Multi-Language support==== + +Multi-Language support is installed with the grab-stuff.sh script. Due to a bug in the package mingw32-iso-codes-devel the pkgconfig program can't find the iso-codes package. +In this case you will notice, that GIMPs autogen.sh reports + +Language selection: no + +and the finished GIMP build has no language selector listbox in ''Edit/Preferences/Interface''. +To solve this, copy ''$HOME/w64/usr/$HOST/sys-root/mingw/share/pkgconfig/iso-codes.pc'' to ''$HOME/w64/usr/$HOST/sys-root/mingw/lib/pkgconfig'' before executing autogen.sh or configure for GIMP. +Note you have to do this for every value of $HOST you want to build (e.g. i686 and x86_64 architecture). +Also merge the MinGW and GIMP build folders when installing it on Windows (see the Troubleshooting section). + + +===Build GIMP=== +
    cd ..
    +git clone git://git.gnome.org/gimp
    +cd gimp
    +./autogen.sh  --prefix=$PREFIX  --host=$HOST \
    +    --enable-introspection=no \
    +    --disable-glibtest \
    +    --disable-gtktest \
    +    --disable-docs \
    +    --without-libjpeg \
    +    --disable-python \
    +    --without-xmc \
    +    --without-dbus \
    +    --without-libzma \
    +make
    +make install
    +
    + +===Install On Windows=== + +To test your compiled installation, I found nothing better than moving the whole tree (in my case $HOME/w64) into Windows, because libraries are dynamically linked, then run $HOME/w64/bin/gimp-2.9.exe under Windows. + +If you really want to build a self contained GIMP, you should compile everything as static libraries. +GIMP will probably still rely on some external files though, for instance what you find under $HOME/w64/share/gimp/2.0/. Maybe other things. But this will have to be tested if needed. + + + + + +===Troubleshooting=== + +====Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== + +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + + +====Some fonts, like Sans, are shown improperly==== + +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + + +==Troubleshooting== + +====Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== + +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + + +====Some fonts, like Sans, are shown improperly==== + +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + + +==Building GIMP using Microsoft tools== + +Microsoft Visual Studio comes with its own C compiler. +Most of GIMP development is done with the GCC and its MinGW Windows port. + +Unfortunately both are not fully compatible, so integrating GCC into the +Visual Studio build chain has its flaws, even while it might work in some points. + +Because of this you are recommended to use MinGW for building GIMP on Windows. + + +==Building GIMP plug-ins using Microsoft tools== + +[http://web.archive.org/ How to build a GIMP plug-in with Visual Studio] (archive.org link salvaged, original link, now broken, was: [http://registry.gimp.org/node/24883 http://registry.gimp.org/node/24883]) + + +==Packaging third-party GIMP plug-ins for Windows== + +Users on the Windows and Mac OSX platforms expect software to be packaged in a self-installing file (an installer). Even though GIMP plugins (whether scripts in Python or Scheme, or executables in the C language) are relatively easy to install, you might want to package them using an installer such as [http://www.jrsoftware.org/isinfo.php Inno Setup]. + + \ No newline at end of file diff --git a/wiki/Hacking:Building%2Windows-20210830111407-show.txt b/wiki/Hacking:Building%2Windows-20210830111407-show.txt new file mode 100644 index 0000000..ca8ed76 --- /dev/null +++ b/wiki/Hacking:Building%2Windows-20210830111407-show.txt @@ -0,0 +1,545 @@ + + +The main GIMP building instructions are at [[Hacking:Building]]. This page is for Windows-specific additions to that page. + +Note: the instructions are not always kept up to date. The primary development platform is the Debian Testing GNU/Linux distribution, so the very latest code from Git might not always build on other platforms. + + +__TOC__ + +==Building GIMP natively under Windows using MSYS2== + +Msys2 is a POSIX environment with basically everything you would find on a Linux system (shell, package manager, GCC…). It allows to use POSIX tools to build Windows softwares. + + +===Setting up the environment=== + +First, '''follow the installation instructions''' for msys2 available at [https://msys2.github.io/ msys2.github.io]. + +To open a terminal, you need to execute msys2.exe or mingw64.exe + +Update the system : + +
    pacman -Syyuu
    +
    + +If the shell tells you to close the terminal, close MSYS2 and run it again. That is a normal procedure. + + +===Install the dependencies=== + +====If you want to build gimp 2.10==== + +If you have Windows 64bits: + +
    pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-x86_64-toolchain \
    +    mingw-w64-x86_64-asciidoc \
    +    mingw-w64-x86_64-drmingw \
    +    mingw-w64-x86_64-gexiv2 \
    +    mingw-w64-x86_64-ghostscript \
    +    mingw-w64-x86_64-glib-networking \
    +    mingw-w64-x86_64-graphviz \
    +    mingw-w64-x86_64-gtk2 \
    +    mingw-w64-x86_64-gobject-introspection \
    +    mingw-w64-x86_64-iso-codes \
    +    mingw-w64-x86_64-json-c \
    +    mingw-w64-x86_64-json-glib \
    +    mingw-w64-x86_64-lcms2 \
    +    mingw-w64-x86_64-lensfun \
    +    mingw-w64-x86_64-libheif \
    +    mingw-w64-x86_64-libraw \
    +    mingw-w64-x86_64-libspiro \
    +    mingw-w64-x86_64-libwebp \
    +    mingw-w64-x86_64-libwmf \
    +    mingw-w64-x86_64-meson \
    +    mingw-w64-x86_64-mypaint-brushes \
    +    mingw-w64-x86_64-openexr \
    +    mingw-w64-x86_64-poppler \
    +    mingw-w64-x86_64-python2-pygtk \
    +    mingw-w64-x86_64-SDL2 \
    +    mingw-w64-x86_64-suitesparse \
    +    mingw-w64-x86_64-xpm-nox
    +
    + +If you have Windows 32 bit: + +
    pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-i686-toolchain \
    +    mingw-w64-i686-asciidoc \
    +    mingw-w64-i686-drmingw \
    +    mingw-w64-i686-gexiv2 \
    +    mingw-w64-i686-ghostscript \
    +    mingw-w64-i686-glib-networking \
    +    mingw-w64-i686-graphviz \
    +    mingw-w64-i686-gtk2 \
    +    mingw-w64-i686-gobject-introspection \
    +    mingw-w64-i686-iso-codes \
    +    mingw-w64-i686-json-c \
    +    mingw-w64-i686-json-glib \
    +    mingw-w64-i686-lcms2 \
    +    mingw-w64-i686-lensfun \
    +    mingw-w64-i686-libheif \
    +    mingw-w64-i686-libraw \
    +    mingw-w64-i686-libspiro \
    +    mingw-w64-i686-libwebp \
    +    mingw-w64-i686-libwmf \
    +    mingw-w64-i686-meson \
    +    mingw-w64-i686-mypaint-brushes \
    +    mingw-w64-i686-openexr \
    +    mingw-w64-i686-poppler \
    +    mingw-w64-i686-python2-pygtk \
    +    mingw-w64-i686-SDL2 \
    +    mingw-w64-i686-suitesparse \
    +    mingw-w64-i686-xpm-nox
    +
    + +====If you want to build gimp master==== + +If you have Windows 64bits: + +
    pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-x86_64-toolchain \
    +    mingw-w64-x86_64-appstream-glib \
    +    mingw-w64-x86_64-asciidoc \
    +    mingw-w64-x86_64-drmingw \
    +    mingw-w64-x86_64-gexiv2 \
    +    mingw-w64-x86_64-ghostscript \
    +    mingw-w64-x86_64-glib-networking \
    +    mingw-w64-x86_64-graphviz \
    +    mingw-w64-x86_64-gtk3 \
    +    mingw-w64-x86_64-gobject-introspection \
    +    mingw-w64-x86_64-iso-codes \
    +    mingw-w64-x86_64-json-c \
    +    mingw-w64-x86_64-json-glib \
    +    mingw-w64-x86_64-lcms2 \
    +    mingw-w64-x86_64-lensfun \
    +    mingw-w64-x86_64-libarchive \
    +    mingw-w64-x86_64-libheif \
    +    mingw-w64-x86_64-libraw \
    +    mingw-w64-x86_64-libspiro \
    +    mingw-w64-x86_64-libwebp \
    +    mingw-w64-x86_64-libwmf \
    +    mingw-w64-x86_64-luajit \
    +    mingw-w64-x86_64-maxflow \
    +    mingw-w64-x86_64-meson \
    +    mingw-w64-x86_64-mypaint-brushes \
    +    mingw-w64-x86_64-openexr \
    +    mingw-w64-x86_64-poppler \
    +    mingw-w64-x86_64-python3-gobject \
    +    mingw-w64-x86_64-SDL2 \
    +    mingw-w64-x86_64-suitesparse \
    +    mingw-w64-x86_64-vala \
    +    mingw-w64-x86_64-xpm-nox
    +
    + +If you have Windows 32bits: + +
      pacman -S --needed \
    +    base-devel \
    +    git \
    +    mingw-w64-i686-toolchain \
    +    mingw-w64-i686-appstream-glib \
    +    mingw-w64-i686-asciidoc \
    +    mingw-w64-i686-drmingw \
    +    mingw-w64-i686-gexiv2 \
    +    mingw-w64-i686-ghostscript \
    +    mingw-w64-i686-glib-networking \
    +    mingw-w64-i686-graphviz \
    +    mingw-w64-i686-gtk3 \
    +    mingw-w64-i686-gobject-introspection \
    +    mingw-w64-i686-iso-codes \
    +    mingw-w64-i686-json-c \
    +    mingw-w64-i686-json-glib \
    +    mingw-w64-i686-lcms2 \
    +    mingw-w64-i686-lensfun \
    +    mingw-w64-i686-libarchive \
    +    mingw-w64-i686-libheif \
    +    mingw-w64-i686-libraw \
    +    mingw-w64-i686-libspiro \
    +    mingw-w64-i686-libwebp \
    +    mingw-w64-i686-libwmf \
    +    mingw-w64-i686-luajit \
    +    mingw-w64-i686-maxflow \
    +    mingw-w64-i686-meson \
    +    mingw-w64-i686-mypaint-brushes \
    +    mingw-w64-i686-openexr \
    +    mingw-w64-i686-poppler \
    +    mingw-w64-i686-python3-gobject \
    +    mingw-w64-i686-SDL2 \
    +    mingw-w64-i686-suitesparse \
    +    mingw-w64-i686-vala \
    +    mingw-w64-i686-xpm-nox
    +
    + +Simply hit enter at the prompts for which packages to install (default=all). This step will download a ton of packages, and may take a while. + + +===Building the software=== + +You can now just follow the instruction on the main page [[Hacking:Building]]. Just be careful of the following changes : + +
    export GIMP_PREFIX=`realpath ~/gimp_prefix`
    +export PATH="$GIMP_PREFIX/bin:$PATH"
    +export PKG_CONFIG_PATH="$GIMP_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
    +export PKG_CONFIG_PATH="$GIMP_PREFIX/share/pkgconfig:$PKG_CONFIG_PATH"
    +export LD_LIBRARY_PATH="$GIMP_PREFIX/lib:$LD_LIBRARY_PATH"
    +
    + +* If you are on Windows 64bits, you need to add mingw64 on 32bits mingw32 +
    #environment variable for Autotools
    +export ACLOCAL_FLAGS="-I/c/msys64/mingw64/share/aclocal"
    +#environment variable for introspection
    +export XDG_DATA_DIRS="$XDG_DATA_DIRS:$GIMP_PREFIX/share:/usr/local/share/:/usr/share/:/mingw64/share/"
    +
    + + +You can add all the environment variable on C:\msys64_or_msys32\home\{USERNAME}\.bash_profile then run + +
    . .bash_profile
    +
    + + + +* Disable docs for Babl : -Dwith-docs=false while calling Meson. + +* Disable docs for Gegl : -Ddocs=false while calling Meson. + + +You may want to disable the docs while building Gimp : + + +* Meson build : -Dgtk-doc=false -Dgtk-doc-app=false +* Autotools build : --disable-docs + +==Cross-Compiling GIMP under UNIX using crossroad== + +A tool named [https://pypi.python.org/pypi/crossroad crossroad] has been developed to cross-build for Windows under Linux (it was even originally started to crossbuild GIMP specifically). + +See the [http://girinstud.io/news/2016/05/crossroad-0-6-released-cross-building-gimp-as-an-example/ tutorial explaining how to build GIMP with it]. + +Condensed, here is the process: + +
    crossroad w64 gimp-build
    +
    +crossroad install \
    +    glib2-devel \
    +    libexiv2-devel \
    +    json-glib-devel \
    +    libjpeg8-devel \
    +    libpng-devel \
    +    cairo-devel \
    +    libtiff-devel \
    +    librsvg-2-2 \
    +    librsvg-devel \
    +    pango-devel \
    +    libwebp5 \
    +    libwebp-devel \
    +    libjasper-devel \
    +    gdk-pixbuf-devel \
    +    libSDL-devel \
    +    libjson-c2 \
    +    libjson-c-devel \
    +    atk-devel \
    +    gtk2-devel \
    +    libbz2-1 \
    +    libbz2-devel \
    +    liblzma-devel \
    +    liblcms2-2 \
    +    liblcms2-devel \
    +    libgs8 \
    +    libgs-devel \
    +    libmng1 \
    +    libmng-devel \
    +    libpoppler-glib8 \
    +    libpoppler-glib-devel \
    +    poppler-data \
    +    xpm-nox-devel headers \
    +    iso-codes-devel \
    +    libwmf-devel \
    +    libgexiv2-devel headers
    +
    +wget [http://prdownloads.sourceforge.net/libpng/libpng-1.6.29.tar.xz http://prdownloads.sourceforge.net/libpng/libpng-1.6.29.tar.xz]
    +tar xf libpng-1.6.29.tar.xz
    +pushd libpng-1.6.29
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone git://git.gnome.org/babl
    +pushd babl
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone git://git.gnome.org/gegl
    +pushd gegl
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone [https://github.com/mypaint/libmypaint.git https://github.com/mypaint/libmypaint.git]
    +cd libmypaint
    +crossroad configure
    +make && make install
    +popd
    +
    +git clone git://git.gnome.org/gimp
    +crossroad configure --disable-python
    +make && make install
    +popd
    +
    + +Check out the full tutorial for more details. + +Note: this is basically the same thing as the Mingw64 cross build, simply crossroad wraps all the complicated parts! + + +==Cross-Compiling GIMP under Linux using MinGW-w64== + +Experience shows that working with the MinGW environment on a Linux machine provides a much faster compilation, and you are still able to compile for any Windows target (32 and 64 bits). + +NOTE: the following procedure should be distribution-independent and does not rely on your package management system, even though it uses some OpenSuse packages. It would probably work on OSX or any other UNIX as well (add a note on the list below if you know this procedure works on another OS). + +Has been known to work on at least: Linux Mint 15, Ubuntu 12.04LST and Mageia 2 distributions. + +''Source of the original procedure from an [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email by Victor Oliveira].'' + + +===Install mingw-w64=== + +This procedure relies on the newer [http://mingw-w64.sourceforge.net/ MinGW-w64] project. + +If your distribution provides the mingw-w64 tools, you may install them with your package manager. + +Otherwise, download directly the last release [https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release on Sourceforge]. + +The archive contains a prefix tree, that you can consider as read-only (just like your linux system). + + +===Install GIMP Dependencies=== + +The default environment provided by MinGW does not have the huge list of dependencies that GIMP requires. + +Fortunately the [https://mail.gnome.org/archives/gimp-developer-list/2012-May/msg00067.html email] linked above has bash script named '''grab-stuff.sh''' (which calls itself a python3 script named "download-mingw-rpm.py", so you have to download both and have python3), which downloads pre-compiled version of all needed dependencies for cross-compiling (it uses OpenSuse repositories as source, but it does not mean at all you need rpm support). + +From the root of your cross-compiling prefix ($HOME/w64) run: + +
    bash grab-stuff.sh
    +
    + +You will notice in particular a new usr/ folder, and inside i686-w64-mingw32/ and x86_64-w64-mingw32/ sub-folders. + +TODO : Make a proper dependency list. + + +===Set your cross-compiling environment=== + +Define the environment variables as described in [[Hacking:Building]]. You may also need to reset pkg-config: + +
    export PKG_CONFIG_LIBDIR=
    +
    + +===Build BABL=== +
    git clone git://git.gnome.org/babl
    +cd babl
    +./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no
    +make
    +make install
    +
    + +===Build GEGL=== +
    git clone git://git.gnome.org/gegl
    +cd gegl
    +./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-docs --disable-glibtest
    +make
    +make install
    +
    + +===Build any optional dependency=== + +This step is not necessary if you compile GIMP with the minimum set of dependency as indicated at the next section. + + +====Compression support==== + +Nevertheless if for instance, you needed compression support (hence be able to load and save your images in various compressed format), you would need zlib,libbzip2 and liblzma installed. In particular the cross-compilation environment described on this page has no pre-compiled liblzma. You would need to cross-compile it first yourself. + +In my case xz-5.0.4 worked well. + +
    cd ..
    +wget [http://tukaani.org/xz/xz-5.0.4.tar.xz http://tukaani.org/xz/xz-5.0.4.tar.xz]
    +tar xf xz-5.0.4.tar.xz
    +rm xz-5.0.4.tar.xz
    +cd xz-5.0.4
    +./configure --prefix=$PREFIX --host=$HOST
    +make
    +make install
    +
    + +Finally obviously in the GIMP configure step, remove the ''--without-liblzma'' option on the autogen.sh command line before compiling GIMP. + +You should be able to do similar things for other optional features that you would want on your cross-compiled GIMP. + +Alternatively there exists a [http://eternallybored.org/misc/gimp/configrue-libbz2.patch patch] to get compression support working in 32 bit builds. + + +====Multi-Language support==== + +Multi-Language support is installed with the grab-stuff.sh script. Due to a bug in the package mingw32-iso-codes-devel the pkgconfig program can't find the iso-codes package. +In this case you will notice, that GIMPs autogen.sh reports + +Language selection: no + +and the finished GIMP build has no language selector listbox in ''Edit/Preferences/Interface''. +To solve this, copy ''$HOME/w64/usr/$HOST/sys-root/mingw/share/pkgconfig/iso-codes.pc'' to ''$HOME/w64/usr/$HOST/sys-root/mingw/lib/pkgconfig'' before executing autogen.sh or configure for GIMP. +Note you have to do this for every value of $HOST you want to build (e.g. i686 and x86_64 architecture). +Also merge the MinGW and GIMP build folders when installing it on Windows (see the Troubleshooting section). + + +===Build GIMP=== +
    cd ..
    +git clone git://git.gnome.org/gimp
    +cd gimp
    +./autogen.sh  --prefix=$PREFIX  --host=$HOST \
    +    --enable-introspection=no \
    +    --disable-glibtest \
    +    --disable-gtktest \
    +    --disable-docs \
    +    --without-libjpeg \
    +    --disable-python \
    +    --without-xmc \
    +    --without-dbus \
    +    --without-libzma \
    +make
    +make install
    +
    + +===Install On Windows=== + +To test your compiled installation, I found nothing better than moving the whole tree (in my case $HOME/w64) into Windows, because libraries are dynamically linked, then run $HOME/w64/bin/gimp-2.9.exe under Windows. + +If you really want to build a self contained GIMP, you should compile everything as static libraries. +GIMP will probably still rely on some external files though, for instance what you find under $HOME/w64/share/gimp/2.0/. Maybe other things. But this will have to be tested if needed. + + + + + +===Troubleshooting=== + +====Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== + +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + + +====Some fonts, like Sans, are shown improperly==== + +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + + +==Troubleshooting== + +====Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.==== + +'''Cause:''' + +The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders. + +'''Solution:''' + +To export the GIMP build to Windows properly, use the following steps: + +1. On Windows create a folder for the GIMP build, like GIMP-Master. + +2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder. + +3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm. + +It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build. + +At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. +(It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.) + + +====Some fonts, like Sans, are shown improperly==== + +See also [https://bugzilla.gnome.org/show_bug.cgi?id=688593 the Bugzilla report]. + +'''Cause:''' + +The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid. + +'''Solution:''' + +The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system: + +1. Close GIMP. + +2. Edit the file ''\etc\fonts\fonts.conf'': + +Replace the line $a_directory/conf.d by ..\..\share\fontconfig\conf.avail + +3. Restart GIMP. + + +==Building GIMP using Microsoft tools== + +Microsoft Visual Studio comes with its own C compiler. +Most of GIMP development is done with the GCC and its MinGW Windows port. + +Unfortunately both are not fully compatible, so integrating GCC into the +Visual Studio build chain has its flaws, even while it might work in some points. + +Because of this you are recommended to use MinGW for building GIMP on Windows. + + +==Building GIMP plug-ins using Microsoft tools== + +[http://web.archive.org/ How to build a GIMP plug-in with Visual Studio] (archive.org link salvaged, original link, now broken, was: [http://registry.gimp.org/node/24883 http://registry.gimp.org/node/24883]) + + +==Packaging third-party GIMP plug-ins for Windows== + +Users on the Windows and Mac OSX platforms expect software to be packaged in a self-installing file (an installer). Even though GIMP plugins (whether scripts in Python or Scheme, or executables in the C language) are relatively easy to install, you might want to package them using an installer such as [http://www.jrsoftware.org/isinfo.php Inno Setup]. + + \ No newline at end of file diff --git a/wiki/Hacking:Building-20150212064206-show.txt b/wiki/Hacking:Building-20150212064206-show.txt new file mode 100644 index 0000000..6084755 --- /dev/null +++ b/wiki/Hacking:Building-20150212064206-show.txt @@ -0,0 +1,89 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core dependss also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requries an additional step (detailed below) and it usually requires more tools. + + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20150905134141-show.txt b/wiki/Hacking:Building-20150905134141-show.txt new file mode 100644 index 0000000..6084755 --- /dev/null +++ b/wiki/Hacking:Building-20150905134141-show.txt @@ -0,0 +1,89 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core dependss also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requries an additional step (detailed below) and it usually requires more tools. + + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20151014043535-show.txt b/wiki/Hacking:Building-20151014043535-show.txt new file mode 100644 index 0000000..6084755 --- /dev/null +++ b/wiki/Hacking:Building-20151014043535-show.txt @@ -0,0 +1,89 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core dependss also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requries an additional step (detailed below) and it usually requires more tools. + + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20160112224754-show.txt b/wiki/Hacking:Building-20160112224754-show.txt new file mode 100644 index 0000000..d069d4f --- /dev/null +++ b/wiki/Hacking:Building-20160112224754-show.txt @@ -0,0 +1,106 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP master also needs [http://en.wikipedia.org/wiki/MyPaint libmypaint-gegl], a library for using MyPaint brushes. Get it from [https://github.com/mypaint/libmypaint%7Cthe MyPaint github repository] and build using the command: + +:scons prefix=YOURPREFIX enable_gegl=true && sudo scons prefix=/OURPREFIX enable_gegl=true install + + + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20160630044241-show.txt b/wiki/Hacking:Building-20160630044241-show.txt new file mode 100644 index 0000000..78522ef --- /dev/null +++ b/wiki/Hacking:Building-20160630044241-show.txt @@ -0,0 +1,107 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP master also needs [http://en.wikipedia.org/wiki/MyPaint libmypaint-gegl], a library for using MyPaint brushes. Get it from [https://github.com/mypaint/libmypaint%7Cthe MyPaint github repository] and build using the usual commands, with one exception: after running ./autogen.sh, you need to run ./configure explicitly with the same arguments: + +:sautogen.sh --prefix=YOURPREFIX --enable_gegl && ./configure --prefix=YOURPREFIX --enable_gegl + + + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20161025144126-show.txt b/wiki/Hacking:Building-20161025144126-show.txt new file mode 100644 index 0000000..78522ef --- /dev/null +++ b/wiki/Hacking:Building-20161025144126-show.txt @@ -0,0 +1,107 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP master also needs [http://en.wikipedia.org/wiki/MyPaint libmypaint-gegl], a library for using MyPaint brushes. Get it from [https://github.com/mypaint/libmypaint%7Cthe MyPaint github repository] and build using the usual commands, with one exception: after running ./autogen.sh, you need to run ./configure explicitly with the same arguments: + +:sautogen.sh --prefix=YOURPREFIX --enable_gegl && ./configure --prefix=YOURPREFIX --enable_gegl + + + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20161126033513-show.txt b/wiki/Hacking:Building-20161126033513-show.txt new file mode 100644 index 0000000..78522ef --- /dev/null +++ b/wiki/Hacking:Building-20161126033513-show.txt @@ -0,0 +1,107 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP master also needs [http://en.wikipedia.org/wiki/MyPaint libmypaint-gegl], a library for using MyPaint brushes. Get it from [https://github.com/mypaint/libmypaint%7Cthe MyPaint github repository] and build using the usual commands, with one exception: after running ./autogen.sh, you need to run ./configure explicitly with the same arguments: + +:sautogen.sh --prefix=YOURPREFIX --enable_gegl && ./configure --prefix=YOURPREFIX --enable_gegl + + + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20170710173015-show.txt b/wiki/Hacking:Building-20170710173015-show.txt new file mode 100644 index 0000000..78522ef --- /dev/null +++ b/wiki/Hacking:Building-20170710173015-show.txt @@ -0,0 +1,107 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP master also needs [http://en.wikipedia.org/wiki/MyPaint libmypaint-gegl], a library for using MyPaint brushes. Get it from [https://github.com/mypaint/libmypaint%7Cthe MyPaint github repository] and build using the usual commands, with one exception: after running ./autogen.sh, you need to run ./configure explicitly with the same arguments: + +:sautogen.sh --prefix=YOURPREFIX --enable_gegl && ./configure --prefix=YOURPREFIX --enable_gegl + + + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20180812150558-show.txt b/wiki/Hacking:Building-20180812150558-show.txt new file mode 100644 index 0000000..78522ef --- /dev/null +++ b/wiki/Hacking:Building-20180812150558-show.txt @@ -0,0 +1,107 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.8, you need the GEGL version from git branch 'gegl-0-2'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP master also needs [http://en.wikipedia.org/wiki/MyPaint libmypaint-gegl], a library for using MyPaint brushes. Get it from [https://github.com/mypaint/libmypaint%7Cthe MyPaint github repository] and build using the usual commands, with one exception: after running ./autogen.sh, you need to run ./configure explicitly with the same arguments: + +:sautogen.sh --prefix=YOURPREFIX --enable_gegl && ./configure --prefix=YOURPREFIX --enable_gegl + + + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://git.gnome.org/browse/gimp/tree/INSTALL?h=gimp-2-8 INSTALL]. +In GIMP master these informations are in the file [https://git.gnome.org/browse/gimp/tree/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git://git.gnome.org/babl
    +git clone git://git.gnome.org/gegl
    +git clone git://git.gnome.org/gimp
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20190507091730-show.txt b/wiki/Hacking:Building-20190507091730-show.txt new file mode 100644 index 0000000..e340610 --- /dev/null +++ b/wiki/Hacking:Building-20190507091730-show.txt @@ -0,0 +1,113 @@ + +
    This page is a work in progress!! +It's based on [http://lightningismyname.blogspot.com/p/compiling-gimp.html this page]
    + +This page contains things that you should know in order to build GIMP. + + +__TOC__ + +==GIMP's dependencies== + +Gimp depends on the following common libraries for it's core: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. +:To build GIMP 2.10, you need the GEGL version from git branch 'gegl-0-4'. + +:To build GIMP master (= the development version of GIMP), you need the GEGL version from git branch 'master'. + + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. + +GIMP also needs For MyPaint brushes, libmypaint. he libmypaint repository is hosted at: [https://github.com/mypaint/libmypaint https://github.com/mypaint/libmypaint] + +If installing from repository, do not install the master branch! Checkout the tag "v1.3.0" instead, or simply install from a tarball or from your favorite package manager. + +We also need the mypaint-brushes data package:[https://github.com/mypaint/mypaint-brushes https://github.com/mypaint/mypaint-brushes]. If installing from repository, install from branch "v1.3.x" or the particular tag "v1.3.0". In particular do not install from master +which installs brushes incompatible with GIMP. +Also this is a data packages and therefore it will install the +pkg-config file inside `$PREFIX/share/pkgconfig/`. If you install +mypaint-brushes from repository in a non-standard prefix, you will +have to make sure your $PKG_CONFIG_PATH environment variable also +lists `$PREFIX/share/pkgconfig/`. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL]. +In GIMP master these informations are in the file [https://gitlab.gnome.org/GNOME/gimp/blob/master/INSTALL.in INSTALL.in] - expect to have to build GIMP first to then know the necessary dependencies for building GIMP ... + + +==Build system== + +===Building from a Tarball vs. building from latest source (Git)=== + +There are 2 types of build we can do: + + +* A build from Tarball - Tarballs (or in short, TARs) are files which pack together many folders and files, and the term of building from a Tarball refers to building from a package of code that you download from the program's website, for an official release of the program. + +You can download tarballs from: + +
    http://download.gimp.org/pub/babl/
    +http://download.gimp.org/pub/gegl/
    +http://download.gimp.org/pub/gimp/
    + +* A build from Git - The latest source of programs is hosted in a version control system (in our case, the version control is called Git) and you can download the updated source directly from these. The source there is the most up-to-date, and it's sometimes unstable. + +It matters to us, in the fact that building from Git requires an additional step (detailed below) and it usually requires more tools. +You can check out the git sources from: + +
    git clone git@gitlab.gnome.org:GNOME/babl.git
    +git clone git@gitlab.gnome.org:GNOME/gegl.git
    +git clone git@gitlab.gnome.org:GNOME/gimp.git
    + +===The build process=== + +GIMP, together with GEGL and babl, all use the Gnu build system. This means that compiling them basically consists of 4 steps: + + +# autogen.sh script - This script generates the ./configure script for the next step
    ./autogen.sh
    In many cases, the autogen script also runs the configure script (see the next step) so we can usually pass arguments to it that will be passed to the configure script. '''This step is only needed when building from Git (and not from a Tarball)!''' +# configure script - This script does many checks to check which compilers and libraries you have available, which features are enabled and not, etc. When it finishes, it generates the Makefile's which are used by the make tool.
    ./configure
    Usually you can see all the options that you can specify to the script, by running
    ./configure --help
    One option that we'll use through all of the building tutorials, is the --prefix option
    ./configure --prefix=/PATH/TO/INSTALL/FOLDER
    The path given there is used to specify where do we want the compiled result to be installed to. This is useful when you want to install to places other than the default, for example when we are doing beta-builds and we don't want them to conflict with our existing installation. This can also be used on Linux/Unix system to install into the home-directory, in cases one does not have root access. +'''If you are doing anything other than simply building __from a tarball__, do not run the configure script directly! Instead, run the autogen script and let it call the configure script for you!''' This is because there are some changes in the code (either locally, or in Git between tarball releases) that will not be handled correctly without the autogen script! (Thanks to schumaml from the GIMP IRC for pointing that out) +# make - The make tool uses files called Makefile, which are present at each directory, in order to call the compilers and other tools and use them on the apropriate source files
    make
    We can speed up the process by running several jobs at once (this is useful when we have a processor with several cores). For example, if we want to run 4 jobs at once, we'll do
    make -j4
    +# Now, we finally install the compiled result by invoking the make tool again, with the "install" target
    make install
    + +==Additional notes== + +===GIMP=== + +* To compile GIMP you need Perl and intltool +* To compile GIMP's Python support, you need PyGTK (a Python package) +* Linking static versions of the most libraries (i.e. libgevix2) is not supported by GIMP. Use their dynamic versions. + +===GEGL=== + +* To compile GEGL from Git, you need Ruby (a language interpreter) + +==Specific Builds== + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows diff --git a/wiki/Hacking:Building-20210107042759-show.txt b/wiki/Hacking:Building-20210107042759-show.txt new file mode 100644 index 0000000..54eef72 --- /dev/null +++ b/wiki/Hacking:Building-20210107042759-show.txt @@ -0,0 +1,339 @@ + + +This page describes how to build GIMP. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in a GIMP repository). +That text file also describes how to build GIMP. + + + + + +__TOC__ + +==Prerequisites== + +You should know how to use: + + +* a terminal and the command line. +* shell environment variables. + + + + +==GIMP's dependencies== + +Gimp depends on quite a few libraries, including but not limited to: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. GIMP 2.99 and later need GTK 3.0. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. +* [http://en.wikipedia.org/wiki/MyPaint MyPaint] - a painting library that allows a lot of flexibility for brushes; it needs both libmypaint (the libmypaint-v1 branch) and mypaint-brushes (the v1.3.x branch). + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + +This list is incomplete. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in GIMP master). + + +==Build system== + +==Preparing for Building== + +You may need to install some software to build GIMP, including a C compiler, make, GNU autotools, meson, and more, plus many dependencies. See the OS-specific pages for details: + + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows +'''1. Choose a place to install everything, and set a variable to point to it:''' + +If you're building Gimp from master, you may not want to install it in your system prefix, as you may break your system Gimp installation, or get odd behavior, especially if you also have a system version of GIMP installed. + +You should then create another prefix directory where Gimp (and some dependencies) may be installed safely. On Linux you could use $HOME/.local. Let's name your custom prefix : + +
    GIMP_PREFIX=${HOME}/gimp_prefix
    +
    +'''3. Set some environment variables:''' + +Some dependencies may be installed in this prefix too, so the build system should be able to find them : + +
    # Used to find programs/tools during build
    +export PATH="${GIMP_PREFIX}/bin:$PATH"
    +
    +# Used to detect the build dependencies
    +export PKG_CONFIG_PATH="${GIMP_PREFIX}/share/pkgconfig:${GIMP_PREFIX}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
    +
    +# Used to find the glib-introspection dependencies
    +export XDG_DATA_DIRS="${XDG_DATA_DIRS:+$XDG_DATA_DIRS:}${GIMP_PREFIX}/share:/usr/local/share:/usr/share"
    +
    +# Used to find the libraries at runtime
    +export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    +
    +# Used by Autotools to find its tools
    +export ACLOCAL_FLAGS="-I $INSTALL_PREFIX/share/aclocal $ACLOCAL_FLAGS"
    +
    + +Later, to run the Gimp you have installed outside the usual places, you also need some of these environment variables. +If you intend to frequently run the Gimp you have built, you may want to set some of these environment variables in your profile (a shell script that sets environment variables when you login.) +In particular, you may want to set PATH and LD_LIBRARY_PATH, which affect runtime. + + + +'''For Debian or derivatives (Ubuntu, Mint…) only:''' + +Additionally to the previous commands (not in replacement), update some variables this way if you use a Debian derivative: + +
     arch="$(dpkg-architecture -qDEB_HOST_MULTIARCH 2> /dev/null)"
    + export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/${arch}/pkgconfig:$PKG_CONFIG_PATH"
    + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/${arch}:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    +
    + +Note: The "${var:+:$var}" syntax prevents a trailing ":" character in the variable, that may lead to issues (especially for LD_LIBRARY_PATH). + + +==Download the source code== + +===Download with git=== + +This is preferred when working on the source code and developing Gimp. + +
    git clone [https://gitlab.gnome.org/GNOME/babl.git https://gitlab.gnome.org/GNOME/babl.git]
    +git clone [https://gitlab.gnome.org/GNOME/gegl.git https://gitlab.gnome.org/GNOME/gegl.git]
    +git clone [https://gitlab.gnome.org/GNOME/gimp.git https://gitlab.gnome.org/GNOME/gimp.git]
    +
    + +You can build specific versions by choosing a ''tag'' (a fixed git revision)… + +
    # List available tags
    +git tag
    +# Update the working directory to a specific tag :
    +git checkout GIMP_2_10_12
    +
    + +… or a ''branch'' : + +
    # List available branches
    +git branch -a
    +# Checkout a branch :
    +git checkout 
    +git checkout -b wip/animation
    +
    + + +If your distro does not provide them, you should get the Mypaint libs too : + +
    git clone --branch libmypaint-v1 [https://github.com/mypaint/libmypaint.git https://github.com/mypaint/libmypaint.git]
    +git clone --branch v1.3.x [https://github.com/mypaint/mypaint-brushes.git https://github.com/mypaint/mypaint-brushes.git]
    +
    + +===Download release archives=== + +Gimp also provides release archives. This is preferred when building stable releases. + +
    [https://download.gimp.org/pub/babl https://download.gimp.org/pub/babl]
    +[https://download.gimp.org/pub/gegl https://download.gimp.org/pub/gegl]
    +[https://download.gimp.org/pub/gimp https://download.gimp.org/pub/gimp]
    +
    + +Releases for mypaint can be found on their github page. + + +==Build the source code== + +===Mypaint=== + +For both Libmypaint '''''and Mypaint-brushes''''', use Autotools to install : + +
    cd libmypaint
    +
    +# Generate the configure script. That may be unnecessary with release archives :
    +# If you might want to set special options, you can now run `./configure --help` to see what's available.
    +./autogen.sh
    +
    +# Configure the build (you can call ./configure --help):
    +./configure --prefix=${GIMP_PREFIX}
    +
    +# Build the code :
    +make -j$(nproc) install
    +
    +cd ..
    +
    + +===BABL and GEGL=== + +Babl and Gegl use Meson. The build needs to be out-of-source, but the process is simple. + +You can read the file meson_options.txt to find a list of options. + +You may enable Link-time optimization (meson option b_lto)to have better performance. + +
    cd babl
    +meson _build \
    +    --prefix=${GIMP_PREFIX} \
    +    --buildtype=release \
    +    -Db_lto=true
    +
    +cd _build
    +ninja
    +ninja install
    +
    + +Then repeat for gegl. + + +===Gimp=== + +Finally, you're ready to build Gimp! + +You can choose between Autotools and Meson. + +Meson is much faster than Autotools, but newer so considered "beta" quality. + + +====Autotools build==== + +The steps are similar to that for libmypaint, except that ./autogen.sh runs ./configure for you. + +cd into the directory where you unpacked gegl. + +If you're building source you checked out from git, run: + +
    ./autogen.sh --prefix=${GIMP_PREFIX}
    +
    + +(assuming, as recommended, you have chosen to install outside the usual place, and defined environment variable GIMP_PREFIX) + +This generates a configure script and then runs it. + +If you're building from a tarball, use configure instead of autogen: + +
    ./configure --prefix=${GIMP_PREFIX}
    +
    + +To see options you can configure, run: + +
    ./configure --help
    +
    + +(Generally, its easier to accept the default build configuration, at the expense of a longer build.) + +Then: + +
    make && make install
    +
    + +====Meson build==== + +You can configure the build with options. + +Options for the meson build of Gimp are described in the repository file gimp/meson_options.txt. +In the example below, the line '-Dpython=true' is one such option. + +Meson itself also provides options, such as : + + +* warning_level=[1, 2, 3] : The level of compiler warnings +* b_lto=true|false : Enable link-time optimizations +* b_coverage=true|false : Enable coverage tools. +* b_pgo=off|generate|use : Enable profile guided optimizations +* b_sanitize=none|address|thread|undefined|memory|address,undefined : Use a code sanitizer + + +
    cd gimp
    +meson _build \
    +    --prefix=${GIMP_PREFIX} \
    +    --buildtype=release \
    +    -Dpython=true
    +
    +cd _build
    +ninja
    +ninja install
    +
    + +====Useful build options==== + +You can customize the directory where Gimp stores settings. This prevents any interference with other GIMP installations on the same computer. + + +* Autotools build : --with-gimpdir=GIMP/git-master +* Meson build : -Dgimpdir=GIMP/git-master + +==Problems?== + +Most problems will occur during the configure stage, and with any luck it's just a missing package and the error message will make it clear what package you need. But there are more subtle problems that can occur. If you have a difficult error, look in: + +[[Hacking:Problems_and_solutions]] + + +==Running Your New GIMP== + +You need to keep defined the same environment variables as for the build. You may want to define them in a script that you will source with : + +
    source ~/gimp_definitions.sh
    +
    + +To keep those variables contained only for the execution of Gimp, you may want to use subshells : + +
    (source ~/gimp_definitions.sh ; $GIMP_PREFIX/bin/gimp-2.10)
    +
    + + +See the OS-specific pages for more specific advice: + + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + + + + +==Build the web Gimp documentation== + +You can also build the documentation website ([https://www.gimp.org/docs https://www.gimp.org/docs]). + +It uses docbook that requires some softwares, such as: + +
    gettext
    +automake
    +docbook2odf
    +pngcrush
    +pngnq
    +docbook-xsl 
    +docbook-utils
    +dblatex
    +
    + + +Now, to build the documentation: + +
    git clone --depth=0 git@gitlab.gnome.org:GNOME/gimp-help.git
    +cd gimp-help
    +# Set this variable to your own language. It should correspond to a directory in the "po" source folder.
    +export LINGUAS=en
    +./autogen.sh [--without-gimp ALL_LINGUAS="en"]
    +make
    +make pdf-local
    +
    diff --git a/wiki/Hacking:Building-20210119124306-edit.txt b/wiki/Hacking:Building-20210119124306-edit.txt new file mode 100644 index 0000000..7db2255 --- /dev/null +++ b/wiki/Hacking:Building-20210119124306-edit.txt @@ -0,0 +1,285 @@ +This page describes how to build GIMP. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in a GIMP repository). +That text file also describes how to build GIMP. + + +__TOC__ + +== Prerequisites == +You should know how to use: +* a terminal and the command line. +* shell environment variables. + + +== GIMP's dependencies == +Gimp depends on quite a few libraries, including but not limited to: +* [[Wikipedia:GLib|GLib]] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [[Wikipedia:GObject|GObject]] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [[Wikipedia:GTK+|GTK+]] – a graphical toolkit for building cross-platform user interfaces. GIMP 2.99 and later need GTK 3.0. +* [[Wikipedia:Cairo_(graphics)|Cairo]] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [[Wikipedia:Pango|Pango]] – a library for laying out and rendering text, used also in Gtk+. +* [[Wikipedia:MyPaint|MyPaint]] - a painting library that allows a lot of flexibility for brushes; it needs both libmypaint (the libmypaint-v1 branch) and mypaint-brushes (the v1.3.x branch). + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: +* [[Wikipedia:GEGL#babl|babl]] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. +* [[Wikipedia:GEGL|GEGL]] – a graph based image processing library, heavily used in GIMP’s core. + +Some of GIMP's plugins depend on (at least) the following libraries +* [[Wikipedia:librsvg|librsvg]] – a library for rendering [[Wikipedia:Scalable_Vector_Graphics|SVG]] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [[Wikipedia:Portable_Network_Graphics|PNG]] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [[Wikipedia:Windows Metafile|WMF]] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [[Wikipedia:Tagged_Image_File_Format|TIFF]] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [[Wikipedia:JPEG|JPEG]] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. +This list is incomplete. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in GIMP master). + +== Build system == + +== Preparing for Building == + +You may need to install some software to build GIMP, including a C compiler, make, GNU autotools, meson, and more, plus many dependencies. See the OS-specific pages for details: +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + +1. Choose a place to install everything, and set a variable to point to it: + +If you're building Gimp from master, you may not want to install it in your system prefix, as you may break your system Gimp installation, or get odd behavior, especially if you also have a system version of GIMP installed. + +You should then create another prefix directory where Gimp (and some dependencies) may be installed safely. On Linux you could use $HOME/.local. Let's name your custom prefix : + + GIMP_PREFIX=${HOME}/gimp_prefix + +3. Set some environment variables: + +Some dependencies may be installed in this prefix too, so the build system should be able to find them : + + # Used to find programs/tools during build + export PATH="${GIMP_PREFIX}/bin:$PATH" + + # Used to detect the build dependencies + export PKG_CONFIG_PATH="${GIMP_PREFIX}/share/pkgconfig:${GIMP_PREFIX}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + + # Used to find the glib-introspection dependencies + export XDG_DATA_DIRS="${XDG_DATA_DIRS:+$XDG_DATA_DIRS:}${GIMP_PREFIX}/share:/usr/local/share:/usr/share" + + # Used to find the libraries at runtime + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + + # Used by Autotools to find its tools + export ACLOCAL_FLAGS="-I $INSTALL_PREFIX/share/aclocal $ACLOCAL_FLAGS" + +Later, to run the Gimp you have installed outside the usual places, you also need some of these environment variables. +If you intend to frequently run the Gimp you have built, you may want to set some of these environment variables in your profile (a shell script that sets environment variables when you login.) +In particular, you may want to set PATH and LD_LIBRARY_PATH, which affect runtime. + + +'''For Debian or derivatives (Ubuntu, Mint…) only:''' + +Additionally to the previous commands (not in replacement), update some variables this way if you use a Debian derivative: + arch="$(dpkg-architecture -qDEB_HOST_MULTIARCH 2> /dev/null)" + export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/${arch}/pkgconfig:$PKG_CONFIG_PATH" + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/${arch}:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + +Note: The "${var:+:$var}" syntax prevents a trailing ":" character in the variable, that may lead to issues (especially for LD_LIBRARY_PATH). + +== Download the source code == + +=== Download with git === + +This is preferred when working on the source code and developing Gimp. + + git clone https://gitlab.gnome.org/GNOME/babl.git + git clone https://gitlab.gnome.org/GNOME/gegl.git + git clone https://gitlab.gnome.org/GNOME/gimp.git + +You can build specific versions by choosing a ''tag'' (a fixed git revision)… + # List available tags + git tag + # Update the working directory to a specific tag : + git checkout GIMP_2_10_12 + +… or a ''branch'' : + # List available branches + git branch -a + # Checkout a branch : + git checkout + git checkout -b wip/animation + + +If your distro does not provide them, you should get the Mypaint libs too : + + git clone --branch libmypaint-v1 https://github.com/mypaint/libmypaint.git + git clone --branch v1.3.x https://github.com/mypaint/mypaint-brushes.git + +=== Download release archives === + +Gimp also provides release archives. This is preferred when building stable releases. + + https://download.gimp.org/pub/babl + https://download.gimp.org/pub/gegl + https://download.gimp.org/pub/gimp + +Releases for mypaint can be found on their github page. + +== Build the source code == + +=== Mypaint === + +For both Libmypaint '''''and Mypaint-brushes''''', use Autotools to install : + + cd libmypaint + + # Generate the configure script. That may be unnecessary with release archives : + # If you might want to set special options, you can now run `./configure --help` to see what's available. + ./autogen.sh + + # Configure the build (you can call ./configure --help): + ./configure --prefix=${GIMP_PREFIX} + + # Build the code : + make -j$(nproc) install + + cd .. + +=== BABL and GEGL === + +Babl and Gegl use Meson. The build needs to be out-of-source, but the process is simple. + +You can read the file meson_options.txt to find a list of options. + +You may enable Link-time optimization (meson option b_lto)to have better performance. + + cd babl + meson _build \ + --prefix=${GIMP_PREFIX} \ + --buildtype=release \ + -Db_lto=true + + cd _build + ninja + ninja install + +Then repeat for gegl. + +=== Gimp === + +Finally, you're ready to build Gimp! + +You can choose between Autotools and Meson. + +Meson is much faster than Autotools, but newer so considered "beta" quality. + +==== Autotools build ==== + +The steps are similar to that for libmypaint, except that ./autogen.sh runs ./configure for you. + +cd into the directory where you unpacked gegl. + +If you're building source you checked out from git, run: + + ./autogen.sh --prefix=${GIMP_PREFIX} + +(assuming, as recommended, you have chosen to install outside the usual place, and defined environment variable GIMP_PREFIX) + +This generates a configure script and then runs it. + +If you're building from a tarball, use configure instead of autogen: + + ./configure --prefix=${GIMP_PREFIX} + +To see options you can configure, run: + + ./configure --help + +(Generally, its easier to accept the default build configuration, at the expense of a longer build.) + +Then: + + make && make install + +==== Meson build ==== + +You can configure the build with options. + +Options for the meson build of Gimp are described in the repository file gimp/meson_options.txt. +In the example below, the line '-Dpython=true' is one such option. + +Meson itself also provides options, such as : + +* warning_level=[1, 2, 3] : The level of compiler warnings +* b_lto=true|false : Enable link-time optimizations +* b_coverage=true|false : Enable coverage tools. +* b_pgo=off|generate|use : Enable profile guided optimizations +* b_sanitize=none|address|thread|undefined|memory|address,undefined : Use a code sanitizer + + + cd gimp + meson _build \ + --prefix=${GIMP_PREFIX} \ + --buildtype=release \ + -Dpython=true + + cd _build + ninja + ninja install + +==== Useful build options ==== + +You can customize the directory where Gimp stores settings. This prevents any interference with other GIMP installations on the same computer. + +* Autotools build : --with-gimpdir=GIMP/git-master +* Meson build : -Dgimpdir=GIMP/git-master + +== Problems? == + +Most problems will occur during the configure stage, and with any luck it's just a missing package and the error message will make it clear what package you need. But there are more subtle problems that can occur. If you have a difficult error, look in: + +[[Hacking:Problems_and_solutions]] + +== Running Your New GIMP == + +You need to keep defined the same environment variables as for the build. You may want to define them in a script that you will source with : + + source ~/gimp_definitions.sh + +To keep those variables contained only for the execution of Gimp, you may want to use subshells : + + (source ~/gimp_definitions.sh ; $GIMP_PREFIX/bin/gimp-2.10) + + +See the OS-specific pages for more specific advice: + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + + +== Build the web Gimp documentation == +You can also build the documentation website (https://www.gimp.org/docs). + +It uses docbook that requires some softwares, such as: + gettext + automake + docbook2odf + pngcrush + pngnq + docbook-xsl + docbook-utils + dblatex + + +Now, to build the documentation: + + git clone --depth=0 git@gitlab.gnome.org:GNOME/gimp-help.git + cd gimp-help + # Set this variable to your own language. It should correspond to a directory in the "po" source folder. + export LINGUAS=en + ./autogen.sh [--without-gimp ALL_LINGUAS="en"] + make + make pdf-local diff --git a/wiki/Hacking:Building-20210420220910-show.txt b/wiki/Hacking:Building-20210420220910-show.txt new file mode 100644 index 0000000..54eef72 --- /dev/null +++ b/wiki/Hacking:Building-20210420220910-show.txt @@ -0,0 +1,339 @@ + + +This page describes how to build GIMP. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in a GIMP repository). +That text file also describes how to build GIMP. + + + + + +__TOC__ + +==Prerequisites== + +You should know how to use: + + +* a terminal and the command line. +* shell environment variables. + + + + +==GIMP's dependencies== + +Gimp depends on quite a few libraries, including but not limited to: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. GIMP 2.99 and later need GTK 3.0. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. +* [http://en.wikipedia.org/wiki/MyPaint MyPaint] - a painting library that allows a lot of flexibility for brushes; it needs both libmypaint (the libmypaint-v1 branch) and mypaint-brushes (the v1.3.x branch). + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + +This list is incomplete. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in GIMP master). + + +==Build system== + +==Preparing for Building== + +You may need to install some software to build GIMP, including a C compiler, make, GNU autotools, meson, and more, plus many dependencies. See the OS-specific pages for details: + + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows +'''1. Choose a place to install everything, and set a variable to point to it:''' + +If you're building Gimp from master, you may not want to install it in your system prefix, as you may break your system Gimp installation, or get odd behavior, especially if you also have a system version of GIMP installed. + +You should then create another prefix directory where Gimp (and some dependencies) may be installed safely. On Linux you could use $HOME/.local. Let's name your custom prefix : + +
    GIMP_PREFIX=${HOME}/gimp_prefix
    +
    +'''3. Set some environment variables:''' + +Some dependencies may be installed in this prefix too, so the build system should be able to find them : + +
    # Used to find programs/tools during build
    +export PATH="${GIMP_PREFIX}/bin:$PATH"
    +
    +# Used to detect the build dependencies
    +export PKG_CONFIG_PATH="${GIMP_PREFIX}/share/pkgconfig:${GIMP_PREFIX}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
    +
    +# Used to find the glib-introspection dependencies
    +export XDG_DATA_DIRS="${XDG_DATA_DIRS:+$XDG_DATA_DIRS:}${GIMP_PREFIX}/share:/usr/local/share:/usr/share"
    +
    +# Used to find the libraries at runtime
    +export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    +
    +# Used by Autotools to find its tools
    +export ACLOCAL_FLAGS="-I $INSTALL_PREFIX/share/aclocal $ACLOCAL_FLAGS"
    +
    + +Later, to run the Gimp you have installed outside the usual places, you also need some of these environment variables. +If you intend to frequently run the Gimp you have built, you may want to set some of these environment variables in your profile (a shell script that sets environment variables when you login.) +In particular, you may want to set PATH and LD_LIBRARY_PATH, which affect runtime. + + + +'''For Debian or derivatives (Ubuntu, Mint…) only:''' + +Additionally to the previous commands (not in replacement), update some variables this way if you use a Debian derivative: + +
     arch="$(dpkg-architecture -qDEB_HOST_MULTIARCH 2> /dev/null)"
    + export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/${arch}/pkgconfig:$PKG_CONFIG_PATH"
    + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/${arch}:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    +
    + +Note: The "${var:+:$var}" syntax prevents a trailing ":" character in the variable, that may lead to issues (especially for LD_LIBRARY_PATH). + + +==Download the source code== + +===Download with git=== + +This is preferred when working on the source code and developing Gimp. + +
    git clone [https://gitlab.gnome.org/GNOME/babl.git https://gitlab.gnome.org/GNOME/babl.git]
    +git clone [https://gitlab.gnome.org/GNOME/gegl.git https://gitlab.gnome.org/GNOME/gegl.git]
    +git clone [https://gitlab.gnome.org/GNOME/gimp.git https://gitlab.gnome.org/GNOME/gimp.git]
    +
    + +You can build specific versions by choosing a ''tag'' (a fixed git revision)… + +
    # List available tags
    +git tag
    +# Update the working directory to a specific tag :
    +git checkout GIMP_2_10_12
    +
    + +… or a ''branch'' : + +
    # List available branches
    +git branch -a
    +# Checkout a branch :
    +git checkout 
    +git checkout -b wip/animation
    +
    + + +If your distro does not provide them, you should get the Mypaint libs too : + +
    git clone --branch libmypaint-v1 [https://github.com/mypaint/libmypaint.git https://github.com/mypaint/libmypaint.git]
    +git clone --branch v1.3.x [https://github.com/mypaint/mypaint-brushes.git https://github.com/mypaint/mypaint-brushes.git]
    +
    + +===Download release archives=== + +Gimp also provides release archives. This is preferred when building stable releases. + +
    [https://download.gimp.org/pub/babl https://download.gimp.org/pub/babl]
    +[https://download.gimp.org/pub/gegl https://download.gimp.org/pub/gegl]
    +[https://download.gimp.org/pub/gimp https://download.gimp.org/pub/gimp]
    +
    + +Releases for mypaint can be found on their github page. + + +==Build the source code== + +===Mypaint=== + +For both Libmypaint '''''and Mypaint-brushes''''', use Autotools to install : + +
    cd libmypaint
    +
    +# Generate the configure script. That may be unnecessary with release archives :
    +# If you might want to set special options, you can now run `./configure --help` to see what's available.
    +./autogen.sh
    +
    +# Configure the build (you can call ./configure --help):
    +./configure --prefix=${GIMP_PREFIX}
    +
    +# Build the code :
    +make -j$(nproc) install
    +
    +cd ..
    +
    + +===BABL and GEGL=== + +Babl and Gegl use Meson. The build needs to be out-of-source, but the process is simple. + +You can read the file meson_options.txt to find a list of options. + +You may enable Link-time optimization (meson option b_lto)to have better performance. + +
    cd babl
    +meson _build \
    +    --prefix=${GIMP_PREFIX} \
    +    --buildtype=release \
    +    -Db_lto=true
    +
    +cd _build
    +ninja
    +ninja install
    +
    + +Then repeat for gegl. + + +===Gimp=== + +Finally, you're ready to build Gimp! + +You can choose between Autotools and Meson. + +Meson is much faster than Autotools, but newer so considered "beta" quality. + + +====Autotools build==== + +The steps are similar to that for libmypaint, except that ./autogen.sh runs ./configure for you. + +cd into the directory where you unpacked gegl. + +If you're building source you checked out from git, run: + +
    ./autogen.sh --prefix=${GIMP_PREFIX}
    +
    + +(assuming, as recommended, you have chosen to install outside the usual place, and defined environment variable GIMP_PREFIX) + +This generates a configure script and then runs it. + +If you're building from a tarball, use configure instead of autogen: + +
    ./configure --prefix=${GIMP_PREFIX}
    +
    + +To see options you can configure, run: + +
    ./configure --help
    +
    + +(Generally, its easier to accept the default build configuration, at the expense of a longer build.) + +Then: + +
    make && make install
    +
    + +====Meson build==== + +You can configure the build with options. + +Options for the meson build of Gimp are described in the repository file gimp/meson_options.txt. +In the example below, the line '-Dpython=true' is one such option. + +Meson itself also provides options, such as : + + +* warning_level=[1, 2, 3] : The level of compiler warnings +* b_lto=true|false : Enable link-time optimizations +* b_coverage=true|false : Enable coverage tools. +* b_pgo=off|generate|use : Enable profile guided optimizations +* b_sanitize=none|address|thread|undefined|memory|address,undefined : Use a code sanitizer + + +
    cd gimp
    +meson _build \
    +    --prefix=${GIMP_PREFIX} \
    +    --buildtype=release \
    +    -Dpython=true
    +
    +cd _build
    +ninja
    +ninja install
    +
    + +====Useful build options==== + +You can customize the directory where Gimp stores settings. This prevents any interference with other GIMP installations on the same computer. + + +* Autotools build : --with-gimpdir=GIMP/git-master +* Meson build : -Dgimpdir=GIMP/git-master + +==Problems?== + +Most problems will occur during the configure stage, and with any luck it's just a missing package and the error message will make it clear what package you need. But there are more subtle problems that can occur. If you have a difficult error, look in: + +[[Hacking:Problems_and_solutions]] + + +==Running Your New GIMP== + +You need to keep defined the same environment variables as for the build. You may want to define them in a script that you will source with : + +
    source ~/gimp_definitions.sh
    +
    + +To keep those variables contained only for the execution of Gimp, you may want to use subshells : + +
    (source ~/gimp_definitions.sh ; $GIMP_PREFIX/bin/gimp-2.10)
    +
    + + +See the OS-specific pages for more specific advice: + + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + + + + +==Build the web Gimp documentation== + +You can also build the documentation website ([https://www.gimp.org/docs https://www.gimp.org/docs]). + +It uses docbook that requires some softwares, such as: + +
    gettext
    +automake
    +docbook2odf
    +pngcrush
    +pngnq
    +docbook-xsl 
    +docbook-utils
    +dblatex
    +
    + + +Now, to build the documentation: + +
    git clone --depth=0 git@gitlab.gnome.org:GNOME/gimp-help.git
    +cd gimp-help
    +# Set this variable to your own language. It should correspond to a directory in the "po" source folder.
    +export LINGUAS=en
    +./autogen.sh [--without-gimp ALL_LINGUAS="en"]
    +make
    +make pdf-local
    +
    diff --git a/wiki/Hacking:Building-20210506133726-show.txt b/wiki/Hacking:Building-20210506133726-show.txt new file mode 100644 index 0000000..54eef72 --- /dev/null +++ b/wiki/Hacking:Building-20210506133726-show.txt @@ -0,0 +1,339 @@ + + +This page describes how to build GIMP. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in a GIMP repository). +That text file also describes how to build GIMP. + + + + + +__TOC__ + +==Prerequisites== + +You should know how to use: + + +* a terminal and the command line. +* shell environment variables. + + + + +==GIMP's dependencies== + +Gimp depends on quite a few libraries, including but not limited to: + + +* [http://en.wikipedia.org/wiki/GLib GLib] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [http://en.wikipedia.org/wiki/GObject GObject] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [http://en.wikipedia.org/wiki/GTK%2B GTK+] – a graphical toolkit for building cross-platform user interfaces. GIMP 2.99 and later need GTK 3.0. +* [http://en.wikipedia.org/wiki/Cairo_(graphics) Cairo] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [http://en.wikipedia.org/wiki/Pango Pango] – a library for laying out and rendering text, used also in Gtk+. +* [http://en.wikipedia.org/wiki/MyPaint MyPaint] - a painting library that allows a lot of flexibility for brushes; it needs both libmypaint (the libmypaint-v1 branch) and mypaint-brushes (the v1.3.x branch). + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: + + +* [http://en.wikipedia.org/wiki/GEGL#babl babl] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. +* [http://en.wikipedia.org/wiki/GEGL GEGL] – a graph based image processing library, heavily used in GIMP’s core. + +Some of GIMP's plugins depend on (at least) the following libraries + + +* [http://en.wikipedia.org/wiki/librsvg librsvg] – a library for rendering [http://en.wikipedia.org/wiki/Scalable_Vector_Graphics SVG] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [http://en.wikipedia.org/wiki/Portable_Network_Graphics PNG] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [http://en.wikipedia.org/wiki/Windows_Metafile WMF] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [http://en.wikipedia.org/wiki/Tagged_Image_File_Format TIFF] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [http://en.wikipedia.org/wiki/JPEG JPEG] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. + +This list is incomplete. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in GIMP master). + + +==Build system== + +==Preparing for Building== + +You may need to install some software to build GIMP, including a C compiler, make, GNU autotools, meson, and more, plus many dependencies. See the OS-specific pages for details: + + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows +'''1. Choose a place to install everything, and set a variable to point to it:''' + +If you're building Gimp from master, you may not want to install it in your system prefix, as you may break your system Gimp installation, or get odd behavior, especially if you also have a system version of GIMP installed. + +You should then create another prefix directory where Gimp (and some dependencies) may be installed safely. On Linux you could use $HOME/.local. Let's name your custom prefix : + +
    GIMP_PREFIX=${HOME}/gimp_prefix
    +
    +'''3. Set some environment variables:''' + +Some dependencies may be installed in this prefix too, so the build system should be able to find them : + +
    # Used to find programs/tools during build
    +export PATH="${GIMP_PREFIX}/bin:$PATH"
    +
    +# Used to detect the build dependencies
    +export PKG_CONFIG_PATH="${GIMP_PREFIX}/share/pkgconfig:${GIMP_PREFIX}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
    +
    +# Used to find the glib-introspection dependencies
    +export XDG_DATA_DIRS="${XDG_DATA_DIRS:+$XDG_DATA_DIRS:}${GIMP_PREFIX}/share:/usr/local/share:/usr/share"
    +
    +# Used to find the libraries at runtime
    +export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    +
    +# Used by Autotools to find its tools
    +export ACLOCAL_FLAGS="-I $INSTALL_PREFIX/share/aclocal $ACLOCAL_FLAGS"
    +
    + +Later, to run the Gimp you have installed outside the usual places, you also need some of these environment variables. +If you intend to frequently run the Gimp you have built, you may want to set some of these environment variables in your profile (a shell script that sets environment variables when you login.) +In particular, you may want to set PATH and LD_LIBRARY_PATH, which affect runtime. + + + +'''For Debian or derivatives (Ubuntu, Mint…) only:''' + +Additionally to the previous commands (not in replacement), update some variables this way if you use a Debian derivative: + +
     arch="$(dpkg-architecture -qDEB_HOST_MULTIARCH 2> /dev/null)"
    + export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/${arch}/pkgconfig:$PKG_CONFIG_PATH"
    + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/${arch}:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    +
    + +Note: The "${var:+:$var}" syntax prevents a trailing ":" character in the variable, that may lead to issues (especially for LD_LIBRARY_PATH). + + +==Download the source code== + +===Download with git=== + +This is preferred when working on the source code and developing Gimp. + +
    git clone [https://gitlab.gnome.org/GNOME/babl.git https://gitlab.gnome.org/GNOME/babl.git]
    +git clone [https://gitlab.gnome.org/GNOME/gegl.git https://gitlab.gnome.org/GNOME/gegl.git]
    +git clone [https://gitlab.gnome.org/GNOME/gimp.git https://gitlab.gnome.org/GNOME/gimp.git]
    +
    + +You can build specific versions by choosing a ''tag'' (a fixed git revision)… + +
    # List available tags
    +git tag
    +# Update the working directory to a specific tag :
    +git checkout GIMP_2_10_12
    +
    + +… or a ''branch'' : + +
    # List available branches
    +git branch -a
    +# Checkout a branch :
    +git checkout 
    +git checkout -b wip/animation
    +
    + + +If your distro does not provide them, you should get the Mypaint libs too : + +
    git clone --branch libmypaint-v1 [https://github.com/mypaint/libmypaint.git https://github.com/mypaint/libmypaint.git]
    +git clone --branch v1.3.x [https://github.com/mypaint/mypaint-brushes.git https://github.com/mypaint/mypaint-brushes.git]
    +
    + +===Download release archives=== + +Gimp also provides release archives. This is preferred when building stable releases. + +
    [https://download.gimp.org/pub/babl https://download.gimp.org/pub/babl]
    +[https://download.gimp.org/pub/gegl https://download.gimp.org/pub/gegl]
    +[https://download.gimp.org/pub/gimp https://download.gimp.org/pub/gimp]
    +
    + +Releases for mypaint can be found on their github page. + + +==Build the source code== + +===Mypaint=== + +For both Libmypaint '''''and Mypaint-brushes''''', use Autotools to install : + +
    cd libmypaint
    +
    +# Generate the configure script. That may be unnecessary with release archives :
    +# If you might want to set special options, you can now run `./configure --help` to see what's available.
    +./autogen.sh
    +
    +# Configure the build (you can call ./configure --help):
    +./configure --prefix=${GIMP_PREFIX}
    +
    +# Build the code :
    +make -j$(nproc) install
    +
    +cd ..
    +
    + +===BABL and GEGL=== + +Babl and Gegl use Meson. The build needs to be out-of-source, but the process is simple. + +You can read the file meson_options.txt to find a list of options. + +You may enable Link-time optimization (meson option b_lto)to have better performance. + +
    cd babl
    +meson _build \
    +    --prefix=${GIMP_PREFIX} \
    +    --buildtype=release \
    +    -Db_lto=true
    +
    +cd _build
    +ninja
    +ninja install
    +
    + +Then repeat for gegl. + + +===Gimp=== + +Finally, you're ready to build Gimp! + +You can choose between Autotools and Meson. + +Meson is much faster than Autotools, but newer so considered "beta" quality. + + +====Autotools build==== + +The steps are similar to that for libmypaint, except that ./autogen.sh runs ./configure for you. + +cd into the directory where you unpacked gegl. + +If you're building source you checked out from git, run: + +
    ./autogen.sh --prefix=${GIMP_PREFIX}
    +
    + +(assuming, as recommended, you have chosen to install outside the usual place, and defined environment variable GIMP_PREFIX) + +This generates a configure script and then runs it. + +If you're building from a tarball, use configure instead of autogen: + +
    ./configure --prefix=${GIMP_PREFIX}
    +
    + +To see options you can configure, run: + +
    ./configure --help
    +
    + +(Generally, its easier to accept the default build configuration, at the expense of a longer build.) + +Then: + +
    make && make install
    +
    + +====Meson build==== + +You can configure the build with options. + +Options for the meson build of Gimp are described in the repository file gimp/meson_options.txt. +In the example below, the line '-Dpython=true' is one such option. + +Meson itself also provides options, such as : + + +* warning_level=[1, 2, 3] : The level of compiler warnings +* b_lto=true|false : Enable link-time optimizations +* b_coverage=true|false : Enable coverage tools. +* b_pgo=off|generate|use : Enable profile guided optimizations +* b_sanitize=none|address|thread|undefined|memory|address,undefined : Use a code sanitizer + + +
    cd gimp
    +meson _build \
    +    --prefix=${GIMP_PREFIX} \
    +    --buildtype=release \
    +    -Dpython=true
    +
    +cd _build
    +ninja
    +ninja install
    +
    + +====Useful build options==== + +You can customize the directory where Gimp stores settings. This prevents any interference with other GIMP installations on the same computer. + + +* Autotools build : --with-gimpdir=GIMP/git-master +* Meson build : -Dgimpdir=GIMP/git-master + +==Problems?== + +Most problems will occur during the configure stage, and with any luck it's just a missing package and the error message will make it clear what package you need. But there are more subtle problems that can occur. If you have a difficult error, look in: + +[[Hacking:Problems_and_solutions]] + + +==Running Your New GIMP== + +You need to keep defined the same environment variables as for the build. You may want to define them in a script that you will source with : + +
    source ~/gimp_definitions.sh
    +
    + +To keep those variables contained only for the execution of Gimp, you may want to use subshells : + +
    (source ~/gimp_definitions.sh ; $GIMP_PREFIX/bin/gimp-2.10)
    +
    + + +See the OS-specific pages for more specific advice: + + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + + + + +==Build the web Gimp documentation== + +You can also build the documentation website ([https://www.gimp.org/docs https://www.gimp.org/docs]). + +It uses docbook that requires some softwares, such as: + +
    gettext
    +automake
    +docbook2odf
    +pngcrush
    +pngnq
    +docbook-xsl 
    +docbook-utils
    +dblatex
    +
    + + +Now, to build the documentation: + +
    git clone --depth=0 git@gitlab.gnome.org:GNOME/gimp-help.git
    +cd gimp-help
    +# Set this variable to your own language. It should correspond to a directory in the "po" source folder.
    +export LINGUAS=en
    +./autogen.sh [--without-gimp ALL_LINGUAS="en"]
    +make
    +make pdf-local
    +
    diff --git a/wiki/Hacking:Building-20210620190210-edit.txt b/wiki/Hacking:Building-20210620190210-edit.txt new file mode 100644 index 0000000..dcaa394 --- /dev/null +++ b/wiki/Hacking:Building-20210620190210-edit.txt @@ -0,0 +1,287 @@ +This page describes how to build GIMP. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or INSTALL.in in a GIMP repository). +That text file also describes how to build GIMP. + + +__TOC__ + +== Prerequisites == +You should know how to use: +* a terminal and the command line. +* shell environment variables. + + +== GIMP's dependencies == +Gimp depends on quite a few libraries, including but not limited to: +* [[Wikipedia:GLib|GLib]] – a library used by many gnome applications, containing utilities and common data structures for programs written in C. +* [[Wikipedia:GObject|GObject]] - a library for implemnting objects (as in Object-Oriented-Programming) in C. +* [[Wikipedia:GTK+|GTK+]] – a graphical toolkit for building cross-platform user interfaces. GIMP 2.99 and later need GTK 3.0. +* [[Wikipedia:Cairo_(graphics)|Cairo]] – a 2D graphics library, used for drawing some of GIMP’s widget and also used by Gtk+. +* Python-Cairo: Python bindings for Cairo +* [[Wikipedia:Pango|Pango]] – a library for laying out and rendering text, used also in Gtk+. +* [[Wikipedia:MyPaint|MyPaint]] - a painting library that allows a lot of flexibility for brushes; it needs both libmypaint (the libmypaint-v1 branch) and mypaint-brushes (the v1.3.x branch). + +GIMP's core depends also on two libraries which are mainly (but not only) intended to be used with GIMP: +* [[Wikipedia:GEGL#babl|babl]] – a library for converting between pixel formats, heavily used by GIMP when communicating with GEGL. +* [[Wikipedia:GEGL|GEGL]] – a graph based image processing library, heavily used in GIMP’s core. + +Some of GIMP's plugins depend on (at least) the following libraries +* [[Wikipedia:librsvg|librsvg]] – a library for rendering [[Wikipedia:Scalable_Vector_Graphics|SVG]] files. +* [http://www.libpng.org/pub/png/libpng.html libpng] – a library for reading and writing [[Wikipedia:Portable_Network_Graphics|PNG]] image files. Used by Gtk+, GIMP and GEGL. +* [http://libexif.sourceforge.net/ libexif] - a library for manipulating exif data (image metadata). +* [http://wvware.sourceforge.net/libwmf.html libwmf] - a library for working with [[Wikipedia:Windows Metafile|WMF]] files. +* [http://www.libtiff.org/ libtiff] - a library for reading and writing [[Wikipedia:Tagged_Image_File_Format|TIFF]] image files. +* [http://libjpeg.sourceforge.net/ libjpeg] - a library for reading and writing [[Wikipedia:JPEG|JPEG]] image files. +* [http://www.littlecms.com/ liblcms] - the Little Color Management System, a library for working with color profiles. +This list is incomplete. + +See also the file [https://gitlab.gnome.org/GNOME/gimp/blob/gimp-2-10/INSTALL.in INSTALL] (or equivalent [https://gitlab.gnome.org/GNOME/gimp/-/blob/master/INSTALL.in INSTALL] in GIMP master for the development version). + +== Build system == + +== Preparing for Building == + +You may need to install some software to build GIMP, including a C compiler, make, GNU autotools, meson, and more, plus many dependencies. See the OS-specific pages for details: +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + +1. Choose a place to install everything, and set a variable to point to it: + +If you're building Gimp from master, you may not want to install it in your system prefix, as you may break your system Gimp installation, or get odd behavior, especially if you also have a system version of GIMP installed. + +You should then create another prefix directory where Gimp (and some dependencies) may be installed safely. On Linux you could use $HOME/.local. Let's name your custom prefix : + + GIMP_PREFIX=${HOME}/gimp_prefix + +3. Set some environment variables: + +Some dependencies may be installed in this prefix too, so the build system should be able to find them : + + # Used to find programs/tools during build + export PATH="${GIMP_PREFIX}/bin:$PATH" + + # Used to detect the build dependencies + export PKG_CONFIG_PATH="${GIMP_PREFIX}/share/pkgconfig:${GIMP_PREFIX}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + # Assuming a 64-bit build. Remove otherwise. + export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib64/pkgconfig:$PKG_CONFIG_PATH" + + # Used to find the glib-introspection dependencies + export XDG_DATA_DIRS="${XDG_DATA_DIRS:+$XDG_DATA_DIRS:}${GIMP_PREFIX}/share:/usr/local/share:/usr/share" + + # Used to find the libraries at runtime + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + + # Used by Autotools to find its tools + export ACLOCAL_FLAGS="-I $INSTALL_PREFIX/share/aclocal $ACLOCAL_FLAGS" + +Later, to run the Gimp you have installed outside the usual places, you also need some of these environment variables. +If you intend to frequently run the Gimp you have built, you may want to set some of these environment variables in your profile (a shell script that sets environment variables when you login.) +In particular, you may want to set PATH and LD_LIBRARY_PATH, which affect runtime. + + +'''For Debian or derivatives (Ubuntu, Mint…) only:''' + +Additionally to the previous commands (not in replacement), update some variables this way if you use a Debian derivative: + arch="$(dpkg-architecture -qDEB_HOST_MULTIARCH 2> /dev/null)" + export PKG_CONFIG_PATH="${GIMP_PREFIX}/lib/${arch}/pkgconfig:$PKG_CONFIG_PATH" + export LD_LIBRARY_PATH="${GIMP_PREFIX}/lib/${arch}:${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + +Note: The "${var:+:$var}" syntax prevents a trailing ":" character in the variable, that may lead to issues (especially for LD_LIBRARY_PATH). + +== Download the source code == + +=== Download with git === + +This is preferred when working on the source code and developing Gimp. + + git clone https://gitlab.gnome.org/GNOME/babl.git + git clone https://gitlab.gnome.org/GNOME/gegl.git + git clone https://gitlab.gnome.org/GNOME/gimp.git + +You can build specific versions by choosing a ''tag'' (a fixed git revision)… + # List available tags + git tag + # Update the working directory to a specific tag : + git checkout GIMP_2_10_12 + +… or a ''branch'' : + # List available branches + git branch -a + # Checkout a branch : + git checkout + git checkout -b wip/animation + + +If your distro does not provide them, you should get the Mypaint libs too : + + git clone --branch libmypaint-v1 https://github.com/mypaint/libmypaint.git + git clone --branch v1.3.x https://github.com/mypaint/mypaint-brushes.git + +=== Download release archives === + +Gimp also provides release archives. This is preferred when building stable releases. + + https://download.gimp.org/pub/babl + https://download.gimp.org/pub/gegl + https://download.gimp.org/pub/gimp + +Releases for mypaint can be found on their github page. + +== Build the source code == + +=== Mypaint === + +For both Libmypaint '''''and Mypaint-brushes''''', use Autotools to install : + + cd libmypaint + + # Generate the configure script. That may be unnecessary with release archives : + # If you might want to set special options, you can now run `./configure --help` to see what's available. + ./autogen.sh + + # Configure the build (you can call ./configure --help): + ./configure --prefix=${GIMP_PREFIX} + + # Build the code : + make -j$(nproc) install + + cd .. + +=== BABL and GEGL === + +Babl and Gegl use Meson. The build needs to be out-of-source, but the process is simple. + +You can read the file meson_options.txt to find a list of options. + +You may enable Link-time optimization (meson option b_lto)to have better performance. + + cd babl + meson _build \ + --prefix=${GIMP_PREFIX} \ + --buildtype=release \ + -Db_lto=true + + cd _build + ninja + ninja install + +Then repeat for gegl. + +=== Gimp === + +Finally, you're ready to build Gimp! + +You can choose between Autotools and Meson. + +Meson is much faster than Autotools, but newer so considered "beta" quality. + +==== Autotools build ==== + +The steps are similar to that for libmypaint, except that ./autogen.sh runs ./configure for you. + +cd into the directory where you unpacked gegl. + +If you're building source you checked out from git, run: + + ./autogen.sh --prefix=${GIMP_PREFIX} + +(assuming, as recommended, you have chosen to install outside the usual place, and defined environment variable GIMP_PREFIX) + +This generates a configure script and then runs it. + +If you're building from a tarball, use configure instead of autogen: + + ./configure --prefix=${GIMP_PREFIX} + +To see options you can configure, run: + + ./configure --help + +(Generally, its easier to accept the default build configuration, at the expense of a longer build.) + +Then: + + make && make install + +==== Meson build ==== + +You can configure the build with options. + +Options for the meson build of Gimp are described in the repository file gimp/meson_options.txt. +In the example below, the line '-Dpython=true' is one such option. + +Meson itself also provides options, such as : + +* warning_level=[1, 2, 3] : The level of compiler warnings +* b_lto=true|false : Enable link-time optimizations +* b_coverage=true|false : Enable coverage tools. +* b_pgo=off|generate|use : Enable profile guided optimizations +* b_sanitize=none|address|thread|undefined|memory|address,undefined : Use a code sanitizer + + + cd gimp + meson _build \ + --prefix=${GIMP_PREFIX} \ + --buildtype=release \ + -Dpython=true + + cd _build + ninja + ninja install + +==== Useful build options ==== + +You can customize the directory where Gimp stores settings. This prevents any interference with other GIMP installations on the same computer. + +* Autotools build : --with-gimpdir=GIMP/git-master +* Meson build : -Dgimpdir=GIMP/git-master + +== Problems? == + +Most problems will occur during the configure stage, and with any luck it's just a missing package and the error message will make it clear what package you need. But there are more subtle problems that can occur. If you have a difficult error, look in: + +[[Hacking:Problems_and_solutions]] + +== Running Your New GIMP == + +You need to keep defined the same environment variables as for the build. You may want to define them in a script that you will source with : + + source ~/gimp_definitions.sh + +To keep those variables contained only for the execution of Gimp, you may want to use subshells : + + (source ~/gimp_definitions.sh ; $GIMP_PREFIX/bin/gimp-2.10) + + +See the OS-specific pages for more specific advice: + +* [[Hacking:Building/Linux]] - Building GIMP on Linux +* [[Hacking: Building/Mac OSX]] - Building GIMP on the Mac platform +* [[Hacking:Building/Windows]] - Building GIMP on Windows + + +== Build the web Gimp documentation == +You can also build the documentation website (https://www.gimp.org/docs). + +It uses docbook that requires some softwares, such as: + gettext + automake + docbook2odf + pngcrush + pngnq + docbook-xsl + docbook-utils + dblatex + + +Now, to build the documentation: + + git clone --depth=0 git@gitlab.gnome.org:GNOME/gimp-help.git + cd gimp-help + # Set this variable to your own language. It should correspond to a directory in the "po" source folder. + export LINGUAS=en + ./autogen.sh [--without-gimp ALL_LINGUAS="en"] + make + make pdf-local diff --git a/wiki/Hacking:Building_with_Meson-20200806151232-edit.txt b/wiki/Hacking:Building_with_Meson-20200806151232-edit.txt new file mode 100644 index 0000000..6874208 --- /dev/null +++ b/wiki/Hacking:Building_with_Meson-20200806151232-edit.txt @@ -0,0 +1,4 @@ + +Please [https://wiki.gimp.org/index.php?title=Special:UserLogin&returnto=Hacking%3ABuilding+with+Meson&returntoquery=action%3Dedit log in] to edit pages. +Return to [[Hacking:Building with Meson]]. + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2FGObject-20140901172129-show.txt b/wiki/Hacking:Code_Snippets%2FGObject-20140901172129-show.txt new file mode 100644 index 0000000..0b2cf68 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FGObject-20140901172129-show.txt @@ -0,0 +1,68 @@ + + +The example described here is a GObject implementation of the following C++ class: + +
    class GimpCageConfig : public GimpImageMapConfig
    +{
    +  public:
    +    GimpCageConfig() {};
    +    virtual ~GimpCageConfig() {};
    +};
    + + + + +== Header == +
    +#define GIMP_TYPE_CAGE_CONFIG            (gimp_cage_config_get_type ())
    +#define GIMP_CAGE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfig))
    +#define GIMP_CAGE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +#define GIMP_IS_CAGE_CONFIG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_IS_CAGE_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_CAGE_CONFIG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +
    +
    +typedef struct _GimpCageConfigClass GimpCageConfigClass;
    +
    +struct _GimpCageConfig
    +{
    +  GimpImageMapConfig parent_instance;
    +};
    +
    +struct _GimpCageConfigClass
    +{
    +  GimpImageMapConfigClass parent_class;
    +};
    +
    +GType gimp_cage_config_get_type (void) G_GNUC_CONST;
    + +== Implementation == +
    #include "gimpcageconfig.h"
    +
    +static void gimp_cage_config_finalize (GObject *object);
    +
    +
    +G_DEFINE_TYPE (GimpCageConfig,
    +               gimp_cage_config,
    +               GIMP_TYPE_IMAGE_MAP_CONFIG)
    +
    +static void
    +gimp_cage_config_class_init (GimpCageConfigClass *klass)
    +{
    +  GObjectClass *object_class = G_OBJECT_CLASS (klass);
    +  object_class->finalize     = gimp_cage_config_finalize;
    +}
    +
    +static void
    +gimp_cage_config_finalize (GObject *object)
    +{
    +  GimpCageConfig  *gcc = GIMP_CAGE_CONFIG (object);
    +
    +  G_OBJECT_CLASS (parent_class)->finalize (object);
    +}
    + +== Code Generator == + +A good way to learn or hack GObject is to use a boilerplate generator. There is a good one in the Anjuta IDE. + + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2FGObject-20140901180426-edit.txt b/wiki/Hacking:Code_Snippets%2FGObject-20140901180426-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FGObject-20140901180426-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2FGObject-20201028003224-edit.txt b/wiki/Hacking:Code_Snippets%2FGObject-20201028003224-edit.txt new file mode 100644 index 0000000..9159b83 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FGObject-20201028003224-edit.txt @@ -0,0 +1,64 @@ +The example described here is a GObject implementation of the following C++ class: + +
    class GimpCageConfig : public GimpImageMapConfig
    +{
    +  public:
    +    GimpCageConfig() {};
    +    virtual ~GimpCageConfig() {};
    +};
    + + + +== Header == +
    +#define GIMP_TYPE_CAGE_CONFIG            (gimp_cage_config_get_type ())
    +#define GIMP_CAGE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfig))
    +#define GIMP_CAGE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +#define GIMP_IS_CAGE_CONFIG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_IS_CAGE_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_CAGE_CONFIG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +
    +
    +typedef struct _GimpCageConfigClass GimpCageConfigClass;
    +
    +struct _GimpCageConfig
    +{
    +  GimpImageMapConfig parent_instance;
    +};
    +
    +struct _GimpCageConfigClass
    +{
    +  GimpImageMapConfigClass parent_class;
    +};
    +
    +GType gimp_cage_config_get_type (void) G_GNUC_CONST;
    + +== Implementation == + +
    #include "gimpcageconfig.h"
    +
    +static void gimp_cage_config_finalize (GObject *object);
    +
    +
    +G_DEFINE_TYPE (GimpCageConfig,
    +               gimp_cage_config,
    +               GIMP_TYPE_IMAGE_MAP_CONFIG)
    +
    +static void
    +gimp_cage_config_class_init (GimpCageConfigClass *klass)
    +{
    +  GObjectClass *object_class = G_OBJECT_CLASS (klass);
    +  object_class->finalize     = gimp_cage_config_finalize;
    +}
    +
    +static void
    +gimp_cage_config_finalize (GObject *object)
    +{
    +  GimpCageConfig  *gcc = GIMP_CAGE_CONFIG (object);
    +
    +  G_OBJECT_CLASS (parent_class)->finalize (object);
    +}
    + +== Code Generator == + +A good way to learn or hack GObject is to use a boilerplate generator. There is a good one in the Anjuta IDE. diff --git a/wiki/Hacking:Code_Snippets%2FGObject-20210116190613-edit.txt b/wiki/Hacking:Code_Snippets%2FGObject-20210116190613-edit.txt new file mode 100644 index 0000000..9159b83 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FGObject-20210116190613-edit.txt @@ -0,0 +1,64 @@ +The example described here is a GObject implementation of the following C++ class: + +
    class GimpCageConfig : public GimpImageMapConfig
    +{
    +  public:
    +    GimpCageConfig() {};
    +    virtual ~GimpCageConfig() {};
    +};
    + + + +== Header == +
    +#define GIMP_TYPE_CAGE_CONFIG            (gimp_cage_config_get_type ())
    +#define GIMP_CAGE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfig))
    +#define GIMP_CAGE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +#define GIMP_IS_CAGE_CONFIG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_IS_CAGE_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_CAGE_CONFIG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +
    +
    +typedef struct _GimpCageConfigClass GimpCageConfigClass;
    +
    +struct _GimpCageConfig
    +{
    +  GimpImageMapConfig parent_instance;
    +};
    +
    +struct _GimpCageConfigClass
    +{
    +  GimpImageMapConfigClass parent_class;
    +};
    +
    +GType gimp_cage_config_get_type (void) G_GNUC_CONST;
    + +== Implementation == + +
    #include "gimpcageconfig.h"
    +
    +static void gimp_cage_config_finalize (GObject *object);
    +
    +
    +G_DEFINE_TYPE (GimpCageConfig,
    +               gimp_cage_config,
    +               GIMP_TYPE_IMAGE_MAP_CONFIG)
    +
    +static void
    +gimp_cage_config_class_init (GimpCageConfigClass *klass)
    +{
    +  GObjectClass *object_class = G_OBJECT_CLASS (klass);
    +  object_class->finalize     = gimp_cage_config_finalize;
    +}
    +
    +static void
    +gimp_cage_config_finalize (GObject *object)
    +{
    +  GimpCageConfig  *gcc = GIMP_CAGE_CONFIG (object);
    +
    +  G_OBJECT_CLASS (parent_class)->finalize (object);
    +}
    + +== Code Generator == + +A good way to learn or hack GObject is to use a boilerplate generator. There is a good one in the Anjuta IDE. diff --git a/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211444-history.txt b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211444-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211444-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211509-edit.txt b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211509-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901211509-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901212705-show.txt b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901212705-show.txt new file mode 100644 index 0000000..69db312 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20140901212705-show.txt @@ -0,0 +1,49 @@ + + +{| class="wikitable" +|- +|

    Contents

    + +* 1 Determining compiler +* 2 Determining modifiers of keyboard events (Ctrl, Alt, etc.) +|} + + + + +=Determining compiler= + +To make use of GCC specific features, use the __GNUC__ macro: + +
    +#ifdef __GNUC__
    +...
    +#endif
    +
    + +You can also grep the code for __GNU to find out existing samples to learn from. + +To make use of LLVM/Clang specific features, use the [http://clang.llvm.org/docs/LanguageExtensions.html Clang language extensions]. + + + +'''See also:''' +[http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html Common predefined macros in GCC] +[http://sourceforge.net/p/predef/wiki/Home/ Pre-defined Compiler Macros page at Sourceforge.net] + + +=Determining modifiers of keyboard events (Ctrl, Alt, etc.)= +
    +#include 
    +
    +my_key_event_handler(const GdkEventKey *keyevent)
    +{
    +
    +/* check for Ctrl (also on OS X; do not confuse with Cmd there!): */
    +if (keyevent->state & GDK_CONTROL_MASK)
    +
    +/* check for Alt: */
    +if (keyevent->state & GDK_MOD1_MASK)
    +
    +}
    +
    diff --git a/wiki/Hacking:Code_Snippets%2FMiscellaneous-20161024174623-edit.txt b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20161024174623-edit.txt new file mode 100644 index 0000000..b1364da --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20161024174623-edit.txt @@ -0,0 +1,39 @@ +__TOC__ + +=Determining compiler= + +To make use of GCC specific features, use the __GNUC__ macro: + +
    +#ifdef __GNUC__
    +...
    +#endif
    +
    + +You can also grep the code for __GNU to find out existing samples to learn from. + +To make use of LLVM/Clang specific features, use the [http://clang.llvm.org/docs/LanguageExtensions.html Clang language extensions]. + + +'''See also:''' + +[http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html Common predefined macros in GCC] + +[http://sourceforge.net/p/predef/wiki/Home/ Pre-defined Compiler Macros page at Sourceforge.net] + +=Determining modifiers of keyboard events (Ctrl, Alt, etc.)= + +
    +#include 
    +
    +my_key_event_handler(const GdkEventKey *keyevent)
    +{
    +
    +/* check for Ctrl (also on OS X; do not confuse with Cmd there!): */
    +if (keyevent->state & GDK_CONTROL_MASK)
    +
    +/* check for Alt: */
    +if (keyevent->state & GDK_MOD1_MASK)
    +
    +}
    +
    diff --git a/wiki/Hacking:Code_Snippets%2FMiscellaneous-20210124031932-edit.txt b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20210124031932-edit.txt new file mode 100644 index 0000000..b1364da --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20210124031932-edit.txt @@ -0,0 +1,39 @@ +__TOC__ + +=Determining compiler= + +To make use of GCC specific features, use the __GNUC__ macro: + +
    +#ifdef __GNUC__
    +...
    +#endif
    +
    + +You can also grep the code for __GNU to find out existing samples to learn from. + +To make use of LLVM/Clang specific features, use the [http://clang.llvm.org/docs/LanguageExtensions.html Clang language extensions]. + + +'''See also:''' + +[http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html Common predefined macros in GCC] + +[http://sourceforge.net/p/predef/wiki/Home/ Pre-defined Compiler Macros page at Sourceforge.net] + +=Determining modifiers of keyboard events (Ctrl, Alt, etc.)= + +
    +#include 
    +
    +my_key_event_handler(const GdkEventKey *keyevent)
    +{
    +
    +/* check for Ctrl (also on OS X; do not confuse with Cmd there!): */
    +if (keyevent->state & GDK_CONTROL_MASK)
    +
    +/* check for Alt: */
    +if (keyevent->state & GDK_MOD1_MASK)
    +
    +}
    +
    diff --git a/wiki/Hacking:Code_Snippets%2FMiscellaneous-20210513093525-edit.txt b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20210513093525-edit.txt new file mode 100644 index 0000000..b1364da --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FMiscellaneous-20210513093525-edit.txt @@ -0,0 +1,39 @@ +__TOC__ + +=Determining compiler= + +To make use of GCC specific features, use the __GNUC__ macro: + +
    +#ifdef __GNUC__
    +...
    +#endif
    +
    + +You can also grep the code for __GNU to find out existing samples to learn from. + +To make use of LLVM/Clang specific features, use the [http://clang.llvm.org/docs/LanguageExtensions.html Clang language extensions]. + + +'''See also:''' + +[http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html Common predefined macros in GCC] + +[http://sourceforge.net/p/predef/wiki/Home/ Pre-defined Compiler Macros page at Sourceforge.net] + +=Determining modifiers of keyboard events (Ctrl, Alt, etc.)= + +
    +#include 
    +
    +my_key_event_handler(const GdkEventKey *keyevent)
    +{
    +
    +/* check for Ctrl (also on OS X; do not confuse with Cmd there!): */
    +if (keyevent->state & GDK_CONTROL_MASK)
    +
    +/* check for Alt: */
    +if (keyevent->state & GDK_MOD1_MASK)
    +
    +}
    +
    diff --git a/wiki/Hacking:Code_Snippets%2FScript-Fu-20140901154412-history.txt b/wiki/Hacking:Code_Snippets%2FScript-Fu-20140901154412-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FScript-Fu-20140901154412-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2FScript-Fu-20140901161526-show.txt b/wiki/Hacking:Code_Snippets%2FScript-Fu-20140901161526-show.txt new file mode 100644 index 0000000..5a1a045 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FScript-Fu-20140901161526-show.txt @@ -0,0 +1,69 @@ + + +=== Batch Processing === +
    (define (do-it-real file-names-list)
    +  ; If you have any preprocessing to do, that is needed for all the images, do
    +  ; it here. For example, if the image is an ordered list of movie frames, you
    +  ; may want to define a counter starting at 0 here, and then access it later
    +  ...
    +
    +  ; Now, run through the list of images
    +  (map
    +    ; For each file name, do the following
    +    (lambda (file-name)
    +      (let* (
    +             ; Load the image, and retrieve it's ID into this variable
    +             (image (car (gimp-file-load RUN-NONINTERACTIVE file-name file-name)))
    +
    +             ; In many cases, we want the ID of the top layer (especially in
    +             ; images which have one layer; in these cases that layer has the
    +             ; actual image data.
    +             (layer (vector-ref (cadr (gimp-image-get-layers image)) 0))
    +
    +             ; Get the name of the image (without the folder path, just the
    +             ; name of the image file). Useful if you want to save the image at
    +             ; a different folder or with a slightly modified name.
    +             (image-name (car (gimp-image-get-name image)))
    +            )
    +
    +            ; Do some stuff to the image
    +            ...
    +
    +            ; Save the image using the default saving method. We pass the same
    +            ; file name to override the source.
    +            (gimp-file-save RUN-NONINTERACTIVE image layer file-name file-name)
    +
    +            ; Important - Close the image! Don'e just waste memory on hidden
    +            ; images. Also the idea is to work on one image at a time.
    +            (gimp-image-delete image)
    +        )
    +      )
    +    file-names-list
    +    )
    +  )
    +
    +; This procedure takes a pattern describing the names of the images to be
    +; processed. Examples:
    +;
    +;   "/home/lightning/Desktop/hello*.png"
    +;     All files on my Desktop folder, which are of png type and their name
    +;     begin with the world hello
    +;
    +;   "/home/lightning/Pictures/*"
    +;     All files inside my pictures folder
    +;
    +; Notes:
    +;
    +; 1. On Windows, if your path is of the form "C:\gimp\hi.emf", make sure you
    +;    change it to have double-backslashes: "C:\\gimp\\hi.emf"
    +;
    +; 2. The variable DIR-SEPARATOR contains the folder seperator charcter for the
    +;    given platform ('/' on Linux/Unix, '\' on Windows). Could be used in
    +;    (string-append FOLDER-PATH DIR-SEPARATOR FILE-NAME) to create a new path,
    +;    possibly for saving a file in a different directory.
    +;
    +; Example invocation:
    +;
    +;    (do-it "/home/lightning/tutorial/figure*.png")
    +(define (do-it file-name-pattern)
    +  (do-it-real (cadr (file-glob file-name-pattern 1))))
    diff --git a/wiki/Hacking:Code_Snippets%2FScript-Fu-20161024001833-edit.txt b/wiki/Hacking:Code_Snippets%2FScript-Fu-20161024001833-edit.txt new file mode 100644 index 0000000..c4c5b7b --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FScript-Fu-20161024001833-edit.txt @@ -0,0 +1,67 @@ +=== Batch Processing === +
    (define (do-it-real file-names-list)
    +  ; If you have any preprocessing to do, that is needed for all the images, do
    +  ; it here. For example, if the image is an ordered list of movie frames, you
    +  ; may want to define a counter starting at 0 here, and then access it later
    +  ...
    +
    +  ; Now, run through the list of images
    +  (map
    +    ; For each file name, do the following
    +    (lambda (file-name)
    +      (let* (
    +             ; Load the image, and retrieve it's ID into this variable
    +             (image (car (gimp-file-load RUN-NONINTERACTIVE file-name file-name)))
    +
    +             ; In many cases, we want the ID of the top layer (especially in
    +             ; images which have one layer; in these cases that layer has the
    +             ; actual image data.
    +             (layer (vector-ref (cadr (gimp-image-get-layers image)) 0))
    +
    +             ; Get the name of the image (without the folder path, just the
    +             ; name of the image file). Useful if you want to save the image at
    +             ; a different folder or with a slightly modified name.
    +             (image-name (car (gimp-image-get-name image)))
    +            )
    +
    +            ; Do some stuff to the image
    +            ...
    +
    +            ; Save the image using the default saving method. We pass the same
    +            ; file name to override the source.
    +            (gimp-file-save RUN-NONINTERACTIVE image layer file-name file-name)
    +
    +            ; Important - Close the image! Don'e just waste memory on hidden
    +            ; images. Also the idea is to work on one image at a time.
    +            (gimp-image-delete image)
    +        )
    +      )
    +    file-names-list
    +    )
    +  )
    +
    +; This procedure takes a pattern describing the names of the images to be
    +; processed. Examples:
    +;
    +;   "/home/lightning/Desktop/hello*.png"
    +;     All files on my Desktop folder, which are of png type and their name
    +;     begin with the world hello
    +;
    +;   "/home/lightning/Pictures/*"
    +;     All files inside my pictures folder
    +;
    +; Notes:
    +;
    +; 1. On Windows, if your path is of the form "C:\gimp\hi.emf", make sure you
    +;    change it to have double-backslashes: "C:\\gimp\\hi.emf"
    +;
    +; 2. The variable DIR-SEPARATOR contains the folder seperator charcter for the
    +;    given platform ('/' on Linux/Unix, '\' on Windows). Could be used in
    +;    (string-append FOLDER-PATH DIR-SEPARATOR FILE-NAME) to create a new path,
    +;    possibly for saving a file in a different directory.
    +;
    +; Example invocation:
    +;
    +;    (do-it "/home/lightning/tutorial/figure*.png")
    +(define (do-it file-name-pattern)
    +  (do-it-real (cadr (file-glob file-name-pattern 1))))
    diff --git a/wiki/Hacking:Code_Snippets%2FScript-Fu-20200923025950-edit.txt b/wiki/Hacking:Code_Snippets%2FScript-Fu-20200923025950-edit.txt new file mode 100644 index 0000000..c4c5b7b --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FScript-Fu-20200923025950-edit.txt @@ -0,0 +1,67 @@ +=== Batch Processing === +
    (define (do-it-real file-names-list)
    +  ; If you have any preprocessing to do, that is needed for all the images, do
    +  ; it here. For example, if the image is an ordered list of movie frames, you
    +  ; may want to define a counter starting at 0 here, and then access it later
    +  ...
    +
    +  ; Now, run through the list of images
    +  (map
    +    ; For each file name, do the following
    +    (lambda (file-name)
    +      (let* (
    +             ; Load the image, and retrieve it's ID into this variable
    +             (image (car (gimp-file-load RUN-NONINTERACTIVE file-name file-name)))
    +
    +             ; In many cases, we want the ID of the top layer (especially in
    +             ; images which have one layer; in these cases that layer has the
    +             ; actual image data.
    +             (layer (vector-ref (cadr (gimp-image-get-layers image)) 0))
    +
    +             ; Get the name of the image (without the folder path, just the
    +             ; name of the image file). Useful if you want to save the image at
    +             ; a different folder or with a slightly modified name.
    +             (image-name (car (gimp-image-get-name image)))
    +            )
    +
    +            ; Do some stuff to the image
    +            ...
    +
    +            ; Save the image using the default saving method. We pass the same
    +            ; file name to override the source.
    +            (gimp-file-save RUN-NONINTERACTIVE image layer file-name file-name)
    +
    +            ; Important - Close the image! Don'e just waste memory on hidden
    +            ; images. Also the idea is to work on one image at a time.
    +            (gimp-image-delete image)
    +        )
    +      )
    +    file-names-list
    +    )
    +  )
    +
    +; This procedure takes a pattern describing the names of the images to be
    +; processed. Examples:
    +;
    +;   "/home/lightning/Desktop/hello*.png"
    +;     All files on my Desktop folder, which are of png type and their name
    +;     begin with the world hello
    +;
    +;   "/home/lightning/Pictures/*"
    +;     All files inside my pictures folder
    +;
    +; Notes:
    +;
    +; 1. On Windows, if your path is of the form "C:\gimp\hi.emf", make sure you
    +;    change it to have double-backslashes: "C:\\gimp\\hi.emf"
    +;
    +; 2. The variable DIR-SEPARATOR contains the folder seperator charcter for the
    +;    given platform ('/' on Linux/Unix, '\' on Windows). Could be used in
    +;    (string-append FOLDER-PATH DIR-SEPARATOR FILE-NAME) to create a new path,
    +;    possibly for saving a file in a different directory.
    +;
    +; Example invocation:
    +;
    +;    (do-it "/home/lightning/tutorial/figure*.png")
    +(define (do-it file-name-pattern)
    +  (do-it-real (cadr (file-glob file-name-pattern 1))))
    diff --git a/wiki/Hacking:Code_Snippets%2FScript-Fu-20210512200540-edit.txt b/wiki/Hacking:Code_Snippets%2FScript-Fu-20210512200540-edit.txt new file mode 100644 index 0000000..c4c5b7b --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2FScript-Fu-20210512200540-edit.txt @@ -0,0 +1,67 @@ +=== Batch Processing === +
    (define (do-it-real file-names-list)
    +  ; If you have any preprocessing to do, that is needed for all the images, do
    +  ; it here. For example, if the image is an ordered list of movie frames, you
    +  ; may want to define a counter starting at 0 here, and then access it later
    +  ...
    +
    +  ; Now, run through the list of images
    +  (map
    +    ; For each file name, do the following
    +    (lambda (file-name)
    +      (let* (
    +             ; Load the image, and retrieve it's ID into this variable
    +             (image (car (gimp-file-load RUN-NONINTERACTIVE file-name file-name)))
    +
    +             ; In many cases, we want the ID of the top layer (especially in
    +             ; images which have one layer; in these cases that layer has the
    +             ; actual image data.
    +             (layer (vector-ref (cadr (gimp-image-get-layers image)) 0))
    +
    +             ; Get the name of the image (without the folder path, just the
    +             ; name of the image file). Useful if you want to save the image at
    +             ; a different folder or with a slightly modified name.
    +             (image-name (car (gimp-image-get-name image)))
    +            )
    +
    +            ; Do some stuff to the image
    +            ...
    +
    +            ; Save the image using the default saving method. We pass the same
    +            ; file name to override the source.
    +            (gimp-file-save RUN-NONINTERACTIVE image layer file-name file-name)
    +
    +            ; Important - Close the image! Don'e just waste memory on hidden
    +            ; images. Also the idea is to work on one image at a time.
    +            (gimp-image-delete image)
    +        )
    +      )
    +    file-names-list
    +    )
    +  )
    +
    +; This procedure takes a pattern describing the names of the images to be
    +; processed. Examples:
    +;
    +;   "/home/lightning/Desktop/hello*.png"
    +;     All files on my Desktop folder, which are of png type and their name
    +;     begin with the world hello
    +;
    +;   "/home/lightning/Pictures/*"
    +;     All files inside my pictures folder
    +;
    +; Notes:
    +;
    +; 1. On Windows, if your path is of the form "C:\gimp\hi.emf", make sure you
    +;    change it to have double-backslashes: "C:\\gimp\\hi.emf"
    +;
    +; 2. The variable DIR-SEPARATOR contains the folder seperator charcter for the
    +;    given platform ('/' on Linux/Unix, '\' on Windows). Could be used in
    +;    (string-append FOLDER-PATH DIR-SEPARATOR FILE-NAME) to create a new path,
    +;    possibly for saving a file in a different directory.
    +;
    +; Example invocation:
    +;
    +;    (do-it "/home/lightning/tutorial/figure*.png")
    +(define (do-it file-name-pattern)
    +  (do-it-real (cadr (file-glob file-name-pattern 1))))
    diff --git a/wiki/Hacking:Code_Snippets%2GObject-20220210134900-show.txt b/wiki/Hacking:Code_Snippets%2GObject-20220210134900-show.txt new file mode 100644 index 0000000..e4f52a5 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2GObject-20220210134900-show.txt @@ -0,0 +1,68 @@ + + +The example described here is a GObject implementation of the following C++ class: + +
    class GimpCageConfig : public GimpImageMapConfig
    +{
    +  public:
    +    GimpCageConfig() {};
    +    virtual ~GimpCageConfig() {};
    +};
    + + + + +==Header== +
    +#define GIMP_TYPE_CAGE_CONFIG            (gimp_cage_config_get_type ())
    +#define GIMP_CAGE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfig))
    +#define GIMP_CAGE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +#define GIMP_IS_CAGE_CONFIG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_IS_CAGE_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_CAGE_CONFIG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +
    +
    +typedef struct _GimpCageConfigClass GimpCageConfigClass;
    +
    +struct _GimpCageConfig
    +{
    +  GimpImageMapConfig parent_instance;
    +};
    +
    +struct _GimpCageConfigClass
    +{
    +  GimpImageMapConfigClass parent_class;
    +};
    +
    +GType gimp_cage_config_get_type (void) G_GNUC_CONST;
    + +==Implementation== +
    #include "gimpcageconfig.h"
    +
    +static void gimp_cage_config_finalize (GObject *object);
    +
    +
    +G_DEFINE_TYPE (GimpCageConfig,
    +               gimp_cage_config,
    +               GIMP_TYPE_IMAGE_MAP_CONFIG)
    +
    +static void
    +gimp_cage_config_class_init (GimpCageConfigClass *klass)
    +{
    +  GObjectClass *object_class = G_OBJECT_CLASS (klass);
    +  object_class->finalize     = gimp_cage_config_finalize;
    +}
    +
    +static void
    +gimp_cage_config_finalize (GObject *object)
    +{
    +  GimpCageConfig  *gcc = GIMP_CAGE_CONFIG (object);
    +
    +  G_OBJECT_CLASS (parent_class)->finalize (object);
    +}
    + +==Code Generator== + +A good way to learn or hack GObject is to use a boilerplate generator. There is a good one in the Anjuta IDE. + + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2GObject-20220210141435-show.txt b/wiki/Hacking:Code_Snippets%2GObject-20220210141435-show.txt new file mode 100644 index 0000000..e4f52a5 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2GObject-20220210141435-show.txt @@ -0,0 +1,68 @@ + + +The example described here is a GObject implementation of the following C++ class: + +
    class GimpCageConfig : public GimpImageMapConfig
    +{
    +  public:
    +    GimpCageConfig() {};
    +    virtual ~GimpCageConfig() {};
    +};
    + + + + +==Header== +
    +#define GIMP_TYPE_CAGE_CONFIG            (gimp_cage_config_get_type ())
    +#define GIMP_CAGE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfig))
    +#define GIMP_CAGE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +#define GIMP_IS_CAGE_CONFIG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_IS_CAGE_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CAGE_CONFIG))
    +#define GIMP_CAGE_CONFIG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CAGE_CONFIG, GimpCageConfigClass))
    +
    +
    +typedef struct _GimpCageConfigClass GimpCageConfigClass;
    +
    +struct _GimpCageConfig
    +{
    +  GimpImageMapConfig parent_instance;
    +};
    +
    +struct _GimpCageConfigClass
    +{
    +  GimpImageMapConfigClass parent_class;
    +};
    +
    +GType gimp_cage_config_get_type (void) G_GNUC_CONST;
    + +==Implementation== +
    #include "gimpcageconfig.h"
    +
    +static void gimp_cage_config_finalize (GObject *object);
    +
    +
    +G_DEFINE_TYPE (GimpCageConfig,
    +               gimp_cage_config,
    +               GIMP_TYPE_IMAGE_MAP_CONFIG)
    +
    +static void
    +gimp_cage_config_class_init (GimpCageConfigClass *klass)
    +{
    +  GObjectClass *object_class = G_OBJECT_CLASS (klass);
    +  object_class->finalize     = gimp_cage_config_finalize;
    +}
    +
    +static void
    +gimp_cage_config_finalize (GObject *object)
    +{
    +  GimpCageConfig  *gcc = GIMP_CAGE_CONFIG (object);
    +
    +  G_OBJECT_CLASS (parent_class)->finalize (object);
    +}
    + +==Code Generator== + +A good way to learn or hack GObject is to use a boilerplate generator. There is a good one in the Anjuta IDE. + + \ No newline at end of file diff --git a/wiki/Hacking:Code_Snippets%2Miscellaneous-20180812150601-show.txt b/wiki/Hacking:Code_Snippets%2Miscellaneous-20180812150601-show.txt new file mode 100644 index 0000000..1954688 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2Miscellaneous-20180812150601-show.txt @@ -0,0 +1,40 @@ + + +__TOC__ + +=Determining compiler= + +To make use of GCC specific features, use the __GNUC__ macro: + +
    +#ifdef __GNUC__
    +...
    +#endif
    +
    + +You can also grep the code for __GNU to find out existing samples to learn from. + +To make use of LLVM/Clang specific features, use the [http://clang.llvm.org/docs/LanguageExtensions.html Clang language extensions]. + + + +'''See also:''' +[http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html Common predefined macros in GCC] +[http://sourceforge.net/p/predef/wiki/Home/ Pre-defined Compiler Macros page at Sourceforge.net] + + +=Determining modifiers of keyboard events (Ctrl, Alt, etc.)= +
    +#include 
    +
    +my_key_event_handler(const GdkEventKey *keyevent)
    +{
    +
    +/* check for Ctrl (also on OS X; do not confuse with Cmd there!): */
    +if (keyevent->state & GDK_CONTROL_MASK)
    +
    +/* check for Alt: */
    +if (keyevent->state & GDK_MOD1_MASK)
    +
    +}
    +
    diff --git a/wiki/Hacking:Code_Snippets%2Script-Fu-20180812150602-show.txt b/wiki/Hacking:Code_Snippets%2Script-Fu-20180812150602-show.txt new file mode 100644 index 0000000..91c86c6 --- /dev/null +++ b/wiki/Hacking:Code_Snippets%2Script-Fu-20180812150602-show.txt @@ -0,0 +1,69 @@ + + +===Batch Processing=== +
    (define (do-it-real file-names-list)
    +  ; If you have any preprocessing to do, that is needed for all the images, do
    +  ; it here. For example, if the image is an ordered list of movie frames, you
    +  ; may want to define a counter starting at 0 here, and then access it later
    +  ...
    +
    +  ; Now, run through the list of images
    +  (map
    +    ; For each file name, do the following
    +    (lambda (file-name)
    +      (let* (
    +             ; Load the image, and retrieve it's ID into this variable
    +             (image (car (gimp-file-load RUN-NONINTERACTIVE file-name file-name)))
    +
    +             ; In many cases, we want the ID of the top layer (especially in
    +             ; images which have one layer; in these cases that layer has the
    +             ; actual image data.
    +             (layer (vector-ref (cadr (gimp-image-get-layers image)) 0))
    +
    +             ; Get the name of the image (without the folder path, just the
    +             ; name of the image file). Useful if you want to save the image at
    +             ; a different folder or with a slightly modified name.
    +             (image-name (car (gimp-image-get-name image)))
    +            )
    +
    +            ; Do some stuff to the image
    +            ...
    +
    +            ; Save the image using the default saving method. We pass the same
    +            ; file name to override the source.
    +            (gimp-file-save RUN-NONINTERACTIVE image layer file-name file-name)
    +
    +            ; Important - Close the image! Don'e just waste memory on hidden
    +            ; images. Also the idea is to work on one image at a time.
    +            (gimp-image-delete image)
    +        )
    +      )
    +    file-names-list
    +    )
    +  )
    +
    +; This procedure takes a pattern describing the names of the images to be
    +; processed. Examples:
    +;
    +;   "/home/lightning/Desktop/hello*.png"
    +;     All files on my Desktop folder, which are of png type and their name
    +;     begin with the world hello
    +;
    +;   "/home/lightning/Pictures/*"
    +;     All files inside my pictures folder
    +;
    +; Notes:
    +;
    +; 1. On Windows, if your path is of the form "C:\gimp\hi.emf", make sure you
    +;    change it to have double-backslashes: "C:\\gimp\\hi.emf"
    +;
    +; 2. The variable DIR-SEPARATOR contains the folder seperator charcter for the
    +;    given platform ('/' on Linux/Unix, '\' on Windows). Could be used in
    +;    (string-append FOLDER-PATH DIR-SEPARATOR FILE-NAME) to create a new path,
    +;    possibly for saving a file in a different directory.
    +;
    +; Example invocation:
    +;
    +;    (do-it "/home/lightning/tutorial/figure*.png")
    +(define (do-it file-name-pattern)
    +  (do-it-real (cadr (file-glob file-name-pattern 1))))
    diff --git a/wiki/Hacking:Code_Snippets-20200923025233-edit.txt b/wiki/Hacking:Code_Snippets-20200923025233-edit.txt new file mode 100644 index 0000000..31fadb7 --- /dev/null +++ b/wiki/Hacking:Code_Snippets-20200923025233-edit.txt @@ -0,0 +1 @@ +Root page for various gimp-related code snippets diff --git a/wiki/Hacking:Code_Snippets-20210303173835-edit.txt b/wiki/Hacking:Code_Snippets-20210303173835-edit.txt new file mode 100644 index 0000000..31fadb7 --- /dev/null +++ b/wiki/Hacking:Code_Snippets-20210303173835-edit.txt @@ -0,0 +1 @@ +Root page for various gimp-related code snippets diff --git a/wiki/Hacking:Code_Snippets-20210816142242-show.txt b/wiki/Hacking:Code_Snippets-20210816142242-show.txt new file mode 100644 index 0000000..a3f8cf9 --- /dev/null +++ b/wiki/Hacking:Code_Snippets-20210816142242-show.txt @@ -0,0 +1,5 @@ + + +Root page for various gimp-related code snippets + + \ No newline at end of file diff --git a/wiki/Hacking:Debug%2FTest-20200806141144-edit.txt b/wiki/Hacking:Debug%2FTest-20200806141144-edit.txt new file mode 100644 index 0000000..de95819 --- /dev/null +++ b/wiki/Hacking:Debug%2FTest-20200806141144-edit.txt @@ -0,0 +1,82 @@ +This describes tools and techniques for debugging and testing Gimp. + + +== Tests in the build system == + +There are 'test' targets in the Gimp build systems (automake or meson): + + >make test + + >ninja test + +== Using a debugger == + +You can use the gdb debugger by starting Gimp in the command line: + + >gdb gimp + +Then: + + (gdb) run ''(or set breakpoints etc.)'' + +It is usually best to have a "debug" build of gimp, that has not been stripped of debug symbols (using the "strip" command.) + +== Using a debugger on plugins == + +Plugins run as separate processes. Thus they won't appear in the gdb session for the main Gimp process. +You can invoke a plugin using the Gimp GUI ( say Filters>MyPlugin ). +While it is paused waiting for user input, +start another gdb session and "attach" gdb to the running filter process. + + +== Address sanitize == + +[https://lemire.me/blog/2016/04/20/no-more-leaks-with-sanitize-flags-in-gcc-and-clang/ A tutorial] + + +== Performance logs == + +[https://gitlab.gnome.org/GNOME/gimp/blob/master/devel-docs/performance-logs/performance-logs.md Gimp's own document about performance logging] + +== Fuzzing == + +[https://en.wikipedia.org/wiki/Fuzzing Wiki article on fuzzing] + +[https://flimp.fuzzing-project.org/tutorial-fuzzing-gimp.html A tutorial for fuzzing Gimp plugins] + +[https://caca.zoy.org/wiki/zzuf Homepage for zzuf fuzzer] Install package 'zzuf' + + zzuf gimp + +Although it usually stops early. TODO how to delay fuzzing til an image is loaded? + + +== Running Gimp in verbose mode == + +You can make Gimp print more information about what it is doing, in a command line of a terminal: + + gimp --verbose + +== Reading a stack trace == + +TODO + +Best if you build debug version: + +--enable-debug + +== Dynamic analysis tools == + +You might try: + +* valgrind install package 'valgrind' + +* address sanitizer + +Some snippets: + + >valgrind --track-origins=yes gimp + + setenv LD_PRELOAD=libasan.so.2 gimp-2.9 + +You can configure a meson build with -Db_sanitize=address. diff --git a/wiki/Hacking:Debug%2Test-20201028005149-show.txt b/wiki/Hacking:Debug%2Test-20201028005149-show.txt new file mode 100644 index 0000000..16f0327 --- /dev/null +++ b/wiki/Hacking:Debug%2Test-20201028005149-show.txt @@ -0,0 +1,148 @@ + + +This describes tools and techniques for debugging and testing Gimp. + + + + + +__TOC__ + +==Tests in the build system== + +There are 'test' targets in the Gimp build systems (automake or meson): + +
      >make test  
    +
    +
      >ninja test
    +
    + +==Using a debugger== + +You can use the gdb debugger by starting Gimp in the command line: + +
      >gdb gimp
    +
    + +Then: + +
      (gdb) run         ''(or set breakpoints etc.)''
    +
    + +It is usually best to have a "debug" build of gimp, that has not been stripped of debug symbols (using the "strip" command.) + + +==Using a debugger on plugins== + +Plugins run as separate processes. Thus they won't appear in the gdb session for the main Gimp process. +You can invoke a plugin using the Gimp GUI ( say Filters>MyPlugin ). +While it is paused waiting for user input, +start another gdb session and "attach" gdb to the running filter process. + + + + + +==Testing for memory errors== + +Tools for testing for memory errors: + +
      - [https://en.wikipedia.org/wiki/Valgrind Valgrind]
    +  - [https://en.wikipedia.org/wiki/AddressSanitizer AddressSanitizer]
    +
    +[https://lemire.me/blog/2016/04/20/no-more-leaks-with-sanitize-flags-in-gcc-and-clang/ A short tutorial] + +These tools are one kind of [https://en.wikipedia.org/wiki/Dynamic_program_analysis dynamic program analysis.] +They detect errors while Gimp is running. + +'''''These tools often produce spurious messages, and rarely find significant issues.''''' +To use them properly, you must have a deep understanding of a program's memory use, and you must spend much time interpreting messages. + + + + + +====Using Valgrind==== + +Install the package: valgrind + +Valgrind requires no recompilation of Gimp. + +To run gimp inside valgrind: + +
       >valgrind --track-origins=yes gimp
    +
    + +====Using AddressSanitizer with automake build using gcc compiler==== + +Install the package that includes the asan runtime library? + +Rebuild gimp, define an environment variable to tell the gcc compiler to use address sanitizer: + +
       CFLAGS="-fsanitize=address -fno-omit-frame-pointer" ./autogen.sh --disable-docs  --enable-debug
    +   make -j4
    +   make install
    +
    + +When you run gimp, tell the loader to load the asan runtime library first: + +
         export LD_PRELOAD=$(gcc -print-file-name=libasan.so)
    +     /usr/local/bin/gimp-2.99
    +
    + +(Otherwise, when you run a plugin, it is not compiled with address sanitize, yet the Gimp libraries are, +and AddressSanitizer complains that it wants to load its runtime library first, to catch all calls to malloc.) + + +====Using AddressSanitizer with meson build using clang compiler==== + +Install your distribution's packages that contain llvm tools [clang, lld] + +Rebuild gimp, define environment variables to use clang compiler and llvm linker and use the shared kind of asan runtime library: + +
       CC=clang CXX=clang++ CC_LD=/usr/bin/ld.lld CXX_LD=/usr/bin/ld.lld LDFLAGS=-shared-libasan meson _build \
    +        --buildtype=debug \
    +        ...
    +        -Db_sanitize=address
    +
    + +As of this writing, the meson build of gimp is experimental, not supported. +As of this writing, the above fails to build. + + +==Performance logs== + +[https://gitlab.gnome.org/GNOME/gimp/blob/master/devel-docs/performance-logs/performance-logs.md Gimp's own document about performance logging] + + +==Fuzzing== + +[https://en.wikipedia.org/wiki/Fuzzing Wiki article on fuzzing] +[https://flimp.fuzzing-project.org/tutorial-fuzzing-gimp.html A tutorial for fuzzing Gimp plugins] +[https://caca.zoy.org/wiki/zzuf Homepage for zzuf fuzzer] Install package 'zzuf' + +
       zzuf gimp
    +
    + +Although it usually stops early. TODO how to delay fuzzing til an image is loaded? + + + + + +==Running Gimp in verbose mode== + +You can make Gimp print more information about what it is doing, in a command line of a terminal: + +
       gimp --verbose
    +
    + +==Reading a stack trace== + +TODO + +Best if you build debug version: + +--enable-debug + + \ No newline at end of file diff --git a/wiki/Hacking:Debug%2Test-20210818164743-show.txt b/wiki/Hacking:Debug%2Test-20210818164743-show.txt new file mode 100644 index 0000000..d5c64ee --- /dev/null +++ b/wiki/Hacking:Debug%2Test-20210818164743-show.txt @@ -0,0 +1,329 @@ + + +This describes tools and techniques for debugging and testing Gimp. + + + + + +__TOC__ + +==Tests in the build system== + +There are 'test' targets in the Gimp build systems (automake or meson): + +
      >make test  
    +
    +
      >ninja test
    +
    + +==Using a debugger== + +The gdb debugger is the most common debugger on Linux. +This may apply to other debuggers on other platforms. + + +===Using a debugger on the GIMP app=== + +You can use the gdb debugger by starting Gimp in the command line: + +
      >gdb gimp
    +
    + +Then: + +
      (gdb) run         ''(or set breakpoints etc.)''
    +
    + +It is usually best to have a "debug" build of gimp, that has not been stripped of debug symbols (using the "strip" command.) + + +===Using a debugger on plugins=== + +Plugins run as separate processes. +Thus they won't appear in a gdb session for the main Gimp process. + +You can still debug plugins. +See the document [https://gitlab.gnome.org/GNOME/gimp/-/blob/master/devel-docs/debug-plug-ins.txt "Debugging Plugins"] in the GIMP repository. + +The basic idea is a feature of gdb called "attaching to a running process." +You start a gdb session and "attach" gdb to the PID of the running filter process. +You start gdb giving it the filename of the plugin executable. +The file is used to load symbols into the debugger. +But you don't tell gdb to run the program file, +instead you tell gdb to "attach" the already running program, +wherever it is executing, i.e. wherever it's program counter is. + +You can invoke a plugin using the Gimp GUI, say Filters>MyPlugin. +While it is paused waiting for user input, you can attach gdb. + +You can also tell GIMP that when it starts a particular plugin, +the plugin should pause and print its PID, so that you can attach gdb. + +When a plugin is not a C language program, but an interpreted language plugin, gdb will show interpreter code as well as plugin specific code. + +Gdb works better when programs and libraries have been built with debug symbols and not stripped of debug symbols. + + +==Generating stack traces== + +===Generating stack traces on crashes for the GIMP app=== + +The GIMP app can catch certain signals and generate stack traces, also called backtraces or crash dumps. + +Such stack traces appear in a dialog. + +This behavior can be configured using the menu item Edit>Preferences>Debugging. + + +===Generating stack traces on crashes and warnings for plugins=== + +By setting an environment variable, you can arrange that plugins catch certain signal and generate stack traces to stderr. + +Set the environment variable GIMP_PLUGIN_DEBUG. + +See the document [https://gitlab.gnome.org/GNOME/gimp/-/blob/master/devel-docs/debug-plug-ins.txt "Debugging Plugins"] in the GIMP repository. + +You need to start the GIMP app in a console/terminal to see the stack trace. + +An example is: + + + +
       >GIMP_PLUGIN_DEBUG=all,fatal-warnings gimp
    +
    + + +where ">" is a console prompt, and you define an environment variable just before invoking the GIMP app. +(You could also export the environment variable into your shell or define it in your shell profile.) + + + +Note that you use the ''filename'' of a plugin's executable file, not a PDB procedure name. +Each plugin can implement many PDB procedures. Examples: + + + +
       >GIMP_PLUGIN_DEBUG=warp,fatal-warnings gimp
    +    
    +   >GIMP_PLUGIN_DEBUG=foggify.py,fatal-warnings gimp
    +
    + +Where the first example is for a C language plugin and the second is for a Python plugin. + + + +Note this doesn't work for ScriptFu plugin scripts, since ScriptFu is an extension, and scripts are not plugins in their own processes. +TODO can you do this for the ScriptFu extension? + + + + + +===The stack-trace-mode option to the GIMP app=== + +This option also affects how stack traces are printed, for both the GIMP app and plugins. + +
      --stack-trace-mode [never, query, always]
    +
    + +Example: + +
       >GIMP_PLUGIN_DEBUG=warp,fatal-warnings gimp --stack-trace-mode query
    +
    + + + + +===Generating stack traces on demand=== + +Occasionally it may be too much trouble to use gdb to catch conditions and print a stack trace. +In C code (of the GIMP app or a plugin), you can print a stack trace. +GIMP code has a utility function implemented in libgimpbase/gimputils.c. + +
      #include 
    +  #include 
    +  #include 
    +
    +
      gimp_stack_trace_print(NULL, stderr, NULL);
    +
    + +Where you: include stdio.h for the "stderr" symbol, +include gio.h for the GFile symbol used by gimp_stack_trace_print() +and include gimputils.h as the header for gimp_stack_trace_print(). + + +===Reading a stack trace=== + +A stack trace will show source file names and line numbers if you have built GIMP and libraries with debug symbols +(for an automake build, the option --enable-debug.) + +The top few lines of the stack trace will be the functions that implement stack trace printing. + + + + + +===Analyzing core dumps=== + +On Linux systems, you can arrange that crashing programs leave a core dump that can be analyzed with gdb. + + + + + +==Testing for memory errors== + +Tools for testing for memory errors: + +
      - [https://en.wikipedia.org/wiki/Valgrind Valgrind]
    +  - [https://en.wikipedia.org/wiki/AddressSanitizer AddressSanitizer]
    +
    +[https://lemire.me/blog/2016/04/20/no-more-leaks-with-sanitize-flags-in-gcc-and-clang/ A short tutorial] + +These tools are one kind of [https://en.wikipedia.org/wiki/Dynamic_program_analysis dynamic program analysis.] +They detect errors while Gimp is running. + +'''''These tools often produce spurious messages, and rarely find significant issues.''''' +To use them properly, you must have a deep understanding of a program's memory use, and you must spend much time interpreting messages. + + + + + +====Using Valgrind==== + +Install the package: valgrind + +Valgrind requires no recompilation of Gimp. + +To run gimp inside valgrind: + +
       >valgrind --track-origins=yes gimp
    +
    + +====Using AddressSanitizer with automake build using gcc compiler==== + +Install the package that includes the asan runtime library? + +Rebuild gimp, define an environment variable to tell the gcc compiler to use address sanitizer: + +
       CFLAGS="-fsanitize=address -fno-omit-frame-pointer" ./autogen.sh --disable-docs  --enable-debug
    +   make -j4
    +   make install
    +
    + +When you run gimp, tell the loader to load the asan runtime library first: + +
         export LD_PRELOAD=$(gcc -print-file-name=libasan.so)
    +     /usr/local/bin/gimp-2.99
    +
    + +(Otherwise, when you run a plugin, it is not compiled with address sanitize, yet the Gimp libraries are, +and AddressSanitizer complains that it wants to load its runtime library first, to catch all calls to malloc.) + + +====Using AddressSanitizer with meson build using clang compiler==== + +Install your distribution's packages that contain llvm tools [clang, lld] + +Rebuild gimp, define environment variables to use clang compiler and llvm linker and use the shared kind of asan runtime library: + +
       CC=clang CXX=clang++ CC_LD=/usr/bin/ld.lld CXX_LD=/usr/bin/ld.lld LDFLAGS=-shared-libasan meson _build \
    +        --buildtype=debug \
    +        ...
    +        -Db_sanitize=address
    +
    + +As of this writing, the meson build of gimp is experimental, not supported. +As of this writing, the above fails to build. + + +==Performance logs== + +[https://gitlab.gnome.org/GNOME/gimp/blob/master/devel-docs/performance-logs/performance-logs.md Gimp's own document about performance logging] + + +==Fuzzing== + +[https://en.wikipedia.org/wiki/Fuzzing Wiki article on fuzzing] +[https://flimp.fuzzing-project.org/tutorial-fuzzing-gimp.html A tutorial for fuzzing Gimp plugins] +[https://caca.zoy.org/wiki/zzuf Homepage for zzuf fuzzer] Install package 'zzuf' + +
       zzuf gimp
    +
    + +Although it usually stops early. TODO how to delay fuzzing til an image is loaded? + + + + + +==Other debugging tricks== + +This section lists more debugging aids. + +That they are listed here does not imply they are useful in any given situation. + + +===Running Gimp in verbose mode=== + +You can make Gimp print more information about what it is doing, in a command line of a terminal: + +
       gimp --verbose
    +
    + +===Stopping at GLib warnings and errors=== + +GIMP (the app and plugins) use GLib. + +The environment variable G_DEBUG affects whether GLib stops on warnings or criticals. +See [https://developer.gnome.org/glib/stable/glib-Message-Logging.html Gnome documents.] +
       export G_DEBUG=fatal-criticals  or fatal-warnings
    +
    + +===Enabling GLib logging=== + +GIMP uses the logging facilities of GLib, but very lightly. + +The environment variable G_MESSAGES_DEBUG affects whether logged messages of levels DEBUG and INFORMATIONAL are printed to stderr. +See [https://developer.gnome.org/glib/stable/glib-Message-Logging.html Gnome documents.] +From those documents: "G_MESSAGES_DEBUG: A space-separated list of log domains for which debug and informational messages are printed. By default these messages are not printed." +Also, you can use the "all" domain. + +The domains for GIMP are: + +
       "gimp"
    +   "scriptfu"
    +   "LibGimp",
    +   "LibGimpBase",
    +   "LibGimpColor",
    +   "LibGimpConfig",
    +   "LibGimpMath",
    +   "LibGimpModule",
    +   "LibGimpThumb",
    +   "LibGimpWidgets"
    +
    +
    + +The domains for GLib are: + +
       "GLib",
    +   "GLib-GObject",
    +   "GLib-GIO",
    +
    + +TODO are the above correct? + +Example: + +
      export G_MESSAGES_DEBUG=all
    +  export G_MESSAGES_DEBUG=scriptfu
    +
    + +===Debugging GObject usage=== + +[https://blogs.gnome.org/danni/2011/02/17/ld_preload-gobject-lifetime-debugging-tool/ There is a pre-loading library that helps debug lifetimes of GObjects.] +This library inserts itself ahead of the usual g_object_new() similarly to the way a memory analyzer inserts itself ahead of malloc(). + + \ No newline at end of file diff --git a/wiki/Hacking:Dev_Meeting_14_Mar_2011-20150911224948-edit.txt b/wiki/Hacking:Dev_Meeting_14_Mar_2011-20150911224948-edit.txt new file mode 100644 index 0000000..0257792 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_14_Mar_2011-20150911224948-edit.txt @@ -0,0 +1,376 @@ +Meeting page for the Developer Meeting which will take place in the GIMP IRC on March 14th 2011, 10:00 PM CET (GMT+1) + +'''Time for Next Meeting(?):''' March 28 2011, 10:00 PM CET (GMT+1). + +__TOC__ + +==Agenda== + +===Reviewing last meeting's decision=== +Follow up what was done and what wasn't, from the decisions of last meeting. See [[Hacking:Dev_Meeting_28_Feb_2011]] + +===Serious discussion of GIMP's programming language=== +There have been many questions about whether we should switch some of GIMP's code to some language other than C+GObject, where the development would be more rapid. On the list of suggested languages we saw JavaScript, Python, Vala and some more. + +There is a consensus(?) that core code was and will continue to be in C, mainly for performance reasons but not only. But now that we are starting to get some logic out to GEGL, would it make sense to change at least the language of the UI to something other than C? + +Some people vetoed this, others vetoed remaining in C - so let's discuss it! + +===2.8 - Get it out!=== +We are [https://bugzilla.gnome.org/buglist.cgi?query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO&target_milestone=2.6&target_milestone=2.8&product=GIMP 54 bugs] away from releasing GIMP 2.8. Lets browse hrough that list and see who can fix what, and if there are any ways in which some devs can help others to balance the load (for example, mitch is working too much!) + +===Roadmap Review=== +Enselic made a wonderful roadmap for gimp on [[GIMP Roadmap]]! I think we should all review this together, to make plans clear for everyone. For example, some stuff that were proposed for the upcoming google summer of code, are targeted for versions of gimp which aren't exactly "near". + +===Anything else? === +Tell LightningIsMyName and he'll add it :) + +==Decided Actions== + +See chat log - nothing organized this time... + +==Meeting Log== +
    
    +
    +== Topic: GIMP developer meeting, 22:00 CET (GMT+1) March 14th 2011 | Agenda: http://gimp-wiki.who.ee/index.php?title=Hacking:Dev_Meeting_14_Mar_2011 | THIS MEETING IS BEING LOGGED! ==
    +
    + Topic 1 on the agenda
    + Reviewing last meeting's decision
    + http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011#Decided_Actions
    + old-decision 1: schumaml - any progress on wgo? I had none
    + neo hasn't replied to my mail
    + so we are stuck on this...
    + I asked him to tell me what' left to do to get automatic updates
    + ...
    + old-decision 2: Alexia and mitch take care of redirecting wiki.gimp.org
    + Both aren't attending, so it's kind of hopeless to ask for progress
    + seems as if it's not working, so let's move on
    + it's not redirecting for me
    + old-decision 3: Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + done, next
    + http://gimp-wiki.who.ee/index.php/GIMP_Roadmap
    + Enselic, anything you'd like to add to your mail? Or should we wait for the in depth discussion, which is scheduled later for this meeting?
    + yes let's be done with the old stuff first
    + old-decision 4: everybody subscribe to bug mail and TRIAGE BUGS
    + Is any of the devs here not submitted to bugmail?
    + I haven't noticed a significant increase in bug triaging
    + it's not that important... it's more important that people write code
    + we should set goals and guidelines
    + 2.8 and future are planned for the rest of this meeting :)
    + LightningIsMyName: for bug triaging
    + Enselic: regarding the roadmap, low:priority High-end CMYK support...
    + schumaml, for example? what sort of goals?
    + Enselic: I think taking the separate- plug-in given on the mailinglist and making it part of GIMPs default install is a sensible thing to do
    + pippin: let's wait with this discussion
    + LightningIsMyName: what to do with new bugs, unconfirmed bugs, long-time nedinfo
    + common sense is enough to get started, if someone does the wrong thing, more experienced bug triagers will correct it
    + don't be scared
    + :) I think this should be tightly related to the roadmap
    + just start slowly so that people have a chance to correct you if you do something wrong
    + next item on the old-action list please
    + bug don't necessarily involved the roadmap
    + but yes, next
    + old-decision 5: mitch, make a development release soo
    + epic fail, next ;)
    + mitch itsn't here, and 2.8 is topic 2 of the agenda
    + old-decision 6: LightningIsMyName takes care of next meeting
    + done, next :)
    + old-decision 7: setting pages on the wiki to discuss changes in different topics
    + now, here we have something more serious
    + can someone elaborate on the topic? I don't understand it
    + for example, the last PDB change annoyed some people, and broke many things
    + mainly scripts/plugins
    + what change?
    + these things should be discussed more in depth and not be solo work
    + schumaml, all the context related ones
    + Enselic, what's the status of the dev site?
    + the work should have been performed on a feature branch, that's the problem
    +* LightningIsMyName objects new branches - we have too many of these
    + I don't think the PDB changes broke anything but they made most scripts pop up some deprecation warnings.
    + LightningIsMyName: if you mean tasktaste.com, it's not for production use yet
    + let's revisist this topic after we're done with the old-action list
    + agreed
    + next on that list please
    + old-decision 8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday (March 5th, 2011) is hard dead line for finalizing the project list!
    + done with gsoc ideas :)
    + old-decision 9: all devs PM/Email LightningIsMyName username and email
    + any dev here without a user on the wiki?
    + yes
    + ... that wants one
    + schumaml, as the topic states - PMing me is the way to get a user
    + closed topic 1 - review old decisions
    + topic 2: Serious discussion of GIMP's programming language
    + I think this title talks for itself, but I'm afraid we have a serious lack of devs here
    + I noticed that the AdaptableGIMP guys used Vala for quite some substantial parts of their added code, and I think Vala is the language we should choose as a higher-level GIMP language
    + I was also thinking in that direction. Is vala stable?
    + I haven't had time to thoroughly test it yet unfortunately
    + is the vala language spec frozen yet?
    + do we drop scheme and python for vala then?
    + enough to get some vala code into GIMP
    + my main concern with vala is horror stories I heard on #gimp about programs that break because of vala changes
    + what are you referring to as "GIMP's programming language"?
    + no, Vala doesn't fit our gimprc files for example
    + ketas-av Kevin
    + Kevin, ui programming and other non core 
    + for "settings files", my long-term pick is JavaScript, mu short-term pick is to stick with Scheme
    + vala has the advantage of possible integrating directly with existing C gobject code
    + how hard would it be to introduce a vala dependancy for building gimp from git?
    + my plan is to rewrite GimpTag in Vala
    + (vala code can generate C code for tars)
    + Are there vala plug-in bindings already? Maybe try translating some plug-ins into vala and see how it goes before totally committing to it?
    + Perhaps you should define the problem before we trying to pick a single(?) language for the GUI and non-core stuff.
    + plug-ins != core
    + IMO Vala will be "yet another obscure language those gimp guys chose" to the general public
    + schumaml: it's very C#-ish
    + or Java-ish if you prefer. It's not an alien syntax
    + ok, let's make a list: gui, image-processing core, plug-ins
    + Would you really want to use a language in the core that wasn't supported for plug-ins?
    + gui first
    + before we decide on a language, we need some hands on experience
    + that is, we need patches that introduces Vala to the GIMP core
    + we need experimental patches for other languages too preferably
    + is there an auto* expert here?
    + (autotools)
    + I'm fairly comfortable with autotools
    + what do we want to achieve by this?
    + ketas-av Kevin
    + schumaml: increased productivity
    + by whom?
    + manually initializing vtables is a waste of time
    + Kevin, what would it take to introduce vala as a git optional dependancy
    + As I said, I think we need to define the problem first.
    + writing GOBject C boilerplate code is a waste of time
    +* LightningIsMyName more than just agrees
    + so the problem is "no C!!!"
    + no, the problem is "no  gobject!"
    + no, the problem is "stop using the wrong tool for the job"
    + I guess mayn people agree on that
    + The problem is "glib C bindings are a pain"
    + It shouldn't take much to add vala but I don't know anything about Vala and only heard pippin talk about it.
    + http://live.gnome.org/Vala
    + from a more argumentative perspective, learning to read and understand GObject with C is hard; potential contributors flee before they are able to decode what code does...
    + if we add Vala, it must not be optional. If it is optinal, we won't know if it's good enough
    + If the problem is "how to create dialog boxes in an easier and more portable method than coding in C", the solution doesn't really depend on picking a single language.
    + is Vala supported on all of our platforms, within the standard autotools chain?
    + I think that in general, having 30% of gobject files on glue code is a waste of resources?
    + schumaml: Vala generates C code
    + schumaml: vala is just a pre-processor that generates C+gobject code passed to the c compiler
    + schumaml: answer: yes
    + I'd really hate to hit a "oh, hehe, nobody uses autools on windows" pitfall
    + We need someone to fix the tutorial on native windows build. I can do it with enselic's nightlys, but direct git is a pain
    + For many situations a dialog can be designed with GUI tools such as Glade.
    + don't see it as my nightlys, it's GIMP's nightlys
    + ketas-av Kevin
    + or one of its variants to get a gtk builder file.
    + guys, this is not about a higher level language for the GUI parts, it's for the whole core
    + btw, where are the vala builds for windows and os x?
    + Few, if none, of the GIMP core objects needs to be in C
    +* LightningIsMyName did a mistake and started talking about gui
    + if any*
    + I think the PDB in GIMP and its myriad set of bindings is a problem in this regard.. what we are talking about is not yet another language with bindings to the PDB either...
    + Enselic: That is why I thought we should clearly define the problem of needing to pick some language first. :-)
    + Kevin: again, the problem is that one is not productive in C
    + Productive doing what?
    + getting your computer to do what you want
    + ketas-av Kevin
    + Kevin,  30% glue code for gobject
    + Works fine for me.
    + getting the GIMP core do what you want*
    + and in small files, up to 60%
    + if gegl ops didnt use chanting, they would be ~50 lines longer
    + with a lot of repetition
    + IMO any language would be good, if we decide to make it the default for scripts and plug-ins too and drop anything else from the default installs
    + the good part of vala, is that it can integrate with things we have - so the transition could be gradual
    + I don't run in to gObject in scripts and plug-ins. I've only seen it in GEGL.
    + it seems like we agree that Vala probably is the best choice to fix the problem of too much GObject C boilter plate in the core, the next step is writing some actual Vala code
    + so, not hearing any real suggestions for other core languages - I'm closing this topic as:
    + 1. All devs take a look at vala, and try to mess with it
    + The next thing is finding someone who has heard of Vala and knows something about it.
    + 2. Someone tries some actual patch
    + ketas-av Kevin
    + Kevin, I played a bit with vala
    + so, any other additions on this subject? Any other languages?
    + I'm already trying to get more of a handle on C# for another project I'm working on and I also am looking more at Python. I don't need to deal with another (obscure?) language right now.
    + Stupid question: would this be in the 2.8 timeframe, or 3.0, or what?
    + javascript can work quite nicely, using the same/similar api meta data binding generation that vala relies on
    + vala is low-prio
    + compared to high-prio things on our roadmap
    + so tagging vala as a "hack if you want" on the roadmap?
    +* pippin is playing with the idea of resurrecting a proper example GEGL ui front-end, and would be trying to avoid doing that in C
    + I don't think we should keep it on the roadmap, the roadmap should be high-level enough for users to digest
    + things there should matter for users
    + I think there should be a "dev roadmap"
    + pippin: Python and wxWindows? :
    + LightningIsMyName: we don't need to put this on any roadmap imo
    + Kevin: I wouldnt exclude python,. but wxwindows is out of the quesiton
    + this meeting log is good enough
    + ok :) so let's move on
    + topic 3: 2.8 - Get it out!
    + Enselic did a very serious clean of bugs for 2.8
    + first of all, things on the 2.6 milestone don't block a 2.8 release
    + Enselic, what were the things you filtered off?
    + (other than 2.6 specific bugs)
    + I didn't touch any bugs on the 2.6 milestone, only on the 2.8, 2.10 and 3.0 milestones
    + isn't it a bit premature to change milestones on bugs set for 2.10 and 3.0?
    + we have a roadmap
    + I'm going to ask a possibly "non popular" question - if we get 2.8 out, can we tell 2.6 only bugs (that don't appear on 2,8) to go to hell?
    + our priorities are set, so I don't see how it was premature
    + Enselic, roadmap is the next topic on the list - I think there is place to discuss it
    + LightningIsMyName: one we have released 2.8, I plan to go through the 2.6 bugs and remove them if they are not important
    + LightningIsMyName: ok
    + once we have*
    + Is it acceptable to "discard" such bugs in open source?
    + with "remove" I meant "remove from milestone"
    + we fix what's important and what matters, we don't have resources to fix more things than that
    + why would you do that. isn't it enough to resolve them as wontfix?
    + a bug is still a bug and should be in our bugtracker
    + it is
    + As a part of this topic, I also mentioned helping other devs.
    + Are there any devs here blocked by others, other than gui specs?
    + again, we're not blocked by gui specs...
    + afaik
    + gui specs should have recieved "blocked"
    + speaking of gui, guiguru - do we/us/you have gimp interns?
    + are we done with "2.8, get it out"?
    + not yet
    + Enselic, you said you'll work on swm, right?
    + I will, yes
    + Is there any load of the work that other devs can take off from that project?
    + something which does not require deep hacking of the display?
    + not really no
    + so yeah, we are done :P
    + topic 3: Roadmap Review
    + http://gimp-wiki.who.ee/index.php/GIMP_Roadmap
    + all devs and *users* please take a look
    + um "*users*"? ;)
    + ... I think taking the separate- plug-in given on the mailinglist and making it part of GIMPs default install is a sensible thing to do ...
    + Enselic, roadmap is also about community :)
    + pippin: yes, but for 2.10, we must not add more features to 2.8
    + LightningIsMyName: fair enough
    + I am referring to the statement on the roadmap that CMYK is low priority
    + quick question - why do we have 2.10?
    + well, existing patches have high priority
    + core developers *really* want JavaScript support?
    + LightningIsMyName: in particular because mitch wants to adjust the libgimp API before 3.0
    + ketas-av Kevin
    + Kevin, not me
    + mitch has already stated more changes to the api are in the works.
    + Has mitch discussed these api changes anywhere?
    + I haven't seen anything specific before it happened :P
    + I don't remember much of the discussion of the changes that have been made already.
    + not that I know of, but what he has done so far has been sensible
    + I'm not 100% certain about the sensible part.
    + hehe
    + Kevin: what changes would you consider controversial?
    + Moving parameters out of the procedure call and making this context set of api calls seems odd and might have broken some scripts. It remains to be seen how that is going to work out.
    + ketas-av Kevin
    + Kevin: so you like functions with 10 parameters?
    + Kevin, that actually makes sense - allow adding more parameters in the future
    + I am not sure if the default context values will be the same as the values previously used by scripts.
    + Enselic, win32 api calls can have 20 :P
    + ketas-av Kevin
    + Kevin, has a point there - I'm also worried about that
    + I think we should add something like (gimp-context-reset "2.8")
    + why are you not sure?
    + I'm still not happy about the gimp-flip that used to be simple but now takes about a half dozen parameters to do a simple flip in either H or V directions.
    + isn't it as simple as, instead of   f(a, b, c); it's now f(b); f(c); f(a); ?
    + I have two other things I need to get done then I'll get back to reviewing pending patches for Script-Fu scripts. After the changes are commited, it will mean having to get someone(s) to test all 100 scripts to make sure the move to context didn't break something.
    + I think this is something we can use all the non programming users that wanted to help for
    + Kevin: that situation is a good argument for making sure new code gets regression tests written too
    + I don't think we can write such tests for script-fu
    + gimp-flip used to take drawable and a direction. Now its replaced by gimp-drawable-transform-flip-simple which requires 5 parameters
    + LightningIsMyName: of course we can, it's software we're crafting
    + :)
    + How do we write regression tests for scripts with random output?
    + Kevin: so write a simple wrapper function that you use in your scripts?
    + LightningIsMyName: seeding+
    + ?
    + A change that can affect parameters used in operations make it hard to write regression tests that would ensure scripts will still do what they used to do.
    + I think that adding (gimp-context-reset "2.8") for a different versions is an asap requirement for allowing such wrapper functions
    + back to the roadmap, shall we?
    + yes please
    + Every script will need to push and pop context but IIRC, the script gets a copy of the existing context which may or may not have all the context settings as the default so a script may not work the same as before.
    + Move JavaScript to low priority?
    +* guiguru was afk
    + Enselic, how can "Automatic layer boundary management" be scheduled for 3.2, and also proposed as a gsoc this year?
    + LightningIsMyName: interviewing 2 interns this week
    + guiguru, great!
    + LightningIsMyName: the roadmap is not set in stone
    + LightningIsMyName: if code is ready, we merge it in
    + so let's discuss it(=roadmap).
    + I'll begin with 2.10
    + doing a release just for bugfixes and libgimp changes?
    +* guiguru signs off
    + LightningIsMyName: and the CMYK plug-in, and new layer modes
    + Its the last chance to get in any remaining API changes before 3.0
    + LightningIsMyName: and other things that will drop in
    + I'm willing to move JavaScript off the milestone btw
    + The move to 3.0 includes integrating gegl as the core of everything, right?
    + I've moved JS off the roadmap now
    + LightningIsMyName: we will store image data in GeglBuffers, yes
    +  Enselic: ok. You could have moved it to low priority as its also currently a GSoC idea
    + I was urged by many photographers whom I know, to ask this to be done earlier. Not that I can do anything about it, but I'm raising this here
    + GIMP 3.4 - "Auto-anchoring of floating selection"
    + can someone explain me why do we need floating selections? it's more of a trouble than anything else
    + what happened to 3.2?
    + ketas-av Kevin
    + Kevin, no objection on 3,2 goals, I think :)
    + :-)
    + Why can't pasting be above the current layer or at the top (different shortcuts) and we simply get rid of floating selections?
    + I'll lie if I say that I used these more than once in a month, and I use gimp daily as a user
    + then how would you move what you pasted, if it's not a new layer?
    + How do other programs handle pasting? How would you be able to move a pasted thing in to position?
    + I don't even use them that often, and I spend a lot of time trying to explain them to users who don't understand them.
    + Mikachu, paste a new layer would paste above the current layer. then simply move
    + merge would be easy
    + What about automerge of the paste to current layer when tool changes from the move tool?
    + ketas-av Kevin
    + Kevin - other ops may be needed on pastes - not sure that's the right criteria. but we can work something out
    + The tool won't normally be the move tool to begin with.
    + should we default to non-destructive solutions if possible?
    + ,. this is ux/guiguru territory, but we do know we want to get rid of the floating selection
    + You might want to paste then scale, paste then levels/curves/brightness, ...
    + Paste something, move tool is selected, you move it then after changing tool, it merges. It would be predictable behaviour. Just have to decide which steps push Undo's
    + I think getting rid of floating selection is easier than continuing to support it when moving to 3
    + What if you don't want it to merge?
    + I always want pastes to be a new layer.
    +* Enselic signs off
    + Paste as new layer. 
    + bye Enselic ;)
    + paste as new layer is a possible valid option
    + The only problem is pasting on a channel, everything else doesn't need this
    + but we're discussing 'move to new layer'
    + I usually want to paste to current layer and move the paste before anchoring. I don't tend to do other ops on a floating layer.
    + I very often do ops on something I've just pasted
    + but I can't, until I make it a real layer -- can't do anything useful while it's floating
    + i hate when you select something and do copy visible and paste, then try to new the layer, and it won't let you because you were accidentally in a layer mask
    + can't even see it, a lot of the time.
    + vote: Does anyone have a reason to use floating selections? (+1/0/-1)
    + (+=keep floating layers(
    + Only to allow me to move the paste to the right spot before anchoring.
    + Kevin, a on canvas option for merging down a pasted layer, would fix that?
    + If floating layers were eliminated, the Anchor button in the Layers dialog could do Merge down (which would be really handy anyway).
    + suggested policy: after paste, while selection == pasted segment, show merge down
    + So a paste would always create a new layer above current selected layer but below any other higher layers? That might work but then that changes workflow to merge new pasted layer to active layer. Just need a simple way to merge the two.
    + Kevin: how do you merge them right now?
    + paste, move, anchor.
    + simple
    + anchor with keyboard or gui? both can be kept
    + Ctrl+H will merge down, and button will be replaced
    + Either. I usually use the gui as I don't always remember keyboard shortcuts
    + merge down isn't the same as anchor, in case the layer isn't visible
    + Ctrl+H: if after paste (and) selection = paste area (and) visible, merge down.
    + anchor would go away, and I guess all things achiveable in the other way would still be achievable.. but..
    + next topic?
    + How would merge down know which layers are to be merged if multiple layers exist>
    + "Layer effects" on 3.6 - can't we do that with filter layers?
    + If paste made a new layer above the current one, it wouldn't have to know anything special.
    + IMO - filter effects and layer effects are two sides of the same thing
    + bbiab
    + I thought they were both basically "make a UI for treating gegl ops as layers"
    + practically, right
    + seeing the lack of will of people to talk (and the desire to sleep for most of us), I suggest locking the meeting as discussed everything as much as we can with the current dev's attendancy
    + any topic that someone wants to raise before?
    + I am hereby declaring this gimp developer meeting, LOCKED. Next meeting, March 28th - same time, same place
    +
    +
    diff --git a/wiki/Hacking:Dev_Meeting_14_Mar_2011-20161024020553-show.txt b/wiki/Hacking:Dev_Meeting_14_Mar_2011-20161024020553-show.txt new file mode 100644 index 0000000..43875e6 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_14_Mar_2011-20161024020553-show.txt @@ -0,0 +1,390 @@ + + +Meeting page for the Developer Meeting which will take place in the GIMP IRC on March 14th 2011, 10:00 PM CET (GMT+1) + +'''Time for Next Meeting(?):''' March 28 2011, 10:00 PM CET (GMT+1). + + +__TOC__ + +==Agenda== + +===Reviewing last meeting's decision=== + +Follow up what was done and what wasn't, from the decisions of last meeting. See [[Hacking:Dev_Meeting_28_Feb_2011]] + + +===Serious discussion of GIMP's programming language=== + +There have been many questions about whether we should switch some of GIMP's code to some language other than C+GObject, where the development would be more rapid. On the list of suggested languages we saw JavaScript, Python, Vala and some more. + +There is a consensus(?) that core code was and will continue to be in C, mainly for performance reasons but not only. But now that we are starting to get some logic out to GEGL, would it make sense to change at least the language of the UI to something other than C? + +Some people vetoed this, others vetoed remaining in C - so let's discuss it! + + +===2.8 - Get it out!=== + +We are [https://bugzilla.gnome.org/buglist.cgi?query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.6⌖_milestone=2.8&product=GIMP 54 bugs] away from releasing GIMP 2.8. Lets browse hrough that list and see who can fix what, and if there are any ways in which some devs can help others to balance the load (for example, mitch is working too much!) + + +===Roadmap Review=== + +Enselic made a wonderful roadmap for gimp on [[GIMP Roadmap]]! I think we should all review this together, to make plans clear for everyone. For example, some stuff that were proposed for the upcoming google summer of code, are targeted for versions of gimp which aren't exactly "near". + + +===Anything else?=== + +Tell LightningIsMyName and he'll add it :) + + +==Decided Actions== + +See chat log - nothing organized this time... + + +==Meeting Log== +
    +
    +== Topic: GIMP developer meeting, 22:00 CET (GMT+1) March 14th 2011 | Agenda: http://gimp-wiki.who.ee/index.php?title=Hacking:Dev_Meeting_14_Mar_2011 | THIS MEETING IS BEING LOGGED! ==
    +
    + Topic 1 on the agenda
    + Reviewing last meeting's decision
    + http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011#Decided_Actions
    + old-decision 1: schumaml - any progress on wgo? I had none
    + neo hasn't replied to my mail
    + so we are stuck on this...
    + I asked him to tell me what' left to do to get automatic updates
    + ...
    + old-decision 2: Alexia and mitch take care of redirecting wiki.gimp.org
    + Both aren't attending, so it's kind of hopeless to ask for progress
    + seems as if it's not working, so let's move on
    + it's not redirecting for me
    + old-decision 3: Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + done, next
    + http://gimp-wiki.who.ee/index.php/GIMP_Roadmap
    + Enselic, anything you'd like to add to your mail? Or should we wait for the in depth discussion, which is scheduled later for this meeting?
    + yes let's be done with the old stuff first
    + old-decision 4: everybody subscribe to bug mail and TRIAGE BUGS
    + Is any of the devs here not submitted to bugmail?
    + I haven't noticed a significant increase in bug triaging
    + it's not that important... it's more important that people write code
    + we should set goals and guidelines
    + 2.8 and future are planned for the rest of this meeting :)
    + LightningIsMyName: for bug triaging
    + Enselic: regarding the roadmap, low:priority High-end CMYK support...
    + schumaml, for example? what sort of goals?
    + Enselic: I think taking the separate- plug-in given on the mailinglist and making it part of GIMPs default install is a sensible thing to do
    + pippin: let's wait with this discussion
    + LightningIsMyName: what to do with new bugs, unconfirmed bugs, long-time nedinfo
    + common sense is enough to get started, if someone does the wrong thing, more experienced bug triagers will correct it
    + don't be scared
    + :) I think this should be tightly related to the roadmap
    + just start slowly so that people have a chance to correct you if you do something wrong
    + next item on the old-action list please
    + bug don't necessarily involved the roadmap
    + but yes, next
    + old-decision 5: mitch, make a development release soo
    + epic fail, next ;)
    + mitch itsn't here, and 2.8 is topic 2 of the agenda
    + old-decision 6: LightningIsMyName takes care of next meeting
    + done, next :)
    + old-decision 7: setting pages on the wiki to discuss changes in different topics
    + now, here we have something more serious
    + can someone elaborate on the topic? I don't understand it
    + for example, the last PDB change annoyed some people, and broke many things
    + mainly scripts/plugins
    + what change?
    + these things should be discussed more in depth and not be solo work
    + schumaml, all the context related ones
    + Enselic, what's the status of the dev site?
    + the work should have been performed on a feature branch, that's the problem
    +* LightningIsMyName objects new branches - we have too many of these
    + I don't think the PDB changes broke anything but they made most scripts pop up some deprecation warnings.
    + LightningIsMyName: if you mean tasktaste.com, it's not for production use yet
    + let's revisist this topic after we're done with the old-action list
    + agreed
    + next on that list please
    + old-decision 8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday (March 5th, 2011) is hard dead line for finalizing the project list!
    + done with gsoc ideas :)
    + old-decision 9: all devs PM/Email LightningIsMyName username and email
    + any dev here without a user on the wiki?
    + yes
    + ... that wants one
    + schumaml, as the topic states - PMing me is the way to get a user
    + closed topic 1 - review old decisions
    + topic 2: Serious discussion of GIMP's programming language
    + I think this title talks for itself, but I'm afraid we have a serious lack of devs here
    + I noticed that the AdaptableGIMP guys used Vala for quite some substantial parts of their added code, and I think Vala is the language we should choose as a higher-level GIMP language
    + I was also thinking in that direction. Is vala stable?
    + I haven't had time to thoroughly test it yet unfortunately
    + is the vala language spec frozen yet?
    + do we drop scheme and python for vala then?
    + enough to get some vala code into GIMP
    + my main concern with vala is horror stories I heard on #gimp about programs that break because of vala changes
    + what are you referring to as "GIMP's programming language"?
    + no, Vala doesn't fit our gimprc files for example
    + ketas-av Kevin
    + Kevin, ui programming and other non core 
    + for "settings files", my long-term pick is JavaScript, mu short-term pick is to stick with Scheme
    + vala has the advantage of possible integrating directly with existing C gobject code
    + how hard would it be to introduce a vala dependancy for building gimp from git?
    + my plan is to rewrite GimpTag in Vala
    + (vala code can generate C code for tars)
    + Are there vala plug-in bindings already? Maybe try translating some plug-ins into vala and see how it goes before totally committing to it?
    + Perhaps you should define the problem before we trying to pick a single(?) language for the GUI and non-core stuff.
    + plug-ins != core
    + IMO Vala will be "yet another obscure language those gimp guys chose" to the general public
    + schumaml: it's very C#-ish
    + or Java-ish if you prefer. It's not an alien syntax
    + ok, let's make a list: gui, image-processing core, plug-ins
    + Would you really want to use a language in the core that wasn't supported for plug-ins?
    + gui first
    + before we decide on a language, we need some hands on experience
    + that is, we need patches that introduces Vala to the GIMP core
    + we need experimental patches for other languages too preferably
    + is there an auto* expert here?
    + (autotools)
    + I'm fairly comfortable with autotools
    + what do we want to achieve by this?
    + ketas-av Kevin
    + schumaml: increased productivity
    + by whom?
    + manually initializing vtables is a waste of time
    + Kevin, what would it take to introduce vala as a git optional dependancy
    + As I said, I think we need to define the problem first.
    + writing GOBject C boilerplate code is a waste of time
    +* LightningIsMyName more than just agrees
    + so the problem is "no C!!!"
    + no, the problem is "no  gobject!"
    + no, the problem is "stop using the wrong tool for the job"
    + I guess mayn people agree on that
    + The problem is "glib C bindings are a pain"
    + It shouldn't take much to add vala but I don't know anything about Vala and only heard pippin talk about it.
    + http://live.gnome.org/Vala
    + from a more argumentative perspective, learning to read and understand GObject with C is hard; potential contributors flee before they are able to decode what code does...
    + if we add Vala, it must not be optional. If it is optinal, we won't know if it's good enough
    + If the problem is "how to create dialog boxes in an easier and more portable method than coding in C", the solution doesn't really depend on picking a single language.
    + is Vala supported on all of our platforms, within the standard autotools chain?
    + I think that in general, having 30% of gobject files on glue code is a waste of resources?
    + schumaml: Vala generates C code
    + schumaml: vala is just a pre-processor that generates C+gobject code passed to the c compiler
    + schumaml: answer: yes
    + I'd really hate to hit a "oh, hehe, nobody uses autools on windows" pitfall
    + We need someone to fix the tutorial on native windows build. I can do it with enselic's nightlys, but direct git is a pain
    + For many situations a dialog can be designed with GUI tools such as Glade.
    + don't see it as my nightlys, it's GIMP's nightlys
    + ketas-av Kevin
    + or one of its variants to get a gtk builder file.
    + guys, this is not about a higher level language for the GUI parts, it's for the whole core
    + btw, where are the vala builds for windows and os x?
    + Few, if none, of the GIMP core objects needs to be in C
    +* LightningIsMyName did a mistake and started talking about gui
    + if any*
    + I think the PDB in GIMP and its myriad set of bindings is a problem in this regard.. what we are talking about is not yet another language with bindings to the PDB either...
    + Enselic: That is why I thought we should clearly define the problem of needing to pick some language first. :-)
    + Kevin: again, the problem is that one is not productive in C
    + Productive doing what?
    + getting your computer to do what you want
    + ketas-av Kevin
    + Kevin,  30% glue code for gobject
    + Works fine for me.
    + getting the GIMP core do what you want*
    + and in small files, up to 60%
    + if gegl ops didnt use chanting, they would be ~50 lines longer
    + with a lot of repetition
    + IMO any language would be good, if we decide to make it the default for scripts and plug-ins too and drop anything else from the default installs
    + the good part of vala, is that it can integrate with things we have - so the transition could be gradual
    + I don't run in to gObject in scripts and plug-ins. I've only seen it in GEGL.
    + it seems like we agree that Vala probably is the best choice to fix the problem of too much GObject C boilter plate in the core, the next step is writing some actual Vala code
    + so, not hearing any real suggestions for other core languages - I'm closing this topic as:
    + 1. All devs take a look at vala, and try to mess with it
    + The next thing is finding someone who has heard of Vala and knows something about it.
    + 2. Someone tries some actual patch
    + ketas-av Kevin
    + Kevin, I played a bit with vala
    + so, any other additions on this subject? Any other languages?
    + I'm already trying to get more of a handle on C# for another project I'm working on and I also am looking more at Python. I don't need to deal with another (obscure?) language right now.
    + Stupid question: would this be in the 2.8 timeframe, or 3.0, or what?
    + javascript can work quite nicely, using the same/similar api meta data binding generation that vala relies on
    + vala is low-prio
    + compared to high-prio things on our roadmap
    + so tagging vala as a "hack if you want" on the roadmap?
    +* pippin is playing with the idea of resurrecting a proper example GEGL ui front-end, and would be trying to avoid doing that in C
    + I don't think we should keep it on the roadmap, the roadmap should be high-level enough for users to digest
    + things there should matter for users
    + I think there should be a "dev roadmap"
    + pippin: Python and wxWindows? :
    + LightningIsMyName: we don't need to put this on any roadmap imo
    + Kevin: I wouldnt exclude python,. but wxwindows is out of the quesiton
    + this meeting log is good enough
    + ok :) so let's move on
    + topic 3: 2.8 - Get it out!
    + Enselic did a very serious clean of bugs for 2.8
    + first of all, things on the 2.6 milestone don't block a 2.8 release
    + Enselic, what were the things you filtered off?
    + (other than 2.6 specific bugs)
    + I didn't touch any bugs on the 2.6 milestone, only on the 2.8, 2.10 and 3.0 milestones
    + isn't it a bit premature to change milestones on bugs set for 2.10 and 3.0?
    + we have a roadmap
    + I'm going to ask a possibly "non popular" question - if we get 2.8 out, can we tell 2.6 only bugs (that don't appear on 2,8) to go to hell?
    + our priorities are set, so I don't see how it was premature
    + Enselic, roadmap is the next topic on the list - I think there is place to discuss it
    + LightningIsMyName: one we have released 2.8, I plan to go through the 2.6 bugs and remove them if they are not important
    + LightningIsMyName: ok
    + once we have*
    + Is it acceptable to "discard" such bugs in open source?
    + with "remove" I meant "remove from milestone"
    + we fix what's important and what matters, we don't have resources to fix more things than that
    + why would you do that. isn't it enough to resolve them as wontfix?
    + a bug is still a bug and should be in our bugtracker
    + it is
    + As a part of this topic, I also mentioned helping other devs.
    + Are there any devs here blocked by others, other than gui specs?
    + again, we're not blocked by gui specs...
    + afaik
    + gui specs should have recieved "blocked"
    + speaking of gui, guiguru - do we/us/you have gimp interns?
    + are we done with "2.8, get it out"?
    + not yet
    + Enselic, you said you'll work on swm, right?
    + I will, yes
    + Is there any load of the work that other devs can take off from that project?
    + something which does not require deep hacking of the display?
    + not really no
    + so yeah, we are done :P
    + topic 3: Roadmap Review
    + http://gimp-wiki.who.ee/index.php/GIMP_Roadmap
    + all devs and *users* please take a look
    + um "*users*"? ;)
    + ... I think taking the separate- plug-in given on the mailinglist and making it part of GIMPs default install is a sensible thing to do ...
    + Enselic, roadmap is also about community :)
    + pippin: yes, but for 2.10, we must not add more features to 2.8
    + LightningIsMyName: fair enough
    + I am referring to the statement on the roadmap that CMYK is low priority
    + quick question - why do we have 2.10?
    + well, existing patches have high priority
    + core developers *really* want JavaScript support?
    + LightningIsMyName: in particular because mitch wants to adjust the libgimp API before 3.0
    + ketas-av Kevin
    + Kevin, not me
    + mitch has already stated more changes to the api are in the works.
    + Has mitch discussed these api changes anywhere?
    + I haven't seen anything specific before it happened :P
    + I don't remember much of the discussion of the changes that have been made already.
    + not that I know of, but what he has done so far has been sensible
    + I'm not 100% certain about the sensible part.
    + hehe
    + Kevin: what changes would you consider controversial?
    + Moving parameters out of the procedure call and making this context set of api calls seems odd and might have broken some scripts. It remains to be seen how that is going to work out.
    + ketas-av Kevin
    + Kevin: so you like functions with 10 parameters?
    + Kevin, that actually makes sense - allow adding more parameters in the future
    + I am not sure if the default context values will be the same as the values previously used by scripts.
    + Enselic, win32 api calls can have 20 :P
    + ketas-av Kevin
    + Kevin, has a point there - I'm also worried about that
    + I think we should add something like (gimp-context-reset "2.8")
    + why are you not sure?
    + I'm still not happy about the gimp-flip that used to be simple but now takes about a half dozen parameters to do a simple flip in either H or V directions.
    + isn't it as simple as, instead of   f(a, b, c); it's now f(b); f(c); f(a); ?
    + I have two other things I need to get done then I'll get back to reviewing pending patches for Script-Fu scripts. After the changes are commited, it will mean having to get someone(s) to test all 100 scripts to make sure the move to context didn't break something.
    + I think this is something we can use all the non programming users that wanted to help for
    + Kevin: that situation is a good argument for making sure new code gets regression tests written too
    + I don't think we can write such tests for script-fu
    + gimp-flip used to take drawable and a direction. Now its replaced by gimp-drawable-transform-flip-simple which requires 5 parameters
    + LightningIsMyName: of course we can, it's software we're crafting
    + :)
    + How do we write regression tests for scripts with random output?
    + Kevin: so write a simple wrapper function that you use in your scripts?
    + LightningIsMyName: seeding+
    + ?
    + A change that can affect parameters used in operations make it hard to write regression tests that would ensure scripts will still do what they used to do.
    + I think that adding (gimp-context-reset "2.8") for a different versions is an asap requirement for allowing such wrapper functions
    + back to the roadmap, shall we?
    + yes please
    + Every script will need to push and pop context but IIRC, the script gets a copy of the existing context which may or may not have all the context settings as the default so a script may not work the same as before.
    + Move JavaScript to low priority?
    +* guiguru was afk
    + Enselic, how can "Automatic layer boundary management" be scheduled for 3.2, and also proposed as a gsoc this year?
    + LightningIsMyName: interviewing 2 interns this week
    + guiguru, great!
    + LightningIsMyName: the roadmap is not set in stone
    + LightningIsMyName: if code is ready, we merge it in
    + so let's discuss it(=roadmap).
    + I'll begin with 2.10
    + doing a release just for bugfixes and libgimp changes?
    +* guiguru signs off
    + LightningIsMyName: and the CMYK plug-in, and new layer modes
    + Its the last chance to get in any remaining API changes before 3.0
    + LightningIsMyName: and other things that will drop in
    + I'm willing to move JavaScript off the milestone btw
    + The move to 3.0 includes integrating gegl as the core of everything, right?
    + I've moved JS off the roadmap now
    + LightningIsMyName: we will store image data in GeglBuffers, yes
    +  Enselic: ok. You could have moved it to low priority as its also currently a GSoC idea
    + I was urged by many photographers whom I know, to ask this to be done earlier. Not that I can do anything about it, but I'm raising this here
    + GIMP 3.4 - "Auto-anchoring of floating selection"
    + can someone explain me why do we need floating selections? it's more of a trouble than anything else
    + what happened to 3.2?
    + ketas-av Kevin
    + Kevin, no objection on 3,2 goals, I think :)
    + :-)
    + Why can't pasting be above the current layer or at the top (different shortcuts) and we simply get rid of floating selections?
    + I'll lie if I say that I used these more than once in a month, and I use gimp daily as a user
    + then how would you move what you pasted, if it's not a new layer?
    + How do other programs handle pasting? How would you be able to move a pasted thing in to position?
    + I don't even use them that often, and I spend a lot of time trying to explain them to users who don't understand them.
    + Mikachu, paste a new layer would paste above the current layer. then simply move
    + merge would be easy
    + What about automerge of the paste to current layer when tool changes from the move tool?
    + ketas-av Kevin
    + Kevin - other ops may be needed on pastes - not sure that's the right criteria. but we can work something out
    + The tool won't normally be the move tool to begin with.
    + should we default to non-destructive solutions if possible?
    + ,. this is ux/guiguru territory, but we do know we want to get rid of the floating selection
    + You might want to paste then scale, paste then levels/curves/brightness, ...
    + Paste something, move tool is selected, you move it then after changing tool, it merges. It would be predictable behaviour. Just have to decide which steps push Undo's
    + I think getting rid of floating selection is easier than continuing to support it when moving to 3
    + What if you don't want it to merge?
    + I always want pastes to be a new layer.
    +* Enselic signs off
    + Paste as new layer. 
    + bye Enselic ;)
    + paste as new layer is a possible valid option
    + The only problem is pasting on a channel, everything else doesn't need this
    + but we're discussing 'move to new layer'
    + I usually want to paste to current layer and move the paste before anchoring. I don't tend to do other ops on a floating layer.
    + I very often do ops on something I've just pasted
    + but I can't, until I make it a real layer -- can't do anything useful while it's floating
    + i hate when you select something and do copy visible and paste, then try to new the layer, and it won't let you because you were accidentally in a layer mask
    + can't even see it, a lot of the time.
    + vote: Does anyone have a reason to use floating selections? (+1/0/-1)
    + (+=keep floating layers(
    + Only to allow me to move the paste to the right spot before anchoring.
    + Kevin, a on canvas option for merging down a pasted layer, would fix that?
    + If floating layers were eliminated, the Anchor button in the Layers dialog could do Merge down (which would be really handy anyway).
    + suggested policy: after paste, while selection == pasted segment, show merge down
    + So a paste would always create a new layer above current selected layer but below any other higher layers? That might work but then that changes workflow to merge new pasted layer to active layer. Just need a simple way to merge the two.
    + Kevin: how do you merge them right now?
    + paste, move, anchor.
    + simple
    + anchor with keyboard or gui? both can be kept
    + Ctrl+H will merge down, and button will be replaced
    + Either. I usually use the gui as I don't always remember keyboard shortcuts
    + merge down isn't the same as anchor, in case the layer isn't visible
    + Ctrl+H: if after paste (and) selection = paste area (and) visible, merge down.
    + anchor would go away, and I guess all things achiveable in the other way would still be achievable.. but..
    + next topic?
    + How would merge down know which layers are to be merged if multiple layers exist>
    + "Layer effects" on 3.6 - can't we do that with filter layers?
    + If paste made a new layer above the current one, it wouldn't have to know anything special.
    + IMO - filter effects and layer effects are two sides of the same thing
    + bbiab
    + I thought they were both basically "make a UI for treating gegl ops as layers"
    + practically, right
    + seeing the lack of will of people to talk (and the desire to sleep for most of us), I suggest locking the meeting as discussed everything as much as we can with the current dev's attendancy
    + any topic that someone wants to raise before?
    + I am hereby declaring this gimp developer meeting, LOCKED. Next meeting, March 28th - same time, same place
    +
    +
    diff --git a/wiki/Hacking:Dev_Meeting_19_Apr_2011-20190507091738-show.txt b/wiki/Hacking:Dev_Meeting_19_Apr_2011-20190507091738-show.txt new file mode 100644 index 0000000..63e9bf0 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_19_Apr_2011-20190507091738-show.txt @@ -0,0 +1,38 @@ + + +Meeting page for the Developer Meeting which will take place in the GIMP IRC on April 19th 2011, 20:00 UTC (For time zone conversions, see [http://www.timeanddate.com/worldclock/fixedtime.html?msg=GIMP+Developer+Meeting+%234&iso=20110419T20 here]). '''Developers who mentor at GSoC, and all other admins involved in GSoC, must arrive 20 minutes earlier''' to a final meeting and "clicking some buttons" ;) + + + + + +__TOC__ + +==Agenda== + +===GSoC final meeting - GSoC Mentors Only!=== + +As Alexia_Death stated, developers will meet 20 minutes before the official meeting in order to finish the process of handling GSoC student applications. + + +===GIMP 2.8=== + +Congrats for the new GIMP 2.7.2 release :) +Now this obviously leads to the discussion of what next? What can we do to speed up 2.8? Some devs asked how can they help on Single-Window-Mode (SWM) and there were also some more questions. The more devs attending this meeting, the more complete will be the image of what we have left to do. + + +===Anything else?=== + +Reply on the mailing list or email LightningIsMyName, and it will be added. (Developers, feel free to add topics and/or edit existing ones) + + +==Decided Actions== + +To be filled once the meeting ends + + +==Meeting Log== + +Will try to record and upload once the meeting is done + + \ No newline at end of file diff --git a/wiki/Hacking:Dev_Meeting_20_Apr_2011-20200806134821-show.txt b/wiki/Hacking:Dev_Meeting_20_Apr_2011-20200806134821-show.txt new file mode 100644 index 0000000..63e9bf0 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_20_Apr_2011-20200806134821-show.txt @@ -0,0 +1,38 @@ + + +Meeting page for the Developer Meeting which will take place in the GIMP IRC on April 19th 2011, 20:00 UTC (For time zone conversions, see [http://www.timeanddate.com/worldclock/fixedtime.html?msg=GIMP+Developer+Meeting+%234&iso=20110419T20 here]). '''Developers who mentor at GSoC, and all other admins involved in GSoC, must arrive 20 minutes earlier''' to a final meeting and "clicking some buttons" ;) + + + + + +__TOC__ + +==Agenda== + +===GSoC final meeting - GSoC Mentors Only!=== + +As Alexia_Death stated, developers will meet 20 minutes before the official meeting in order to finish the process of handling GSoC student applications. + + +===GIMP 2.8=== + +Congrats for the new GIMP 2.7.2 release :) +Now this obviously leads to the discussion of what next? What can we do to speed up 2.8? Some devs asked how can they help on Single-Window-Mode (SWM) and there were also some more questions. The more devs attending this meeting, the more complete will be the image of what we have left to do. + + +===Anything else?=== + +Reply on the mailing list or email LightningIsMyName, and it will be added. (Developers, feel free to add topics and/or edit existing ones) + + +==Decided Actions== + +To be filled once the meeting ends + + +==Meeting Log== + +Will try to record and upload once the meeting is done + + \ No newline at end of file diff --git a/wiki/Hacking:Dev_Meeting_20_Apr_2011-20210416105655-edit.txt b/wiki/Hacking:Dev_Meeting_20_Apr_2011-20210416105655-edit.txt new file mode 100644 index 0000000..91fae2c --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_20_Apr_2011-20210416105655-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Hacking:Dev Meeting 19 Apr 2011]] diff --git a/wiki/Hacking:Dev_Meeting_28_Feb_2011-20150911044138-edit.txt b/wiki/Hacking:Dev_Meeting_28_Feb_2011-20150911044138-edit.txt new file mode 100644 index 0000000..77930af --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_28_Feb_2011-20150911044138-edit.txt @@ -0,0 +1,488 @@ +Meeting page for the Developer Meeting which took place in the GIMP IRC on February 28th 2011, 10:00 PM CET (GMT+1) + +'''Time for Next Meeting:''' March 14 2011, 10:00 PM CET (GMT+1). + +__TOC__ + +==Agenda== +===GSoC 2011 - ORG Application deadline is in 11 days!=== +We need to discuss the list of ideas that were raised on the mailing list. See http://old.nabble.com/Google-Summer-of-Code-2011---Project-Ideas-Suggestions-to30911798.html +for GEGL, see http://gegl.org/contribute.html + +===Bug fixing priorities=== +We won't get 2.8 or 3.0 out unless we start doing concentrated bug fixes. We should set a priority list and try to stick with it, even if working on other stuff is more fun. + +===Future development?=== +Some serious PDB changes are going on now, potentially many of these will be relevant for 3.0. This is worth a discussion, but not necessaraly today. + +===Make an official wiki working again (i.e. make wiki.gimp.org pointing at it)!=== +Can be done by making http://gimp-wiki.who.ee/ the official wiki - we need it to apply for GSoC, write roadmaps, etc. With all respect for bugzilla, discussions should be done in some more apropriate page. + +===Make a roadmap on the official wiki=== +Self explanatory. + +===Try and decide on clear release policy for beta builds=== +I personally would like to see more recent beta releases, and the last one was 7 months ago! + +===Schedule meetings?=== +Depending on the success of this one, we should possibly start doing this regularly. This was tried in the past, and we'll try to do this again. + +===Anything else? === +Tell LightningIsMyName and he'll add it :) + +Random thought: Add an option to support gegl plugins with a gui nicely, for 2.8, so that users will start developing plugins for 3.0 in GEGL? + +==Decided Actions== + +# schumaml and LightningIsMyName fix wgo? +# Alexia and mitch take care of redirecting wiki.gimp.org +# Enselic makes a draft of a GIMP roadmap and sends to gimp-developer +# everybody subscribe to bug mail and TRIAGE BUGS +# mitch, make a development release soo +# LightningIsMyName takes care of next meeting +# setting pages on the wiki to discuss changes in different topics +# LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday (March 5th, 2011) is hard dead line for finalizing the project list! +# all devs PM/Email LightningIsMyName username and email + +==Meeting Log== +
    
    +
    +== Topic: GIMP developer meeting, 22:00 CET (GMT+1) February 28th 2011 | Agenda: http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011 | THIS MEETING IS BEING LOGGED! ==
    +
    + Let's start :) Please take a look at the Agenda, as pointed by the topic, and read it
    + The most burning issue for todays meeting, is potentially GSoC this year
    + We have 10 days to apply, and we still don't have an organized ideas list or a mentors list
    + Do we want to participate?
    + I would suggest that the bigger issue is one of overall organization, and that the GSoC issues and the release issues are a consequence of that
    + xsdg, you are probably right, but I don't know if we have time to fix all these before the application deadline
    + As far as GSoC itself, if mentors want to step forward, great.  I have neither the knowledge nor the time.  I'm not sure there's anything non-mentors can really do about it
    + we could potentially lower the bar for mentoring, but that's probably not such a great idea.  It'd probably be more valuable (if mentors don't step forward) to deal with the higher-level issues and think about it again next year
    + mitch, I know you offered to mentor "since you do it anyway". Now, is it serious and you have time, or was that just a cynical comment?
    + i meant it, but i'm not going to mentor a particular student
    + i will help when i'm on irc
    + mitch gives channel operator status to Mikachu
    + we should hear schumaml on that issue, he's been doing gsoc orga all the years
    + schumaml - your opinion?
    + I won't force anyone to become a mentor
    + so my estimate is that if nobody steps up and organizes things, gsoc this year will not happen
    + if some of the previous mentors want to do it again, then I'll take care of the orga again
    + Alexia wanted to mentor again afail
    + schumaml, does GSoC require specific mentors for each project, or can we have general mentors?
    + specific mentors
    + each student is assigned one mentor
    + and this mentor is responsible for all administrative stuff concerning that one student
    + e.g. evaluations
    + Taking a look at the list of projects, does anyone have something which is urgent and GSoC could probably help more than regular development?
    + I.e. is there something a student can take care of which is critical?
    + should we decide not to apply as an org, then mentors could approach gnome ans ask to mentor gimp or gegl-related tasks
    + not really, otherwise it wouldn't be critical :)
    + (switching machine)
    + Let's jump for a second - what's on the top of the todo list?
    + Except for fixing bugs
    + generally getting 2.8 out
    + I can't see a clear roadmap anywhere, and that prevents me from knowing what to work on
    + I'd like to have an auto-updating main website again
    + schumaml: you just volunteered
    + we should switch to a wiki so it's not a big project to keep the website up to date
    + I volunteer to try and do website fixes if needed, the question is what do we want from auto-updating website?
    + a wiki for the main site?
    + It was discussed previously today to point wiki.gimp.org at alexia's wiki. Any objections?
    + most parts of the main site
    + i don't think so, both for reasons of load and security, as pointed out on the list
    + not news for example
    + LightningIsMyName: not from me
    + I think Alexia got a point about not introducing dynamic systems to www.gimp.org
    + we could have non-free-for-all registration
    + Enselic: giving out accounts is a prerequisite
    + The registration to alexia's wiki is aprooved only by me and her, to avoid spam
    + no self registration
    + we discussed that earlier today - as long as there is any script involved, the site is exploitable
    + LightningIsMyName: could I get an account?
    + Each dev who creates an account (see the topic) and email me, will get an editing permission on the wiki
    + and believe me, www.gimp.org would be a priority one target
    + who has the control over the domain names?
    + snorfle
    + snorfle?
    + shawn admunson(?)
    +* Kevin waves hello
    + so let's focus in wgo for a moment
    + schumaml: since you see it as priority, what about mailing sven about an account, and simply fixing it? sven doesn't have the time
    + I don't know what is missing, all I know is that commits to gimp-web aren't pulled and shown within minutes
    + I don't know if I can fix it, but I'
    + Sounds like you need Jenkins for the wgo
    + ll try to do this
    + i don't know either, but sven can point you to a starting point
    + I volunteer to try and help on that, if I'll have an account on gimp.org
    + fine with me
    + so action #1: schumaml and LightningIsMyName fix wgo?
    + fine with me
    + yes
    + If there is a script to build the wgo pages from a repo it just needs to be run by a cron job as a simple way to fix the problem.
    + question 2: who can request re-direction of wiki.gimp.org to alexia's wiki?
    + i think the problem was commit hooks or something that would send a mail from the old svn server to foo and then bar would happen
    + mitch: That would be the better way instead of a cron job
    + Kevin: that's how it worked before
    +* LightningIsMyName points back at redirecting wiki.gimp.org
    + LightningIsMyName: ideally, that wiki would be moved to the machine gimp.org runs on
    + I think we can add a daily cron job as a fallback at least
    + who currently owns/maintains the DNS entries for g.o?
    + it's really big enough
    + Kevin: as said, snorfle
    + didn't we just say we don't want that for security reasons?
    + LightningIsMyName: it could run in a chroot, or a vm, as sven said
    + so we'll need someone who can mess with servers more than I know to do that
    + I guess we need emergency response plans anyway?
    + unless we have someone who volunteers to do that, that's ain't practical
    + but for the time being, a redirect would be better than the current situation
    + agree
    + +1
    + i.e. what to do if somethings seems fishy with any gimp.org?
    + mitch: can you talk to snorfle about that?
    + I have no problem working on servers
    + snorfle?
    + Kevin: gimp.org DNS admin
    + Kevin: snorfle is a person
    + Shawn Amundson?
    + Enselic: sure, if alexia provides me with details, i'll take care of that
    + action #2: Alexia and mitch take care of redirecting wiki.gimp.org
    + pippin: precisely
    + mitch, the link is at the topic, alexia is back, just joined #gimp
    + yes, I see Shawn. Snorfle has some interesting meanings in the Urban dictionary
    + Ok, next topic "Make a roadmap on the official wiki"
    + Big topic
    + I can take care of that
    + I just need an account
    + we first of all need 2.8 goals asap
    + Enselic, create one now, I'll give your permissions
    + that's easy, look at https://bugzilla.gnome.org/buglist.cgi?product=GIMP&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&target_milestone=2.8 and work on what's important ;)
    + LightningIsMyName: that would basically be "fix all milestome bugs" and "clean up open ends"
    + it's not *that* much to do actually
    + guiguru, are you here? Some bugs there are dependant on you
    + I guess so
    + LightningIsMyName: how do I register?
    + guiguru: what are the chances we can start seeing specs soon?
    + Enselic, one sec
    + LightningIsMyName: specs are not blocking us, we'll do our best if we don't get specs
    + we can't wait forever
    + but we can fix things afterwards forever
    + Enselic, http://gimp-wiki.who.ee/index.php?title=Special:UserLogin&type=signup
    + LightningIsMyName: high
    + and spec <-> impl is always a loop, so just get started
    + Apart from SF deprecation issues, there are two minor enhancements it would be nice to have in there before 2.8 (getenv and create a directory procedures)
    + LightningIsMyName: priv msg
    + Enselic: are the priorities on that list accurate?
    + xsdg: no
    + Enselic: how hard would it be for them to become accurate?
    + that would be a big help, I think
    + bugzilla priorities are noise only for the most part
    + (I've certainly looked at that list and not known what to focus on)
    + xsdg: you can pick any of them
    + xsdg: just pick *any* bug that seems doable
    + are they all 2.8 blockers?
    + even non-milestone bugs, as long as the patch fixes something :)
    + no, some of them we will ship without
    + Enselic: it would be useful to know the difference between the two classes, then
    + I'm going to clean that list up once I get my site up and running
    + xsdg: The higher priority ones would be ones with 2.8 as their target milestone
    + Kevin: all of the things on that list are milestone 2.8
    +* LightningIsMyName points at "Random thought: Add an option to support gegl plugins with a gui nicely, for 2.8, so that users will start developing plugins for 3.0 in GEGL?"
    + I'm not sure which list you are looking at
    + is this practical?
    + Oh, that list.
    + and really, evetybody can help by simply subscribing to bugmail and at least *triaging* new bugs
    + action #3, Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + come on guys, it's not that hard
    + next item on the agenda: "Try and decide on clear release policy for beta builds"
    + Sure. Just mark them all as RESOLVED, WONTFIX  ;-)
    + mitch, Enselic: if our first goal is to get 2.8 out the door, we need to focus on the things which will allow us to accomplish that
    + how did that agenda point come up?
    + LightningIsMyName: that is part of the random non-roadmap which is http://gegl.org/contribute.html
    + I don't know, but I think we should have nightly binary builds so we don't need to worry about that
    + oh "beta build" is what we call a devel release now
    + mitch: regarding subscribing to bugmail, would be good for there to be a way for people to learn about that
    + we have nightly tarball builds, it's not that hard to make binary builds from that
    + i can make one easily within the next 2 weeks or so
    + now that gegl is out
    + I can have nightly builds of gtk+babl+gegl, but I need some FTP to host them
    + +gimp
    + Enselic: imho that can exist and is good, but advertizing it too much will feed the trolls
    + LightningIsMyName: host them here ftp://gimptest.flamingtext.com/pub/nightly-tarballs/
    + how will we deal with nightly builds in bugzilla?
    + mitch: "feed the trolls"?
    + how?
    + Enselic, need to check with ftcameron. I'll email him to see it's OK
    + a lot of "testing" from the clueless, and even more useless bugs
    + LightningIsMyName: you don't need to, I am admin on that machine
    + schumaml: I think, possibly as a separate action item somewhere, we need to spend a bit more time making bugzilla more useful
    + bug reported against 2.7.x-git20110316
    + schumaml: precisely
    + mitch: or more useful bugs
    + schumaml: that would likely include updating the templates, making sure the defaults are useful, and not letting people edit the ones they tend to enter incorrectly
    + Enselic: nobody is even triaging new bugs around here
    + so action 3: everybody subscribe to bug mail and TRIAGE BUGS
    + If I may interject, nightly builds might also attract developers, if you advertise it.
    + it's not that important, is it?
    + mitch: are there any guidelines for triaging bugs?
    + Enselic: "it" -> ???
    + xsdg: look at them, understand them, judge them
    + Enselic: triaging bugs?
    + mitch: what does that mean?
    + unimportant bugs that is
    + xsdg: Read them, does it make sense, can the problem be reproduced, does it need more input from reporter
    + xsdg: it's not that hard, most are either reproducable or needinfo
    + I have a document on making useful bug reports, is it possible to link to it in the submission form
    + ?
    + Enselic: deciding which are important == triaging :)
    + I ignore == I think it's not important
    + or duplicates
    + lots of duplicates
    + xsdg: check for duplicates, ask questions and set to NEEDINFO, close useless crap right away
    + mitch, Kevin, schumaml: that's more than I knew 10 minutes ago.  As obvious as this may seem, these instructions need to go somewhere.
    + Right. also checking if bug has already been reported.
    + it doesn't help if they only exist in your heads
    + xsdg: gnome has bug triaging guidelines
    + gnome should have general documentation for triaging available
    + If a patch has been supplied, does it look right, does it apply to the current (git master) source tree.
    + xsdg: get a wiki account and start a page :)
    + anyway.... action #4: mitch, make a development release soon
    + Enselic: fine with me
    + mitch: I'm currently at work; not going to happen
    + mitch: 
    + mitch: thanks
    + next item on the agenda "Schedule meetings?"
    + Enselic, sure! I want to learn to make a release, I'm going to be increasingly active this year
    + LightningIsMyName: there is a release-howto in devel-docs
    + The agenda isn't exactly ordered
    + LightningIsMyName: make distcheck is a start
    + I think there are some other things which should be discussed
    + make distcheck is run each night...
    + meetings? yes. late, like 10pm. interval?
    + the question is if we want to get techinical today or some other time?
    + Enselic: action #5: enselic to finally return ;)
    + I think that a bi-weekly meeting cycle would be productive
    + I'm afraid my girlfriend has infected my mind, I see a future of less GIMP activity :/
    + LightningIsMyName: you are more than welcome to push that
    + but it's a good kind of infection
    + mitch - I am trying :)
    + I like being infected
    + Enselic: turn her into a hacker
    + mitch: haeckse
    + meeting: not that often, every 2 months?
    + Definitely a good type of infection to have
    + Also, I'm going to add another topic which I saw in comments of some users
    + They said we should sort of advertise gimp, by promoting the new features officially instead of just developer blogs
    + two months is too long, imo
    + if you want regular meetings someone will have to set an agenda for the meetiings
    +* pippin would like to have the meetings in #gimp instead of here
    + LightningIsMyName: if wgo was working, much of that would happen
    + show more activity on the main website, possibly with features videos, to attract devs
    + pippin: i disagree
    + Let's all pause; I think everyone's talking about a different thing
    + What are we discussing right now?
    + pippin just want the pleasure of telling people to shut up
    + heh
    + right now the topic is "Schedule meetings?"
    + Boys, calm down ;) we were talking about scheduling meetings
    + LightningIsMyName: you seem to do a pretty good job, just go ahead with regular meetings
    + mitch: +1
    +* pippin already has >30 tabs in his irc client, would prefer not to have more
    + you can close this one soon
    + 30??
    + We need to get some technical meetings, and not just one like these
    +* LightningIsMyName reminds people to stay on topic
    + some people objected the recent PDB refactors
    + and there are some more changes that need to be dicussed
    + technical meetings can be done by groups of interested people
    + LightningIsMyName: this is a good start already, we can'T get technical with hald our infrastructure down
    + action #6: LightningIsMyName takes care of next meeting
    + I like how the blenders devs hijack their regular channel, use /topic to force people staying on topic stating which part of the agenda they are on, etc. :)
    + half*
    + pippin: offtopic
    + :-)
    + mitch: it is on topic on the topic of scheduling meetings
    + action #7: setting pages to discuss changes in different topics
    + next item on agenda: "Anything else? "
    + LightningIsMyName, promoting features officially is not a problem
    + prokoudine_, you volunteer?
    + LightningIsMyName, I write news for gimp.org anyway
    + good to know - the news are anonymous :)
    + LightningIsMyName: will you put the log and the collected actions up in the wiki?
    + yes. btw, we still haven't finished one topic
    + Are you only going to promote new features after they are complete?
    + i know :)
    + We didn't decide a thing about GSoC
    + do we apply this year for something?
    + I agree to be a student, and there will be probably many other applications
    + there will be student interest, so it's a shame to miss the coding work
    + LightningIsMyName, and will you mentor yourself? :)
    +* pippin does not want to have direct responsibility of any student, wbut will aid in helping any strudent working on gegl or gegl related projects
    + Alexia would mentor, I guess
    + Kevin ketas-wi
    + ketas-wi, you are Alexia, right?
    + LightningIsMyName: i would mentor you :) but not some random fool
    + I've asked Akkana as well, she could do a beginner task provided that it will end up in gimp if finished
    + LightningIsMyName, he is not
    + btw, sorry for last years gsoc.
    + I took myself off the mentor list but I could sign up again if there was something I might be able to help with. Last couple of years there hasn't been.
    + gwidion, just finish the project, will you? :)
    + my student would do even less things than what i 'd  ask her
    + LightningIsMyName: which would be self-mentring, but google's formalities followed, and i'd be around for any questions of course
    + is there any project which we want to feed me/some-other-jobless-student for the summer?
    + Rewrite gimp-perl  :-)
    + LightningIsMyName: see http://gegl.org/contribute.html
    + fix pygimp
    + If Enselic does not expect to find more time for gimp dev soon, having someone else work on single-window mode is pretty critical for 2.8
    + jonnor, you are very right about that
    + it is afaik, the one big thing blocking it
    + time-critical things have not been good for gsoc projects in the past
    + jonnor: i'm afraid that particular job will stick with me anyway
    + jonnor: that and more-than-8-bits
    + Ankh: that is not for 2.8?
    + can we release 2.8 with gtk+ 2.x at all?
    + Ankh: that's not a gcos project
    + Anything potentially 3.0 targeted, that will not need re-writing later?
    + Question: do we have a time goal for shipping 2.8?  I would say "december 31, 2011 at the very latest"
    + gsoc
    + mitch: agreed
    + mitch: Anything that can be taken off your plate and pushed to someone else to free up your time for SWM?
    + so, i have a general issue now that 3.0 came up
    + neither swm nor ?8bit is gsoc I fear
    + i figured that we will likely *never* get proper xinput back with gtk 2.x
    + so might i suggest something:
    + and tablet support is broken on windows, too
    + 2.x -> 3.x migration:
    + I'm also curious why ruler widgets were removed from gtk
    + prokoudine_: My intentio is to "finish" the other Gsoc - jsut gimp python which was never integrated into trunk.
    + - deprecate as much as humanly possible in the 2.x api and replace it by stuff that is 3.x-able
    + xsdg: we don't know, but will know within a few months
    + - after 2.8 is out, have a short devel cycle
    + gwidion, that's what I was referring to -- python project
    + not /src/gimp/gkt+ like gap and ffmpeg? moving targets and all....
    + - gfet 3.0 out
    + schumaml, does a ORG need to supply a list of projects in his application? If so, does google choose between these, or the ORG?
    + LightningIsMyName: the _student_ has to propose his own project, potentially inspired by the orgs list
    + Enselic: I would suggest that we set a hard deadline sometime, and commit to shipping by that date.  Otherwise we end up having this discussion next March
    + xsdg: that's not going to work
    + mitch: so 3.0 would be just the gtk+ change?
    + Part of the release date issue is having a defined set of things to work on and getting those things done.
    + schumaml: plus really nicely working tablet hotplug and stuff
    + schumaml: and it's a big change
    + schumaml, would you take care of our GSoC application this year? I'll organize a list of projects, and I'll put it on for review by the devs? Link will be on the mailing list tomorrow
    + s/just //
    + btw, all devs that want a wiki account, PM me a username and an email
    + Enselic: Suppose that GIMP hadn't advanced March of next year.  Should we not release the stuff that's already done by that point?
    + Enselic: what's in git already has value over the latest thing that's been released
    + (that is, excluding dev releeases)
    + Enselic: do we want people to sit on 2.6 forever?
    + oh, well. 
    + I still have 2.6 on my machine.
    + xsdg: if they need tablet support, then probably yes
    + xsdg: the harm is done, people expect swm, we will get a lot of badwill if we ship without
    + xsdg: then just get started doing some hacks, roadmaps and hard dates don't help much on their own
    + shure
    + Enselic: is that worth people sitting on 2.6 for another year?
    + I want to see 2.8 out soon, it's pretty stable at least for my everyday workflow. Better release and stop blocking ourselves, than blocking ourselves and the users
    + So it will a bit incomplete - legitimate for an end of cycle product
    + mitch: I've been on a project that died because they couldn't release (geeqie).  I'm hoping it doesn't happen to gimp
    + Enselic: you just have to take a week off from work and emma, and hide in a rødmalt stuga...
    + Enselic, what is exactly blocking simple swm?
    + One user reported working in SWM mode and felt it was working ok.
    + LightningIsMyName: yes, please collect a list of projects
    + Enselic, without image parade, I mean
    + see milestoned bugs...
    + prokoudine_, it's not session managed
    + LightningIsMyName: google uses this to judge whether an org is ready for gsoc
    + LightningIsMyName, any estimations time-wise?
    + prokoudine_: what is the problem about image parade? i could hack that in one week
    + mitch, no spec?
    + image parade?
    + prokoudine_: not a problem, i have a mind
    + mitch, then go for it? :)
    + mitch: this is why we need priorities
    + mitch is supposed to be working on SWM  ;-)
    + that will leave us only broken tablets
    + prokoudine_: if you noticed, i'm already the main committer and my time is limited ;)
    + mitch, I have :) I track it
    +* pippin thinks mitch should focus on killing off 8bit :P
    + and other swm things are far worse
    + action #8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday is hard dead line for finalizing the project list
    + do we have any unassigned action items?
    + pippin: irrelevant for 2.8
    + mitch: btw, at some point you need to stop rebasing the gtk3 branch and merge master to it instead
    + regularly
    + "gimp developer(s) continue to ignore higher bitdepths" ;)
    + Enselic: clearly not
    +* LightningIsMyName points at action #8
    + i don't think that's a meeting topic
    + schumaml: I would suggest that we have people initially prioritize things on the 2.8 milestone
    + i want a sane history
    + mitch: how are more than you supposed to be able to work on it then?
    + pippin: "which sounds better than gimp developers continue not releasing"
    + schumaml: I'm willing to help with that, but I don't feel I know enough to pass judgment on _all_ of those bugs
    + unfortunatelly
    + Enselic: i don't see anyone even trying ot
    + it
    + any devs will be willing to review the idea list with me?
    + mitch: no one can until you stop rebasing :)
    + Enselic: and it's close to done anyway
    + 60min since meeting start, where in the agenda are we by now?
    + that said, I need to run. back in a bit
    + pippin, sort of finished :P
    + mitch: do we share the same definition of "done"?
    + done to me means it's ready to be merged to git master and released
    + Enselic: done as in "works better than master" <- good enough? :)
    + if there are no known regressions, than it's good enough
    + then*
    + there are missing plugins still
    + but Mikachu is very helpful there
    + is neo still working on gfig?
    + Mikachu: damn good question
    +* Enselic -> bed
    + Summarizing the list of actions:
    + action #1: schumaml and LightningIsMyName fix wgo?
    + action #2: Alexia and mitch take care of redirecting wiki.gimp.org
    + action #3, Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + neither swm nor ?8bit is gsoc I fear
    + *8
    + `
    + action 4: everybody subscribe to bug mail and TRIAGE BUGS
    +  anyway.... action #4: mitch, make a development release soo
    + action #6: LightningIsMyName takes care of next meeting
    + action #7: setting pages to discuss changes in different topics
    + action #8: LightningIsMyName gets a list of projects on the wiki by
    +  action #8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday is hard dead line for finalizing the project list
    + very nice
    + you missed five
    + LightningIsMyName, what happened to 5?
    + LightningIsMyName: if i can help with some git thing wrt updating the web site, just ask
    + action #9: all devs PM me username and password
    + sorry, an email
    + not a password
    + MikeM Mikachu
    + Mikachu, thanks :)
    + prokoudine_: It was the second #4?
    + LightningIsMyName: thanks for taking care of meeting stuff!
    + mitch, no problem :) I just hope next time we get actual stuff done in addition to talking :)
    + schumaml, and everyone, I'll email the project list page to the dev-mail-list, people should review the list!
    + Is there an overall tracking bug for SWM stuff?
    + is cage tool in 2.8 or not a topic that's worth to discuss ?
    + There will be a wiki page for each important milestone, and I'll bug devs to fill the pages on their stuff
    + Bat`O: of course it will be in 2.8
    + \o/
    + kevin, I don't really think so
    + Bat`O: what about showing your changes done since it was merged?
    +* Bat`O need to get back to work
    + kevin, maybe just "do SWM", but certainly nothing beyond that
    + mitch: you mean, merge my branch to master ?
    + Anyone has any objection to lock the official meeting?
    + Bat`O: no, getting it past my evil review
    + I see 5 reports re: SWM
    + i'm not against
    + but there is still a bad bug i need to kill
    + kevin, I could be wrong :o)
    + i want one patch to try to apply
    + It'd be awesome if I were
    + one patch where i can clearly see the changes, not some evil git diff against a non-rebased branch
    + xsdg: I think you might be right that there isn't a tracking bug. 
    +
    +
    diff --git a/wiki/Hacking:Dev_Meeting_28_Feb_2011-20161126033528-show.txt b/wiki/Hacking:Dev_Meeting_28_Feb_2011-20161126033528-show.txt new file mode 100644 index 0000000..13eb266 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_28_Feb_2011-20161126033528-show.txt @@ -0,0 +1,508 @@ + + +Meeting page for the Developer Meeting which took place in the GIMP IRC on February 28th 2011, 10:00 PM CET (GMT+1) + +'''Time for Next Meeting:''' March 14 2011, 10:00 PM CET (GMT+1). + + +__TOC__ + +==Agenda== + +===GSoC 2011 - ORG Application deadline is in 11 days!=== + +We need to discuss the list of ideas that were raised on the mailing list. See [http://old.nabble.com/Google-Summer-of-Code-2011---Project-Ideas-Suggestions-to30911798.html http://old.nabble.com/Google-Summer-of-Code-2011---Project-Ideas-Suggestions-to30911798.html] +for GEGL, see [http://gegl.org/contribute.html http://gegl.org/contribute.html] + + +===Bug fixing priorities=== + +We won't get 2.8 or 3.0 out unless we start doing concentrated bug fixes. We should set a priority list and try to stick with it, even if working on other stuff is more fun. + + +===Future development?=== + +Some serious PDB changes are going on now, potentially many of these will be relevant for 3.0. This is worth a discussion, but not necessaraly today. + + +===Make an official wiki working again (i.e. make wiki.gimp.org pointing at it)!=== + +Can be done by making [http://gimp-wiki.who.ee/ http://gimp-wiki.who.ee/] the official wiki - we need it to apply for GSoC, write roadmaps, etc. With all respect for bugzilla, discussions should be done in some more apropriate page. + + +===Make a roadmap on the official wiki=== + +Self explanatory. + + +===Try and decide on clear release policy for beta builds=== + +I personally would like to see more recent beta releases, and the last one was 7 months ago! + + +===Schedule meetings?=== + +Depending on the success of this one, we should possibly start doing this regularly. This was tried in the past, and we'll try to do this again. + + +===Anything else?=== + +Tell LightningIsMyName and he'll add it :) + +Random thought: Add an option to support gegl plugins with a gui nicely, for 2.8, so that users will start developing plugins for 3.0 in GEGL? + + +==Decided Actions== + +# schumaml and LightningIsMyName fix wgo? +# Alexia and mitch take care of redirecting wiki.gimp.org +# Enselic makes a draft of a GIMP roadmap and sends to gimp-developer +# everybody subscribe to bug mail and TRIAGE BUGS +# mitch, make a development release soo +# LightningIsMyName takes care of next meeting +# setting pages on the wiki to discuss changes in different topics +# LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday (March 5th, 2011) is hard dead line for finalizing the project list! +# all devs PM/Email LightningIsMyName username and email + +==Meeting Log== +
    +
    +== Topic: GIMP developer meeting, 22:00 CET (GMT+1) February 28th 2011 | Agenda: http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011 | THIS MEETING IS BEING LOGGED! ==
    +
    + Let's start :) Please take a look at the Agenda, as pointed by the topic, and read it
    + The most burning issue for todays meeting, is potentially GSoC this year
    + We have 10 days to apply, and we still don't have an organized ideas list or a mentors list
    + Do we want to participate?
    + I would suggest that the bigger issue is one of overall organization, and that the GSoC issues and the release issues are a consequence of that
    + xsdg, you are probably right, but I don't know if we have time to fix all these before the application deadline
    + As far as GSoC itself, if mentors want to step forward, great.  I have neither the knowledge nor the time.  I'm not sure there's anything non-mentors can really do about it
    + we could potentially lower the bar for mentoring, but that's probably not such a great idea.  It'd probably be more valuable (if mentors don't step forward) to deal with the higher-level issues and think about it again next year
    + mitch, I know you offered to mentor "since you do it anyway". Now, is it serious and you have time, or was that just a cynical comment?
    + i meant it, but i'm not going to mentor a particular student
    + i will help when i'm on irc
    + mitch gives channel operator status to Mikachu
    + we should hear schumaml on that issue, he's been doing gsoc orga all the years
    + schumaml - your opinion?
    + I won't force anyone to become a mentor
    + so my estimate is that if nobody steps up and organizes things, gsoc this year will not happen
    + if some of the previous mentors want to do it again, then I'll take care of the orga again
    + Alexia wanted to mentor again afail
    + schumaml, does GSoC require specific mentors for each project, or can we have general mentors?
    + specific mentors
    + each student is assigned one mentor
    + and this mentor is responsible for all administrative stuff concerning that one student
    + e.g. evaluations
    + Taking a look at the list of projects, does anyone have something which is urgent and GSoC could probably help more than regular development?
    + I.e. is there something a student can take care of which is critical?
    + should we decide not to apply as an org, then mentors could approach gnome ans ask to mentor gimp or gegl-related tasks
    + not really, otherwise it wouldn't be critical :)
    + (switching machine)
    + Let's jump for a second - what's on the top of the todo list?
    + Except for fixing bugs
    + generally getting 2.8 out
    + I can't see a clear roadmap anywhere, and that prevents me from knowing what to work on
    + I'd like to have an auto-updating main website again
    + schumaml: you just volunteered
    + we should switch to a wiki so it's not a big project to keep the website up to date
    + I volunteer to try and do website fixes if needed, the question is what do we want from auto-updating website?
    + a wiki for the main site?
    + It was discussed previously today to point wiki.gimp.org at alexia's wiki. Any objections?
    + most parts of the main site
    + i don't think so, both for reasons of load and security, as pointed out on the list
    + not news for example
    + LightningIsMyName: not from me
    + I think Alexia got a point about not introducing dynamic systems to www.gimp.org
    + we could have non-free-for-all registration
    + Enselic: giving out accounts is a prerequisite
    + The registration to alexia's wiki is aprooved only by me and her, to avoid spam
    + no self registration
    + we discussed that earlier today - as long as there is any script involved, the site is exploitable
    + LightningIsMyName: could I get an account?
    + Each dev who creates an account (see the topic) and email me, will get an editing permission on the wiki
    + and believe me, www.gimp.org would be a priority one target
    + who has the control over the domain names?
    + snorfle
    + snorfle?
    + shawn admunson(?)
    +* Kevin waves hello
    + so let's focus in wgo for a moment
    + schumaml: since you see it as priority, what about mailing sven about an account, and simply fixing it? sven doesn't have the time
    + I don't know what is missing, all I know is that commits to gimp-web aren't pulled and shown within minutes
    + I don't know if I can fix it, but I'
    + Sounds like you need Jenkins for the wgo
    + ll try to do this
    + i don't know either, but sven can point you to a starting point
    + I volunteer to try and help on that, if I'll have an account on gimp.org
    + fine with me
    + so action #1: schumaml and LightningIsMyName fix wgo?
    + fine with me
    + yes
    + If there is a script to build the wgo pages from a repo it just needs to be run by a cron job as a simple way to fix the problem.
    + question 2: who can request re-direction of wiki.gimp.org to alexia's wiki?
    + i think the problem was commit hooks or something that would send a mail from the old svn server to foo and then bar would happen
    + mitch: That would be the better way instead of a cron job
    + Kevin: that's how it worked before
    +* LightningIsMyName points back at redirecting wiki.gimp.org
    + LightningIsMyName: ideally, that wiki would be moved to the machine gimp.org runs on
    + I think we can add a daily cron job as a fallback at least
    + who currently owns/maintains the DNS entries for g.o?
    + it's really big enough
    + Kevin: as said, snorfle
    + didn't we just say we don't want that for security reasons?
    + LightningIsMyName: it could run in a chroot, or a vm, as sven said
    + so we'll need someone who can mess with servers more than I know to do that
    + I guess we need emergency response plans anyway?
    + unless we have someone who volunteers to do that, that's ain't practical
    + but for the time being, a redirect would be better than the current situation
    + agree
    + +1
    + i.e. what to do if somethings seems fishy with any gimp.org?
    + mitch: can you talk to snorfle about that?
    + I have no problem working on servers
    + snorfle?
    + Kevin: gimp.org DNS admin
    + Kevin: snorfle is a person
    + Shawn Amundson?
    + Enselic: sure, if alexia provides me with details, i'll take care of that
    + action #2: Alexia and mitch take care of redirecting wiki.gimp.org
    + pippin: precisely
    + mitch, the link is at the topic, alexia is back, just joined #gimp
    + yes, I see Shawn. Snorfle has some interesting meanings in the Urban dictionary
    + Ok, next topic "Make a roadmap on the official wiki"
    + Big topic
    + I can take care of that
    + I just need an account
    + we first of all need 2.8 goals asap
    + Enselic, create one now, I'll give your permissions
    + that's easy, look at https://bugzilla.gnome.org/buglist.cgi?product=GIMP&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED⌖_milestone=2.8 and work on what's important ;)
    + LightningIsMyName: that would basically be "fix all milestome bugs" and "clean up open ends"
    + it's not *that* much to do actually
    + guiguru, are you here? Some bugs there are dependant on you
    + I guess so
    + LightningIsMyName: how do I register?
    + guiguru: what are the chances we can start seeing specs soon?
    + Enselic, one sec
    + LightningIsMyName: specs are not blocking us, we'll do our best if we don't get specs
    + we can't wait forever
    + but we can fix things afterwards forever
    + Enselic, http://gimp-wiki.who.ee/index.php?title=Special:UserLogin&type=signup
    + LightningIsMyName: high
    + and spec <-> impl is always a loop, so just get started
    + Apart from SF deprecation issues, there are two minor enhancements it would be nice to have in there before 2.8 (getenv and create a directory procedures)
    + LightningIsMyName: priv msg
    + Enselic: are the priorities on that list accurate?
    + xsdg: no
    + Enselic: how hard would it be for them to become accurate?
    + that would be a big help, I think
    + bugzilla priorities are noise only for the most part
    + (I've certainly looked at that list and not known what to focus on)
    + xsdg: you can pick any of them
    + xsdg: just pick *any* bug that seems doable
    + are they all 2.8 blockers?
    + even non-milestone bugs, as long as the patch fixes something :)
    + no, some of them we will ship without
    + Enselic: it would be useful to know the difference between the two classes, then
    + I'm going to clean that list up once I get my site up and running
    + xsdg: The higher priority ones would be ones with 2.8 as their target milestone
    + Kevin: all of the things on that list are milestone 2.8
    +* LightningIsMyName points at "Random thought: Add an option to support gegl plugins with a gui nicely, for 2.8, so that users will start developing plugins for 3.0 in GEGL?"
    + I'm not sure which list you are looking at
    + is this practical?
    + Oh, that list.
    + and really, evetybody can help by simply subscribing to bugmail and at least *triaging* new bugs
    + action #3, Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + come on guys, it's not that hard
    + next item on the agenda: "Try and decide on clear release policy for beta builds"
    + Sure. Just mark them all as RESOLVED, WONTFIX  ;-)
    + mitch, Enselic: if our first goal is to get 2.8 out the door, we need to focus on the things which will allow us to accomplish that
    + how did that agenda point come up?
    + LightningIsMyName: that is part of the random non-roadmap which is http://gegl.org/contribute.html
    + I don't know, but I think we should have nightly binary builds so we don't need to worry about that
    + oh "beta build" is what we call a devel release now
    + mitch: regarding subscribing to bugmail, would be good for there to be a way for people to learn about that
    + we have nightly tarball builds, it's not that hard to make binary builds from that
    + i can make one easily within the next 2 weeks or so
    + now that gegl is out
    + I can have nightly builds of gtk+babl+gegl, but I need some FTP to host them
    + +gimp
    + Enselic: imho that can exist and is good, but advertizing it too much will feed the trolls
    + LightningIsMyName: host them here ftp://gimptest.flamingtext.com/pub/nightly-tarballs/
    + how will we deal with nightly builds in bugzilla?
    + mitch: "feed the trolls"?
    + how?
    + Enselic, need to check with ftcameron. I'll email him to see it's OK
    + a lot of "testing" from the clueless, and even more useless bugs
    + LightningIsMyName: you don't need to, I am admin on that machine
    + schumaml: I think, possibly as a separate action item somewhere, we need to spend a bit more time making bugzilla more useful
    + bug reported against 2.7.x-git20110316
    + schumaml: precisely
    + mitch: or more useful bugs
    + schumaml: that would likely include updating the templates, making sure the defaults are useful, and not letting people edit the ones they tend to enter incorrectly
    + Enselic: nobody is even triaging new bugs around here
    + so action 3: everybody subscribe to bug mail and TRIAGE BUGS
    + If I may interject, nightly builds might also attract developers, if you advertise it.
    + it's not that important, is it?
    + mitch: are there any guidelines for triaging bugs?
    + Enselic: "it" -> ???
    + xsdg: look at them, understand them, judge them
    + Enselic: triaging bugs?
    + mitch: what does that mean?
    + unimportant bugs that is
    + xsdg: Read them, does it make sense, can the problem be reproduced, does it need more input from reporter
    + xsdg: it's not that hard, most are either reproducable or needinfo
    + I have a document on making useful bug reports, is it possible to link to it in the submission form
    + ?
    + Enselic: deciding which are important == triaging :)
    + I ignore == I think it's not important
    + or duplicates
    + lots of duplicates
    + xsdg: check for duplicates, ask questions and set to NEEDINFO, close useless crap right away
    + mitch, Kevin, schumaml: that's more than I knew 10 minutes ago.  As obvious as this may seem, these instructions need to go somewhere.
    + Right. also checking if bug has already been reported.
    + it doesn't help if they only exist in your heads
    + xsdg: gnome has bug triaging guidelines
    + gnome should have general documentation for triaging available
    + If a patch has been supplied, does it look right, does it apply to the current (git master) source tree.
    + xsdg: get a wiki account and start a page :)
    + anyway.... action #4: mitch, make a development release soon
    + Enselic: fine with me
    + mitch: I'm currently at work; not going to happen
    + mitch: 
    + mitch: thanks
    + next item on the agenda "Schedule meetings?"
    + Enselic, sure! I want to learn to make a release, I'm going to be increasingly active this year
    + LightningIsMyName: there is a release-howto in devel-docs
    + The agenda isn't exactly ordered
    + LightningIsMyName: make distcheck is a start
    + I think there are some other things which should be discussed
    + make distcheck is run each night...
    + meetings? yes. late, like 10pm. interval?
    + the question is if we want to get techinical today or some other time?
    + Enselic: action #5: enselic to finally return ;)
    + I think that a bi-weekly meeting cycle would be productive
    + I'm afraid my girlfriend has infected my mind, I see a future of less GIMP activity :/
    + LightningIsMyName: you are more than welcome to push that
    + but it's a good kind of infection
    + mitch - I am trying :)
    + I like being infected
    + Enselic: turn her into a hacker
    + mitch: haeckse
    + meeting: not that often, every 2 months?
    + Definitely a good type of infection to have
    + Also, I'm going to add another topic which I saw in comments of some users
    + They said we should sort of advertise gimp, by promoting the new features officially instead of just developer blogs
    + two months is too long, imo
    + if you want regular meetings someone will have to set an agenda for the meetiings
    +* pippin would like to have the meetings in #gimp instead of here
    + LightningIsMyName: if wgo was working, much of that would happen
    + show more activity on the main website, possibly with features videos, to attract devs
    + pippin: i disagree
    + Let's all pause; I think everyone's talking about a different thing
    + What are we discussing right now?
    + pippin just want the pleasure of telling people to shut up
    + heh
    + right now the topic is "Schedule meetings?"
    + Boys, calm down ;) we were talking about scheduling meetings
    + LightningIsMyName: you seem to do a pretty good job, just go ahead with regular meetings
    + mitch: +1
    +* pippin already has >30 tabs in his irc client, would prefer not to have more
    + you can close this one soon
    + 30??
    + We need to get some technical meetings, and not just one like these
    +* LightningIsMyName reminds people to stay on topic
    + some people objected the recent PDB refactors
    + and there are some more changes that need to be dicussed
    + technical meetings can be done by groups of interested people
    + LightningIsMyName: this is a good start already, we can'T get technical with hald our infrastructure down
    + action #6: LightningIsMyName takes care of next meeting
    + I like how the blenders devs hijack their regular channel, use /topic to force people staying on topic stating which part of the agenda they are on, etc. :)
    + half*
    + pippin: offtopic
    + :-)
    + mitch: it is on topic on the topic of scheduling meetings
    + action #7: setting pages to discuss changes in different topics
    + next item on agenda: "Anything else? "
    + LightningIsMyName, promoting features officially is not a problem
    + prokoudine_, you volunteer?
    + LightningIsMyName, I write news for gimp.org anyway
    + good to know - the news are anonymous :)
    + LightningIsMyName: will you put the log and the collected actions up in the wiki?
    + yes. btw, we still haven't finished one topic
    + Are you only going to promote new features after they are complete?
    + i know :)
    + We didn't decide a thing about GSoC
    + do we apply this year for something?
    + I agree to be a student, and there will be probably many other applications
    + there will be student interest, so it's a shame to miss the coding work
    + LightningIsMyName, and will you mentor yourself? :)
    +* pippin does not want to have direct responsibility of any student, wbut will aid in helping any strudent working on gegl or gegl related projects
    + Alexia would mentor, I guess
    + Kevin ketas-wi
    + ketas-wi, you are Alexia, right?
    + LightningIsMyName: i would mentor you :) but not some random fool
    + I've asked Akkana as well, she could do a beginner task provided that it will end up in gimp if finished
    + LightningIsMyName, he is not
    + btw, sorry for last years gsoc.
    + I took myself off the mentor list but I could sign up again if there was something I might be able to help with. Last couple of years there hasn't been.
    + gwidion, just finish the project, will you? :)
    + my student would do even less things than what i 'd  ask her
    + LightningIsMyName: which would be self-mentring, but google's formalities followed, and i'd be around for any questions of course
    + is there any project which we want to feed me/some-other-jobless-student for the summer?
    + Rewrite gimp-perl  :-)
    + LightningIsMyName: see http://gegl.org/contribute.html
    + fix pygimp
    + If Enselic does not expect to find more time for gimp dev soon, having someone else work on single-window mode is pretty critical for 2.8
    + jonnor, you are very right about that
    + it is afaik, the one big thing blocking it
    + time-critical things have not been good for gsoc projects in the past
    + jonnor: i'm afraid that particular job will stick with me anyway
    + jonnor: that and more-than-8-bits
    + Ankh: that is not for 2.8?
    + can we release 2.8 with gtk+ 2.x at all?
    + Ankh: that's not a gcos project
    + Anything potentially 3.0 targeted, that will not need re-writing later?
    + Question: do we have a time goal for shipping 2.8?  I would say "december 31, 2011 at the very latest"
    + gsoc
    + mitch: agreed
    + mitch: Anything that can be taken off your plate and pushed to someone else to free up your time for SWM?
    + so, i have a general issue now that 3.0 came up
    + neither swm nor ?8bit is gsoc I fear
    + i figured that we will likely *never* get proper xinput back with gtk 2.x
    + so might i suggest something:
    + and tablet support is broken on windows, too
    + 2.x -> 3.x migration:
    + I'm also curious why ruler widgets were removed from gtk
    + prokoudine_: My intentio is to "finish" the other Gsoc - jsut gimp python which was never integrated into trunk.
    + - deprecate as much as humanly possible in the 2.x api and replace it by stuff that is 3.x-able
    + xsdg: we don't know, but will know within a few months
    + - after 2.8 is out, have a short devel cycle
    + gwidion, that's what I was referring to -- python project
    + not /src/gimp/gkt+ like gap and ffmpeg? moving targets and all....
    + - gfet 3.0 out
    + schumaml, does a ORG need to supply a list of projects in his application? If so, does google choose between these, or the ORG?
    + LightningIsMyName: the _student_ has to propose his own project, potentially inspired by the orgs list
    + Enselic: I would suggest that we set a hard deadline sometime, and commit to shipping by that date.  Otherwise we end up having this discussion next March
    + xsdg: that's not going to work
    + mitch: so 3.0 would be just the gtk+ change?
    + Part of the release date issue is having a defined set of things to work on and getting those things done.
    + schumaml: plus really nicely working tablet hotplug and stuff
    + schumaml: and it's a big change
    + schumaml, would you take care of our GSoC application this year? I'll organize a list of projects, and I'll put it on for review by the devs? Link will be on the mailing list tomorrow
    + s/just //
    + btw, all devs that want a wiki account, PM me a username and an email
    + Enselic: Suppose that GIMP hadn't advanced March of next year.  Should we not release the stuff that's already done by that point?
    + Enselic: what's in git already has value over the latest thing that's been released
    + (that is, excluding dev releeases)
    + Enselic: do we want people to sit on 2.6 forever?
    + oh, well. 
    + I still have 2.6 on my machine.
    + xsdg: if they need tablet support, then probably yes
    + xsdg: the harm is done, people expect swm, we will get a lot of badwill if we ship without
    + xsdg: then just get started doing some hacks, roadmaps and hard dates don't help much on their own
    + shure
    + Enselic: is that worth people sitting on 2.6 for another year?
    + I want to see 2.8 out soon, it's pretty stable at least for my everyday workflow. Better release and stop blocking ourselves, than blocking ourselves and the users
    + So it will a bit incomplete - legitimate for an end of cycle product
    + mitch: I've been on a project that died because they couldn't release (geeqie).  I'm hoping it doesn't happen to gimp
    + Enselic: you just have to take a week off from work and emma, and hide in a rødmalt stuga...
    + Enselic, what is exactly blocking simple swm?
    + One user reported working in SWM mode and felt it was working ok.
    + LightningIsMyName: yes, please collect a list of projects
    + Enselic, without image parade, I mean
    + see milestoned bugs...
    + prokoudine_, it's not session managed
    + LightningIsMyName: google uses this to judge whether an org is ready for gsoc
    + LightningIsMyName, any estimations time-wise?
    + prokoudine_: what is the problem about image parade? i could hack that in one week
    + mitch, no spec?
    + image parade?
    + prokoudine_: not a problem, i have a mind
    + mitch, then go for it? :)
    + mitch: this is why we need priorities
    + mitch is supposed to be working on SWM  ;-)
    + that will leave us only broken tablets
    + prokoudine_: if you noticed, i'm already the main committer and my time is limited ;)
    + mitch, I have :) I track it
    +* pippin thinks mitch should focus on killing off 8bit :P
    + and other swm things are far worse
    + action #8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday is hard dead line for finalizing the project list
    + do we have any unassigned action items?
    + pippin: irrelevant for 2.8
    + mitch: btw, at some point you need to stop rebasing the gtk3 branch and merge master to it instead
    + regularly
    + "gimp developer(s) continue to ignore higher bitdepths" ;)
    + Enselic: clearly not
    +* LightningIsMyName points at action #8
    + i don't think that's a meeting topic
    + schumaml: I would suggest that we have people initially prioritize things on the 2.8 milestone
    + i want a sane history
    + mitch: how are more than you supposed to be able to work on it then?
    + pippin: "which sounds better than gimp developers continue not releasing"
    + schumaml: I'm willing to help with that, but I don't feel I know enough to pass judgment on _all_ of those bugs
    + unfortunatelly
    + Enselic: i don't see anyone even trying ot
    + it
    + any devs will be willing to review the idea list with me?
    + mitch: no one can until you stop rebasing :)
    + Enselic: and it's close to done anyway
    + 60min since meeting start, where in the agenda are we by now?
    + that said, I need to run. back in a bit
    + pippin, sort of finished :P
    + mitch: do we share the same definition of "done"?
    + done to me means it's ready to be merged to git master and released
    + Enselic: done as in "works better than master" <- good enough? :)
    + if there are no known regressions, than it's good enough
    + then*
    + there are missing plugins still
    + but Mikachu is very helpful there
    + is neo still working on gfig?
    + Mikachu: damn good question
    +* Enselic -> bed
    + Summarizing the list of actions:
    + action #1: schumaml and LightningIsMyName fix wgo?
    + action #2: Alexia and mitch take care of redirecting wiki.gimp.org
    + action #3, Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + neither swm nor ?8bit is gsoc I fear
    + *8
    + `
    + action 4: everybody subscribe to bug mail and TRIAGE BUGS
    +  anyway.... action #4: mitch, make a development release soo
    + action #6: LightningIsMyName takes care of next meeting
    + action #7: setting pages to discuss changes in different topics
    + action #8: LightningIsMyName gets a list of projects on the wiki by
    +  action #8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday is hard dead line for finalizing the project list
    + very nice
    + you missed five
    + LightningIsMyName, what happened to 5?
    + LightningIsMyName: if i can help with some git thing wrt updating the web site, just ask
    + action #9: all devs PM me username and password
    + sorry, an email
    + not a password
    + MikeM Mikachu
    + Mikachu, thanks :)
    + prokoudine_: It was the second #4?
    + LightningIsMyName: thanks for taking care of meeting stuff!
    + mitch, no problem :) I just hope next time we get actual stuff done in addition to talking :)
    + schumaml, and everyone, I'll email the project list page to the dev-mail-list, people should review the list!
    + Is there an overall tracking bug for SWM stuff?
    + is cage tool in 2.8 or not a topic that's worth to discuss ?
    + There will be a wiki page for each important milestone, and I'll bug devs to fill the pages on their stuff
    + Bat`O: of course it will be in 2.8
    + \o/
    + kevin, I don't really think so
    + Bat`O: what about showing your changes done since it was merged?
    +* Bat`O need to get back to work
    + kevin, maybe just "do SWM", but certainly nothing beyond that
    + mitch: you mean, merge my branch to master ?
    + Anyone has any objection to lock the official meeting?
    + Bat`O: no, getting it past my evil review
    + I see 5 reports re: SWM
    + i'm not against
    + but there is still a bad bug i need to kill
    + kevin, I could be wrong :o)
    + i want one patch to try to apply
    + It'd be awesome if I were
    + one patch where i can clearly see the changes, not some evil git diff against a non-rebased branch
    + xsdg: I think you might be right that there isn't a tracking bug. 
    +
    +
    diff --git a/wiki/Hacking:Dev_Meeting_28_Feb_2011-20200126023332-show.txt b/wiki/Hacking:Dev_Meeting_28_Feb_2011-20200126023332-show.txt new file mode 100644 index 0000000..13eb266 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_28_Feb_2011-20200126023332-show.txt @@ -0,0 +1,508 @@ + + +Meeting page for the Developer Meeting which took place in the GIMP IRC on February 28th 2011, 10:00 PM CET (GMT+1) + +'''Time for Next Meeting:''' March 14 2011, 10:00 PM CET (GMT+1). + + +__TOC__ + +==Agenda== + +===GSoC 2011 - ORG Application deadline is in 11 days!=== + +We need to discuss the list of ideas that were raised on the mailing list. See [http://old.nabble.com/Google-Summer-of-Code-2011---Project-Ideas-Suggestions-to30911798.html http://old.nabble.com/Google-Summer-of-Code-2011---Project-Ideas-Suggestions-to30911798.html] +for GEGL, see [http://gegl.org/contribute.html http://gegl.org/contribute.html] + + +===Bug fixing priorities=== + +We won't get 2.8 or 3.0 out unless we start doing concentrated bug fixes. We should set a priority list and try to stick with it, even if working on other stuff is more fun. + + +===Future development?=== + +Some serious PDB changes are going on now, potentially many of these will be relevant for 3.0. This is worth a discussion, but not necessaraly today. + + +===Make an official wiki working again (i.e. make wiki.gimp.org pointing at it)!=== + +Can be done by making [http://gimp-wiki.who.ee/ http://gimp-wiki.who.ee/] the official wiki - we need it to apply for GSoC, write roadmaps, etc. With all respect for bugzilla, discussions should be done in some more apropriate page. + + +===Make a roadmap on the official wiki=== + +Self explanatory. + + +===Try and decide on clear release policy for beta builds=== + +I personally would like to see more recent beta releases, and the last one was 7 months ago! + + +===Schedule meetings?=== + +Depending on the success of this one, we should possibly start doing this regularly. This was tried in the past, and we'll try to do this again. + + +===Anything else?=== + +Tell LightningIsMyName and he'll add it :) + +Random thought: Add an option to support gegl plugins with a gui nicely, for 2.8, so that users will start developing plugins for 3.0 in GEGL? + + +==Decided Actions== + +# schumaml and LightningIsMyName fix wgo? +# Alexia and mitch take care of redirecting wiki.gimp.org +# Enselic makes a draft of a GIMP roadmap and sends to gimp-developer +# everybody subscribe to bug mail and TRIAGE BUGS +# mitch, make a development release soo +# LightningIsMyName takes care of next meeting +# setting pages on the wiki to discuss changes in different topics +# LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday (March 5th, 2011) is hard dead line for finalizing the project list! +# all devs PM/Email LightningIsMyName username and email + +==Meeting Log== +
    +
    +== Topic: GIMP developer meeting, 22:00 CET (GMT+1) February 28th 2011 | Agenda: http://gimp-wiki.who.ee/index.php/Hacking:Dev_Meeting_28_Feb_2011 | THIS MEETING IS BEING LOGGED! ==
    +
    + Let's start :) Please take a look at the Agenda, as pointed by the topic, and read it
    + The most burning issue for todays meeting, is potentially GSoC this year
    + We have 10 days to apply, and we still don't have an organized ideas list or a mentors list
    + Do we want to participate?
    + I would suggest that the bigger issue is one of overall organization, and that the GSoC issues and the release issues are a consequence of that
    + xsdg, you are probably right, but I don't know if we have time to fix all these before the application deadline
    + As far as GSoC itself, if mentors want to step forward, great.  I have neither the knowledge nor the time.  I'm not sure there's anything non-mentors can really do about it
    + we could potentially lower the bar for mentoring, but that's probably not such a great idea.  It'd probably be more valuable (if mentors don't step forward) to deal with the higher-level issues and think about it again next year
    + mitch, I know you offered to mentor "since you do it anyway". Now, is it serious and you have time, or was that just a cynical comment?
    + i meant it, but i'm not going to mentor a particular student
    + i will help when i'm on irc
    + mitch gives channel operator status to Mikachu
    + we should hear schumaml on that issue, he's been doing gsoc orga all the years
    + schumaml - your opinion?
    + I won't force anyone to become a mentor
    + so my estimate is that if nobody steps up and organizes things, gsoc this year will not happen
    + if some of the previous mentors want to do it again, then I'll take care of the orga again
    + Alexia wanted to mentor again afail
    + schumaml, does GSoC require specific mentors for each project, or can we have general mentors?
    + specific mentors
    + each student is assigned one mentor
    + and this mentor is responsible for all administrative stuff concerning that one student
    + e.g. evaluations
    + Taking a look at the list of projects, does anyone have something which is urgent and GSoC could probably help more than regular development?
    + I.e. is there something a student can take care of which is critical?
    + should we decide not to apply as an org, then mentors could approach gnome ans ask to mentor gimp or gegl-related tasks
    + not really, otherwise it wouldn't be critical :)
    + (switching machine)
    + Let's jump for a second - what's on the top of the todo list?
    + Except for fixing bugs
    + generally getting 2.8 out
    + I can't see a clear roadmap anywhere, and that prevents me from knowing what to work on
    + I'd like to have an auto-updating main website again
    + schumaml: you just volunteered
    + we should switch to a wiki so it's not a big project to keep the website up to date
    + I volunteer to try and do website fixes if needed, the question is what do we want from auto-updating website?
    + a wiki for the main site?
    + It was discussed previously today to point wiki.gimp.org at alexia's wiki. Any objections?
    + most parts of the main site
    + i don't think so, both for reasons of load and security, as pointed out on the list
    + not news for example
    + LightningIsMyName: not from me
    + I think Alexia got a point about not introducing dynamic systems to www.gimp.org
    + we could have non-free-for-all registration
    + Enselic: giving out accounts is a prerequisite
    + The registration to alexia's wiki is aprooved only by me and her, to avoid spam
    + no self registration
    + we discussed that earlier today - as long as there is any script involved, the site is exploitable
    + LightningIsMyName: could I get an account?
    + Each dev who creates an account (see the topic) and email me, will get an editing permission on the wiki
    + and believe me, www.gimp.org would be a priority one target
    + who has the control over the domain names?
    + snorfle
    + snorfle?
    + shawn admunson(?)
    +* Kevin waves hello
    + so let's focus in wgo for a moment
    + schumaml: since you see it as priority, what about mailing sven about an account, and simply fixing it? sven doesn't have the time
    + I don't know what is missing, all I know is that commits to gimp-web aren't pulled and shown within minutes
    + I don't know if I can fix it, but I'
    + Sounds like you need Jenkins for the wgo
    + ll try to do this
    + i don't know either, but sven can point you to a starting point
    + I volunteer to try and help on that, if I'll have an account on gimp.org
    + fine with me
    + so action #1: schumaml and LightningIsMyName fix wgo?
    + fine with me
    + yes
    + If there is a script to build the wgo pages from a repo it just needs to be run by a cron job as a simple way to fix the problem.
    + question 2: who can request re-direction of wiki.gimp.org to alexia's wiki?
    + i think the problem was commit hooks or something that would send a mail from the old svn server to foo and then bar would happen
    + mitch: That would be the better way instead of a cron job
    + Kevin: that's how it worked before
    +* LightningIsMyName points back at redirecting wiki.gimp.org
    + LightningIsMyName: ideally, that wiki would be moved to the machine gimp.org runs on
    + I think we can add a daily cron job as a fallback at least
    + who currently owns/maintains the DNS entries for g.o?
    + it's really big enough
    + Kevin: as said, snorfle
    + didn't we just say we don't want that for security reasons?
    + LightningIsMyName: it could run in a chroot, or a vm, as sven said
    + so we'll need someone who can mess with servers more than I know to do that
    + I guess we need emergency response plans anyway?
    + unless we have someone who volunteers to do that, that's ain't practical
    + but for the time being, a redirect would be better than the current situation
    + agree
    + +1
    + i.e. what to do if somethings seems fishy with any gimp.org?
    + mitch: can you talk to snorfle about that?
    + I have no problem working on servers
    + snorfle?
    + Kevin: gimp.org DNS admin
    + Kevin: snorfle is a person
    + Shawn Amundson?
    + Enselic: sure, if alexia provides me with details, i'll take care of that
    + action #2: Alexia and mitch take care of redirecting wiki.gimp.org
    + pippin: precisely
    + mitch, the link is at the topic, alexia is back, just joined #gimp
    + yes, I see Shawn. Snorfle has some interesting meanings in the Urban dictionary
    + Ok, next topic "Make a roadmap on the official wiki"
    + Big topic
    + I can take care of that
    + I just need an account
    + we first of all need 2.8 goals asap
    + Enselic, create one now, I'll give your permissions
    + that's easy, look at https://bugzilla.gnome.org/buglist.cgi?product=GIMP&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED⌖_milestone=2.8 and work on what's important ;)
    + LightningIsMyName: that would basically be "fix all milestome bugs" and "clean up open ends"
    + it's not *that* much to do actually
    + guiguru, are you here? Some bugs there are dependant on you
    + I guess so
    + LightningIsMyName: how do I register?
    + guiguru: what are the chances we can start seeing specs soon?
    + Enselic, one sec
    + LightningIsMyName: specs are not blocking us, we'll do our best if we don't get specs
    + we can't wait forever
    + but we can fix things afterwards forever
    + Enselic, http://gimp-wiki.who.ee/index.php?title=Special:UserLogin&type=signup
    + LightningIsMyName: high
    + and spec <-> impl is always a loop, so just get started
    + Apart from SF deprecation issues, there are two minor enhancements it would be nice to have in there before 2.8 (getenv and create a directory procedures)
    + LightningIsMyName: priv msg
    + Enselic: are the priorities on that list accurate?
    + xsdg: no
    + Enselic: how hard would it be for them to become accurate?
    + that would be a big help, I think
    + bugzilla priorities are noise only for the most part
    + (I've certainly looked at that list and not known what to focus on)
    + xsdg: you can pick any of them
    + xsdg: just pick *any* bug that seems doable
    + are they all 2.8 blockers?
    + even non-milestone bugs, as long as the patch fixes something :)
    + no, some of them we will ship without
    + Enselic: it would be useful to know the difference between the two classes, then
    + I'm going to clean that list up once I get my site up and running
    + xsdg: The higher priority ones would be ones with 2.8 as their target milestone
    + Kevin: all of the things on that list are milestone 2.8
    +* LightningIsMyName points at "Random thought: Add an option to support gegl plugins with a gui nicely, for 2.8, so that users will start developing plugins for 3.0 in GEGL?"
    + I'm not sure which list you are looking at
    + is this practical?
    + Oh, that list.
    + and really, evetybody can help by simply subscribing to bugmail and at least *triaging* new bugs
    + action #3, Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + come on guys, it's not that hard
    + next item on the agenda: "Try and decide on clear release policy for beta builds"
    + Sure. Just mark them all as RESOLVED, WONTFIX  ;-)
    + mitch, Enselic: if our first goal is to get 2.8 out the door, we need to focus on the things which will allow us to accomplish that
    + how did that agenda point come up?
    + LightningIsMyName: that is part of the random non-roadmap which is http://gegl.org/contribute.html
    + I don't know, but I think we should have nightly binary builds so we don't need to worry about that
    + oh "beta build" is what we call a devel release now
    + mitch: regarding subscribing to bugmail, would be good for there to be a way for people to learn about that
    + we have nightly tarball builds, it's not that hard to make binary builds from that
    + i can make one easily within the next 2 weeks or so
    + now that gegl is out
    + I can have nightly builds of gtk+babl+gegl, but I need some FTP to host them
    + +gimp
    + Enselic: imho that can exist and is good, but advertizing it too much will feed the trolls
    + LightningIsMyName: host them here ftp://gimptest.flamingtext.com/pub/nightly-tarballs/
    + how will we deal with nightly builds in bugzilla?
    + mitch: "feed the trolls"?
    + how?
    + Enselic, need to check with ftcameron. I'll email him to see it's OK
    + a lot of "testing" from the clueless, and even more useless bugs
    + LightningIsMyName: you don't need to, I am admin on that machine
    + schumaml: I think, possibly as a separate action item somewhere, we need to spend a bit more time making bugzilla more useful
    + bug reported against 2.7.x-git20110316
    + schumaml: precisely
    + mitch: or more useful bugs
    + schumaml: that would likely include updating the templates, making sure the defaults are useful, and not letting people edit the ones they tend to enter incorrectly
    + Enselic: nobody is even triaging new bugs around here
    + so action 3: everybody subscribe to bug mail and TRIAGE BUGS
    + If I may interject, nightly builds might also attract developers, if you advertise it.
    + it's not that important, is it?
    + mitch: are there any guidelines for triaging bugs?
    + Enselic: "it" -> ???
    + xsdg: look at them, understand them, judge them
    + Enselic: triaging bugs?
    + mitch: what does that mean?
    + unimportant bugs that is
    + xsdg: Read them, does it make sense, can the problem be reproduced, does it need more input from reporter
    + xsdg: it's not that hard, most are either reproducable or needinfo
    + I have a document on making useful bug reports, is it possible to link to it in the submission form
    + ?
    + Enselic: deciding which are important == triaging :)
    + I ignore == I think it's not important
    + or duplicates
    + lots of duplicates
    + xsdg: check for duplicates, ask questions and set to NEEDINFO, close useless crap right away
    + mitch, Kevin, schumaml: that's more than I knew 10 minutes ago.  As obvious as this may seem, these instructions need to go somewhere.
    + Right. also checking if bug has already been reported.
    + it doesn't help if they only exist in your heads
    + xsdg: gnome has bug triaging guidelines
    + gnome should have general documentation for triaging available
    + If a patch has been supplied, does it look right, does it apply to the current (git master) source tree.
    + xsdg: get a wiki account and start a page :)
    + anyway.... action #4: mitch, make a development release soon
    + Enselic: fine with me
    + mitch: I'm currently at work; not going to happen
    + mitch: 
    + mitch: thanks
    + next item on the agenda "Schedule meetings?"
    + Enselic, sure! I want to learn to make a release, I'm going to be increasingly active this year
    + LightningIsMyName: there is a release-howto in devel-docs
    + The agenda isn't exactly ordered
    + LightningIsMyName: make distcheck is a start
    + I think there are some other things which should be discussed
    + make distcheck is run each night...
    + meetings? yes. late, like 10pm. interval?
    + the question is if we want to get techinical today or some other time?
    + Enselic: action #5: enselic to finally return ;)
    + I think that a bi-weekly meeting cycle would be productive
    + I'm afraid my girlfriend has infected my mind, I see a future of less GIMP activity :/
    + LightningIsMyName: you are more than welcome to push that
    + but it's a good kind of infection
    + mitch - I am trying :)
    + I like being infected
    + Enselic: turn her into a hacker
    + mitch: haeckse
    + meeting: not that often, every 2 months?
    + Definitely a good type of infection to have
    + Also, I'm going to add another topic which I saw in comments of some users
    + They said we should sort of advertise gimp, by promoting the new features officially instead of just developer blogs
    + two months is too long, imo
    + if you want regular meetings someone will have to set an agenda for the meetiings
    +* pippin would like to have the meetings in #gimp instead of here
    + LightningIsMyName: if wgo was working, much of that would happen
    + show more activity on the main website, possibly with features videos, to attract devs
    + pippin: i disagree
    + Let's all pause; I think everyone's talking about a different thing
    + What are we discussing right now?
    + pippin just want the pleasure of telling people to shut up
    + heh
    + right now the topic is "Schedule meetings?"
    + Boys, calm down ;) we were talking about scheduling meetings
    + LightningIsMyName: you seem to do a pretty good job, just go ahead with regular meetings
    + mitch: +1
    +* pippin already has >30 tabs in his irc client, would prefer not to have more
    + you can close this one soon
    + 30??
    + We need to get some technical meetings, and not just one like these
    +* LightningIsMyName reminds people to stay on topic
    + some people objected the recent PDB refactors
    + and there are some more changes that need to be dicussed
    + technical meetings can be done by groups of interested people
    + LightningIsMyName: this is a good start already, we can'T get technical with hald our infrastructure down
    + action #6: LightningIsMyName takes care of next meeting
    + I like how the blenders devs hijack their regular channel, use /topic to force people staying on topic stating which part of the agenda they are on, etc. :)
    + half*
    + pippin: offtopic
    + :-)
    + mitch: it is on topic on the topic of scheduling meetings
    + action #7: setting pages to discuss changes in different topics
    + next item on agenda: "Anything else? "
    + LightningIsMyName, promoting features officially is not a problem
    + prokoudine_, you volunteer?
    + LightningIsMyName, I write news for gimp.org anyway
    + good to know - the news are anonymous :)
    + LightningIsMyName: will you put the log and the collected actions up in the wiki?
    + yes. btw, we still haven't finished one topic
    + Are you only going to promote new features after they are complete?
    + i know :)
    + We didn't decide a thing about GSoC
    + do we apply this year for something?
    + I agree to be a student, and there will be probably many other applications
    + there will be student interest, so it's a shame to miss the coding work
    + LightningIsMyName, and will you mentor yourself? :)
    +* pippin does not want to have direct responsibility of any student, wbut will aid in helping any strudent working on gegl or gegl related projects
    + Alexia would mentor, I guess
    + Kevin ketas-wi
    + ketas-wi, you are Alexia, right?
    + LightningIsMyName: i would mentor you :) but not some random fool
    + I've asked Akkana as well, she could do a beginner task provided that it will end up in gimp if finished
    + LightningIsMyName, he is not
    + btw, sorry for last years gsoc.
    + I took myself off the mentor list but I could sign up again if there was something I might be able to help with. Last couple of years there hasn't been.
    + gwidion, just finish the project, will you? :)
    + my student would do even less things than what i 'd  ask her
    + LightningIsMyName: which would be self-mentring, but google's formalities followed, and i'd be around for any questions of course
    + is there any project which we want to feed me/some-other-jobless-student for the summer?
    + Rewrite gimp-perl  :-)
    + LightningIsMyName: see http://gegl.org/contribute.html
    + fix pygimp
    + If Enselic does not expect to find more time for gimp dev soon, having someone else work on single-window mode is pretty critical for 2.8
    + jonnor, you are very right about that
    + it is afaik, the one big thing blocking it
    + time-critical things have not been good for gsoc projects in the past
    + jonnor: i'm afraid that particular job will stick with me anyway
    + jonnor: that and more-than-8-bits
    + Ankh: that is not for 2.8?
    + can we release 2.8 with gtk+ 2.x at all?
    + Ankh: that's not a gcos project
    + Anything potentially 3.0 targeted, that will not need re-writing later?
    + Question: do we have a time goal for shipping 2.8?  I would say "december 31, 2011 at the very latest"
    + gsoc
    + mitch: agreed
    + mitch: Anything that can be taken off your plate and pushed to someone else to free up your time for SWM?
    + so, i have a general issue now that 3.0 came up
    + neither swm nor ?8bit is gsoc I fear
    + i figured that we will likely *never* get proper xinput back with gtk 2.x
    + so might i suggest something:
    + and tablet support is broken on windows, too
    + 2.x -> 3.x migration:
    + I'm also curious why ruler widgets were removed from gtk
    + prokoudine_: My intentio is to "finish" the other Gsoc - jsut gimp python which was never integrated into trunk.
    + - deprecate as much as humanly possible in the 2.x api and replace it by stuff that is 3.x-able
    + xsdg: we don't know, but will know within a few months
    + - after 2.8 is out, have a short devel cycle
    + gwidion, that's what I was referring to -- python project
    + not /src/gimp/gkt+ like gap and ffmpeg? moving targets and all....
    + - gfet 3.0 out
    + schumaml, does a ORG need to supply a list of projects in his application? If so, does google choose between these, or the ORG?
    + LightningIsMyName: the _student_ has to propose his own project, potentially inspired by the orgs list
    + Enselic: I would suggest that we set a hard deadline sometime, and commit to shipping by that date.  Otherwise we end up having this discussion next March
    + xsdg: that's not going to work
    + mitch: so 3.0 would be just the gtk+ change?
    + Part of the release date issue is having a defined set of things to work on and getting those things done.
    + schumaml: plus really nicely working tablet hotplug and stuff
    + schumaml: and it's a big change
    + schumaml, would you take care of our GSoC application this year? I'll organize a list of projects, and I'll put it on for review by the devs? Link will be on the mailing list tomorrow
    + s/just //
    + btw, all devs that want a wiki account, PM me a username and an email
    + Enselic: Suppose that GIMP hadn't advanced March of next year.  Should we not release the stuff that's already done by that point?
    + Enselic: what's in git already has value over the latest thing that's been released
    + (that is, excluding dev releeases)
    + Enselic: do we want people to sit on 2.6 forever?
    + oh, well. 
    + I still have 2.6 on my machine.
    + xsdg: if they need tablet support, then probably yes
    + xsdg: the harm is done, people expect swm, we will get a lot of badwill if we ship without
    + xsdg: then just get started doing some hacks, roadmaps and hard dates don't help much on their own
    + shure
    + Enselic: is that worth people sitting on 2.6 for another year?
    + I want to see 2.8 out soon, it's pretty stable at least for my everyday workflow. Better release and stop blocking ourselves, than blocking ourselves and the users
    + So it will a bit incomplete - legitimate for an end of cycle product
    + mitch: I've been on a project that died because they couldn't release (geeqie).  I'm hoping it doesn't happen to gimp
    + Enselic: you just have to take a week off from work and emma, and hide in a rødmalt stuga...
    + Enselic, what is exactly blocking simple swm?
    + One user reported working in SWM mode and felt it was working ok.
    + LightningIsMyName: yes, please collect a list of projects
    + Enselic, without image parade, I mean
    + see milestoned bugs...
    + prokoudine_, it's not session managed
    + LightningIsMyName: google uses this to judge whether an org is ready for gsoc
    + LightningIsMyName, any estimations time-wise?
    + prokoudine_: what is the problem about image parade? i could hack that in one week
    + mitch, no spec?
    + image parade?
    + prokoudine_: not a problem, i have a mind
    + mitch, then go for it? :)
    + mitch: this is why we need priorities
    + mitch is supposed to be working on SWM  ;-)
    + that will leave us only broken tablets
    + prokoudine_: if you noticed, i'm already the main committer and my time is limited ;)
    + mitch, I have :) I track it
    +* pippin thinks mitch should focus on killing off 8bit :P
    + and other swm things are far worse
    + action #8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday is hard dead line for finalizing the project list
    + do we have any unassigned action items?
    + pippin: irrelevant for 2.8
    + mitch: btw, at some point you need to stop rebasing the gtk3 branch and merge master to it instead
    + regularly
    + "gimp developer(s) continue to ignore higher bitdepths" ;)
    + Enselic: clearly not
    +* LightningIsMyName points at action #8
    + i don't think that's a meeting topic
    + schumaml: I would suggest that we have people initially prioritize things on the 2.8 milestone
    + i want a sane history
    + mitch: how are more than you supposed to be able to work on it then?
    + pippin: "which sounds better than gimp developers continue not releasing"
    + schumaml: I'm willing to help with that, but I don't feel I know enough to pass judgment on _all_ of those bugs
    + unfortunatelly
    + Enselic: i don't see anyone even trying ot
    + it
    + any devs will be willing to review the idea list with me?
    + mitch: no one can until you stop rebasing :)
    + Enselic: and it's close to done anyway
    + 60min since meeting start, where in the agenda are we by now?
    + that said, I need to run. back in a bit
    + pippin, sort of finished :P
    + mitch: do we share the same definition of "done"?
    + done to me means it's ready to be merged to git master and released
    + Enselic: done as in "works better than master" <- good enough? :)
    + if there are no known regressions, than it's good enough
    + then*
    + there are missing plugins still
    + but Mikachu is very helpful there
    + is neo still working on gfig?
    + Mikachu: damn good question
    +* Enselic -> bed
    + Summarizing the list of actions:
    + action #1: schumaml and LightningIsMyName fix wgo?
    + action #2: Alexia and mitch take care of redirecting wiki.gimp.org
    + action #3, Enselic makes a draft of a GIMP roadmap and sends to gimp-developer
    + neither swm nor ?8bit is gsoc I fear
    + *8
    + `
    + action 4: everybody subscribe to bug mail and TRIAGE BUGS
    +  anyway.... action #4: mitch, make a development release soo
    + action #6: LightningIsMyName takes care of next meeting
    + action #7: setting pages to discuss changes in different topics
    + action #8: LightningIsMyName gets a list of projects on the wiki by
    +  action #8: LightningIsMyName gets a list of projects on the wiki by tomorrow, developers review the ideas by email or by commenting on the wiki. Saturday is hard dead line for finalizing the project list
    + very nice
    + you missed five
    + LightningIsMyName, what happened to 5?
    + LightningIsMyName: if i can help with some git thing wrt updating the web site, just ask
    + action #9: all devs PM me username and password
    + sorry, an email
    + not a password
    + MikeM Mikachu
    + Mikachu, thanks :)
    + prokoudine_: It was the second #4?
    + LightningIsMyName: thanks for taking care of meeting stuff!
    + mitch, no problem :) I just hope next time we get actual stuff done in addition to talking :)
    + schumaml, and everyone, I'll email the project list page to the dev-mail-list, people should review the list!
    + Is there an overall tracking bug for SWM stuff?
    + is cage tool in 2.8 or not a topic that's worth to discuss ?
    + There will be a wiki page for each important milestone, and I'll bug devs to fill the pages on their stuff
    + Bat`O: of course it will be in 2.8
    + \o/
    + kevin, I don't really think so
    + Bat`O: what about showing your changes done since it was merged?
    +* Bat`O need to get back to work
    + kevin, maybe just "do SWM", but certainly nothing beyond that
    + mitch: you mean, merge my branch to master ?
    + Anyone has any objection to lock the official meeting?
    + Bat`O: no, getting it past my evil review
    + I see 5 reports re: SWM
    + i'm not against
    + but there is still a bad bug i need to kill
    + kevin, I could be wrong :o)
    + i want one patch to try to apply
    + It'd be awesome if I were
    + one patch where i can clearly see the changes, not some evil git diff against a non-rebased branch
    + xsdg: I think you might be right that there isn't a tracking bug. 
    +
    +
    diff --git a/wiki/Hacking:Dev_Meeting_28_Mar_2011-20150911043918-edit.txt b/wiki/Hacking:Dev_Meeting_28_Mar_2011-20150911043918-edit.txt new file mode 100644 index 0000000..ad4603e --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_28_Mar_2011-20150911043918-edit.txt @@ -0,0 +1,57 @@ +Meeting page for the Developer Meeting which will take place in the GIMP IRC on March 28th 2011, 10:00 PM CET (For time zone conversions, see [http://www.timeanddate.com/worldclock/fixedtime.html?month=3&day=28&year=2011&hour=22&min=0&sec=0&p1=48 here]) + +'''Time for Next Meeting(?):''' April 14 2011, 10:00 PM CET + +__TOC__ + +==Agenda== + +===GSoC Student Applications=== +Official GSoC applications should start coming in on march 28 19:00 utc - that's 2 hours before the meeting should begin. Also, we already have student applications on the mailing list. Some suggestions were made on putting minimal student requirements (not sure how practical this is) and some suggested creating some quick start guides for new developers. Do we want to do anything to get students started? +BTW, since this is the developer wiki, such content should be placed here! + +Rating of students should be done after April 8 (student application deadline) and finish on April 22, so this can be done on the next meeting. + +For obvious reason, the writer of these lines (who applies for GSoC himself) will not participate in that part of the discussion. + +===Optional topic: Re-Discussing GIMP's programming language=== +Some developers that weren't present in the last meeting, highly disagree on the attempt to introduce vala into gimp, claiming that it will scare off developers (more than the "simple" C GObject code). '''Please see the topic thread on the mailing list!''' + +We should seperate this for: +* GUI - Maybe try to use GtkBuilder and friends in more places, instead of a new language? +* Core + +Also, we should discuss the reason for such act (GObject glue code is "annoying", or something else?) + +===Default JPEG Quality=== +As someone suggested on irc a week ago, we should probably raise the default quality for jpeg images in gimp. Disk space and bandwidth are bigger today than before, and the current default quality is rather noisy. +Hopefully just a yes/no vote, nothing more than that (unless there are some other plugins which have quality parameters). + +===bringing UI crew to LGM=== +UI team gets build as we speak, can they come to LGM. would be good. + +===Resource management for 2.8=== +Where are we with new brushes, patterns, etc.? + +===Anything else? === +Tell LightningIsMyName and he'll add it :) + +==Decided Actions== +* GSoC Student Applications +** Core developers sign up as mentors (for GSoC) +** schumaml: Write mail about application is open, and required skills, and required code example +* Re-Discussing GIMP's programming language +** For core (non-UI), continue using GObject, use code generators (such as [http://git.gnome.org/browse/turbine/ turbine]) and do copy/paste/replace for existing GObject classes (for the rare case where the generator won't be enough). +** For UI, porting widgets to GtkBuilder is an option (and then we'll use Glade and UI xml files), but any action on the UI is postponed until we get 3.0 out! +* Default JPEG Quality (quickie, not a real topic) +** Change to 95 2x1, and add a hack to save defaults (using something like the PNG plugin does, or something more elegant). Note that a decent system to save plugin defaults, along with other api changes, is not something that will happen for 2.8. +* bringing UI crew to LGM +** Will be discussed with mitch and schumaml on the financial aspect (using gimp funds) when the team is fully assembled (parts of it are already assembled - hurray for guiguru and congrats for the new team memebers!) +* Resource management for 2.8 +** One member of the new UI team (lead by guiguru) will take care of that + +==Meeting Log== +No propper meeting logs, since the discussion included lots of off-topic stuff, and many of that should be filtered... +Important off-topic points from the meeting, in addition to the decided actions above: +* Seems as if most GIMP team can't attend LGM this year, but there may be a GIMP village in the [http://events.ccc.de/2010/08/10/chaos-communication-camp-2011/ Chaos Communication Camp] as most developers want to attend it +* UI team members will start hanging on IRC once the team is assembled. Many developers suggested help in setting them up with build environments and every other thing they need. This will happen soon, so be nice to the new guys ;) diff --git a/wiki/Hacking:Dev_Meeting_28_Mar_2011-20161024002630-show.txt b/wiki/Hacking:Dev_Meeting_28_Mar_2011-20161024002630-show.txt new file mode 100644 index 0000000..67e7470 --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_28_Mar_2011-20161024002630-show.txt @@ -0,0 +1,92 @@ + + +Meeting page for the Developer Meeting which will take place in the GIMP IRC on March 28th 2011, 10:00 PM CET (For time zone conversions, see [http://www.timeanddate.com/worldclock/fixedtime.html?month=3&day=28&year=2011&hour=22&min=0&sec=0&p1=48 here]) + +'''Time for Next Meeting(?):''' April 14 2011, 10:00 PM CET + + +__TOC__ + +==Agenda== + +===GSoC Student Applications=== + +Official GSoC applications should start coming in on march 28 19:00 utc - that's 2 hours before the meeting should begin. Also, we already have student applications on the mailing list. Some suggestions were made on putting minimal student requirements (not sure how practical this is) and some suggested creating some quick start guides for new developers. Do we want to do anything to get students started? +BTW, since this is the developer wiki, such content should be placed here! + +Rating of students should be done after April 8 (student application deadline) and finish on April 22, so this can be done on the next meeting. + +For obvious reason, the writer of these lines (who applies for GSoC himself) will not participate in that part of the discussion. + + +===Optional topic: Re-Discussing GIMP's programming language=== + +Some developers that weren't present in the last meeting, highly disagree on the attempt to introduce vala into gimp, claiming that it will scare off developers (more than the "simple" C GObject code). '''Please see the topic thread on the mailing list!''' + +We should seperate this for: + + +* GUI - Maybe try to use GtkBuilder and friends in more places, instead of a new language? +* Core + +Also, we should discuss the reason for such act (GObject glue code is "annoying", or something else?) + + +===Default JPEG Quality=== + +As someone suggested on irc a week ago, we should probably raise the default quality for jpeg images in gimp. Disk space and bandwidth are bigger today than before, and the current default quality is rather noisy. +Hopefully just a yes/no vote, nothing more than that (unless there are some other plugins which have quality parameters). + + +===bringing UI crew to LGM=== + +UI team gets build as we speak, can they come to LGM. would be good. + + +===Resource management for 2.8=== + +Where are we with new brushes, patterns, etc.? + + +===Anything else?=== + +Tell LightningIsMyName and he'll add it :) + + +==Decided Actions== + +* GSoC Student Applications +** Core developers sign up as mentors (for GSoC) +** schumaml: Write mail about application is open, and required skills, and required code example +** Core developers sign up as mentors (for GSoC) +** schumaml: Write mail about application is open, and required skills, and required code example +* Core developers sign up as mentors (for GSoC) +* schumaml: Write mail about application is open, and required skills, and required code example +* Re-Discussing GIMP's programming language +** For core (non-UI), continue using GObject, use code generators (such as [http://git.gnome.org/browse/turbine/ turbine]) and do copy/paste/replace for existing GObject classes (for the rare case where the generator won't be enough). +** For UI, porting widgets to GtkBuilder is an option (and then we'll use Glade and UI xml files), but any action on the UI is postponed until we get 3.0 out! +** For core (non-UI), continue using GObject, use code generators (such as [http://git.gnome.org/browse/turbine/ turbine]) and do copy/paste/replace for existing GObject classes (for the rare case where the generator won't be enough). +** For UI, porting widgets to GtkBuilder is an option (and then we'll use Glade and UI xml files), but any action on the UI is postponed until we get 3.0 out! +* For core (non-UI), continue using GObject, use code generators (such as [http://git.gnome.org/browse/turbine/ turbine]) and do copy/paste/replace for existing GObject classes (for the rare case where the generator won't be enough). +* For UI, porting widgets to GtkBuilder is an option (and then we'll use Glade and UI xml files), but any action on the UI is postponed until we get 3.0 out! +* Default JPEG Quality (quickie, not a real topic) +** Change to 95 2x1, and add a hack to save defaults (using something like the PNG plugin does, or something more elegant). Note that a decent system to save plugin defaults, along with other api changes, is not something that will happen for 2.8. +** Change to 95 2x1, and add a hack to save defaults (using something like the PNG plugin does, or something more elegant). Note that a decent system to save plugin defaults, along with other api changes, is not something that will happen for 2.8. +* Change to 95 2x1, and add a hack to save defaults (using something like the PNG plugin does, or something more elegant). Note that a decent system to save plugin defaults, along with other api changes, is not something that will happen for 2.8. +* bringing UI crew to LGM +** Will be discussed with mitch and schumaml on the financial aspect (using gimp funds) when the team is fully assembled (parts of it are already assembled - hurray for guiguru and congrats for the new team memebers!) +** Will be discussed with mitch and schumaml on the financial aspect (using gimp funds) when the team is fully assembled (parts of it are already assembled - hurray for guiguru and congrats for the new team memebers!) +* Will be discussed with mitch and schumaml on the financial aspect (using gimp funds) when the team is fully assembled (parts of it are already assembled - hurray for guiguru and congrats for the new team memebers!) +* Resource management for 2.8 +** One member of the new UI team (lead by guiguru) will take care of that +** One member of the new UI team (lead by guiguru) will take care of that +* One member of the new UI team (lead by guiguru) will take care of that + +==Meeting Log== + +No propper meeting logs, since the discussion included lots of off-topic stuff, and many of that should be filtered... +Important off-topic points from the meeting, in addition to the decided actions above: + + +* Seems as if most GIMP team can't attend LGM this year, but there may be a GIMP village in the [http://events.ccc.de/2010/08/10/chaos-communication-camp-2011/ Chaos Communication Camp] as most developers want to attend it +* UI team members will start hanging on IRC once the team is assembled. Many developers suggested help in setting them up with build environments and every other thing they need. This will happen soon, so be nice to the new guys ;) diff --git a/wiki/Hacking:Dev_Meeting_28_Mar_2011-20210417225721-edit.txt b/wiki/Hacking:Dev_Meeting_28_Mar_2011-20210417225721-edit.txt new file mode 100644 index 0000000..ad4603e --- /dev/null +++ b/wiki/Hacking:Dev_Meeting_28_Mar_2011-20210417225721-edit.txt @@ -0,0 +1,57 @@ +Meeting page for the Developer Meeting which will take place in the GIMP IRC on March 28th 2011, 10:00 PM CET (For time zone conversions, see [http://www.timeanddate.com/worldclock/fixedtime.html?month=3&day=28&year=2011&hour=22&min=0&sec=0&p1=48 here]) + +'''Time for Next Meeting(?):''' April 14 2011, 10:00 PM CET + +__TOC__ + +==Agenda== + +===GSoC Student Applications=== +Official GSoC applications should start coming in on march 28 19:00 utc - that's 2 hours before the meeting should begin. Also, we already have student applications on the mailing list. Some suggestions were made on putting minimal student requirements (not sure how practical this is) and some suggested creating some quick start guides for new developers. Do we want to do anything to get students started? +BTW, since this is the developer wiki, such content should be placed here! + +Rating of students should be done after April 8 (student application deadline) and finish on April 22, so this can be done on the next meeting. + +For obvious reason, the writer of these lines (who applies for GSoC himself) will not participate in that part of the discussion. + +===Optional topic: Re-Discussing GIMP's programming language=== +Some developers that weren't present in the last meeting, highly disagree on the attempt to introduce vala into gimp, claiming that it will scare off developers (more than the "simple" C GObject code). '''Please see the topic thread on the mailing list!''' + +We should seperate this for: +* GUI - Maybe try to use GtkBuilder and friends in more places, instead of a new language? +* Core + +Also, we should discuss the reason for such act (GObject glue code is "annoying", or something else?) + +===Default JPEG Quality=== +As someone suggested on irc a week ago, we should probably raise the default quality for jpeg images in gimp. Disk space and bandwidth are bigger today than before, and the current default quality is rather noisy. +Hopefully just a yes/no vote, nothing more than that (unless there are some other plugins which have quality parameters). + +===bringing UI crew to LGM=== +UI team gets build as we speak, can they come to LGM. would be good. + +===Resource management for 2.8=== +Where are we with new brushes, patterns, etc.? + +===Anything else? === +Tell LightningIsMyName and he'll add it :) + +==Decided Actions== +* GSoC Student Applications +** Core developers sign up as mentors (for GSoC) +** schumaml: Write mail about application is open, and required skills, and required code example +* Re-Discussing GIMP's programming language +** For core (non-UI), continue using GObject, use code generators (such as [http://git.gnome.org/browse/turbine/ turbine]) and do copy/paste/replace for existing GObject classes (for the rare case where the generator won't be enough). +** For UI, porting widgets to GtkBuilder is an option (and then we'll use Glade and UI xml files), but any action on the UI is postponed until we get 3.0 out! +* Default JPEG Quality (quickie, not a real topic) +** Change to 95 2x1, and add a hack to save defaults (using something like the PNG plugin does, or something more elegant). Note that a decent system to save plugin defaults, along with other api changes, is not something that will happen for 2.8. +* bringing UI crew to LGM +** Will be discussed with mitch and schumaml on the financial aspect (using gimp funds) when the team is fully assembled (parts of it are already assembled - hurray for guiguru and congrats for the new team memebers!) +* Resource management for 2.8 +** One member of the new UI team (lead by guiguru) will take care of that + +==Meeting Log== +No propper meeting logs, since the discussion included lots of off-topic stuff, and many of that should be filtered... +Important off-topic points from the meeting, in addition to the decided actions above: +* Seems as if most GIMP team can't attend LGM this year, but there may be a GIMP village in the [http://events.ccc.de/2010/08/10/chaos-communication-camp-2011/ Chaos Communication Camp] as most developers want to attend it +* UI team members will start hanging on IRC once the team is assembled. Many developers suggested help in setting them up with build environments and every other thing they need. This will happen soon, so be nice to the new guys ;) diff --git a/wiki/Hacking:Developer_FAQ-20170710205211-show.txt b/wiki/Hacking:Developer_FAQ-20170710205211-show.txt new file mode 100644 index 0000000..faeacf1 --- /dev/null +++ b/wiki/Hacking:Developer_FAQ-20170710205211-show.txt @@ -0,0 +1,465 @@ + + +Below you find a collection of frequently asked questions regarding development of the GIMP. +If you find questions that are not answered yet, then feel free to change it! + + +__TOC__ + +=GIMP Development= + +==How can I support GIMP development?== + +By using GIMP and reporting any bugs you find to Bugzilla you're helping a great deal. But there are other non-technical ways of supporting the development of The GIMP as well. + +GIMP has a web site, application documentation, lots of tutorials, and more. Unfortunately, as GIMP develops over time, much of this documentation needs to be re-written or freshened up, documentation needs to be added for new functionality, the web site needs to get a new lick of paint and so on. + +If you're interested in helping out you should drop an e-mail to the GIMP developer mailing list offering your help. + +Currently the top priority in development is [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL porting all plugins to GEGL] and making GEGL faster. + +You can also have a look at bug reports filed for GIMP and pick something. You can use [https://bugzilla.gnome.org/browse.cgi?product=GIMP bugzilla] to find bug reports you could take care of, but we encourage you contacting us beforehand to find out if the task you picked is still valid. It's best to discuss working on something in either mailing list or IRC channel before beginning to fix things and implement features. This is because requests have to be checked against bigger design decisions. We'd hate if you wasted your time on something that shouldn't have been done. + +Major planned changes are listed at the [[GIMP_Roadmap|feature roadmap]] page. Some miscellaneous ideas are [https://wiki.gimp.org/index.php?title=Mindstorm:Misc_TODO%27s&action=edit&redlink=1 here] + +Contacting the team is essential when starting to solve bugs or realizing enhancements/features. + + +==Which GIMP related projects can I contribute to?== + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/babl babl] | Pixel format conversion library +|- +| [https://git.gnome.org/browse/gegl gegl] | Generic Graphical Library +|- +| [https://git.gnome.org/browse/gimp gimp] | GIMP and the standard set of plug-ins +|- +| [https://git.gnome.org/browse/gimp-data-extras gimp-data-extras] | GIMP Data files such as brushes, gradients, patterns and the like +|- +| [https://git.gnome.org/browse/gimp-gap gimp-gap]| GIMP Animation Package, a set of plug-ins that provide video editing functionality +|- +| [https://git.gnome.org/browse/gimp-help-2 gimp-help-2]| GIMP User Manual +|- +| [https://git.gnome.org/browse/gimp-perl gimp-perl] | GIMP Perl bindings and a bunch of nice gimp-perl scripts +|- +| [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template] | GIMP Plug-In Template, a starting ground for plug-in developers +|- +| [https://git.gnome.org/browse/gimp-ruby gimp-ruby] | GIMP Ruby-based scripting plug-in +|- +| [https://git.gnome.org/browse/gimp-tiny-fu gimp-tiny-fu] | GIMP Tiny-Fu, a drop-in replacement for Script-Fu +|- +| [https://git.gnome.org/browse/gimp-web gimp-web]| the GIMP web site, available at www.gimp.org +|- +| [https://git.gnome.org/browse/gimp-web-devel gimp-web-devel] | the source of developer.gimp.org (currently being migrated to this wiki) +|} + + +There are also some archived projects: + + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/archive/gimp-data-min gimp-data-min] | The archive of data files for GIMP, such as brushes, palettes and patterns. +|- +| [https://git.gnome.org/browse/archive/gimp-help gimp-help] | The archive of the former GIMP help. Obsolete, please use [https://git.gnome.org/browse/gimp-help-2 gimp-help-2] instead. +|- +| [https://git.gnome.org/browse/archive/gimp-plugins-unstable gimp-plugins-unstable] | GIMP plug-ins from the past, a collection of unstable and unmaintained plug-ins. +|- +| [https://git.gnome.org/browse/archive/gimp-resource-repository gimp-resource-repository] | GIMP Resource Repository, a proposal for GIMP's GSoC participation 2003. +|- +| [https://git.gnome.org/browse/archive/gimp2 gimp2] | Archived brainstorm for the technical architecture of GIMP2. +|} + +They have been unmaintained for long and the chances to get support for them are quite low. + + +==What should I know when starting with open source development?== + +If you're new to open source development, the article [http://schlitt.info/opensource/blog/0541_10_golden_rules_for_starting_with_open_source.html '10 golden rules for starting with open source'] from Tobias Schlitt offers useful and worth knowing hints. + + +==Who coordinates GIMP development?== + +GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list]. + + +==Who is planning Gimp's development?== + +GIMP team's approach to planning is a little different. We do not have time-based schedules, instead we rely on a [[GIMP_Roadmap|feature roadmap]]. + +We use Git branches for developing major new features. If a feature is ready for inclusion into the main branch, it is merged. The decision, whether it's ready, is made by the core team (currently: mitch, Alexia), typically on IRC. + + +==How can I become a GIMP developer?== + +If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. Pick a bug, perhaps ask the advice of another developer as to whether he/she thinks it will be an easy bug or not, and then fix it. Sounds easy, doesn't it? + +After helping with a couple of bugs, people will start to recognize your immense talent, and you will be on your way to becoming a GIMP developer. Any time you feel able, you can pick a smaller enhancement request and have a go at implementing it. It's that easy. + +For more information see also the developer documentation. + + +==Where should I go for help when I need it?== + +There are several channels of communication: + + +# GIMP developer IRC channel: irc://irc.gimp.org/#gimp. Users without IRC client can connect using one of the many online IRC clients, such as: [http://mibbit.com/?channel=%23gimp&server=irc.gimp.org Mibbit]. +# [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP mailing list for developers] (gimp-developer-list |at| gnome.org), but it's of course slower than IRC. + +See also the [http://www.gimp.org/mail_lists.html overview of Gimp mailing lists]. + + + + + +==Where can I discuss GIMP development?== + +There are [http://www.gimp.org/mail_lists.html several mailing lists] associated with the GIMP project. Developments related issues can be brought up on the [[https://mail.gnome.org/mailman/listinfo/gimp-developer-list https://mail.gnome.org/mailman/listinfo/gimp-developer-list] GIMP developer mailing list. + +GIMP has its own IRC channel on GIMPNet where most of the active developers hang out. Join us in #gimp on irc.gimp.org. + +Once in a year the developers of GIMP and other open source graphics software get together to throw the [http:///www.libregraphicsmeeting.org LibreGraphicsMeeting], formerly known as GIMPCon. To see what's going on there see the [[Main_Page#Developer_Meetings|summaries of the former meetings]]. + + +==Where can I find documentation for the GIMP API?== + +There are several ways, see [[Hacking:API documentation]]. + + +==How do I make a stack trace?== + +A stack trace is a list of function calls that leads to some point in the program. Debugging tools like gdb can get stack traces from crashed applications so that developers can figure out what went wrong. By including a stack trace with your bug report, it will be much easier for the developers to fix the reported problem. + +Information on how to make a stack trace can be found in the document [https://wiki.gnome.org/action/show/GettingInTouch/Bugzilla/GettingTraces?action=show Capturing Stack Traces]. + + +==What is the best way to submit a patch?== + +The best way to submit a patch is to open a bug report in Bugzilla and attach the patch there along with a description of what it does and why it should be applied. + +An introduction to how this is done can be found in the [http://www.gimp.org/bugs/howtos/submit-patch.html How To Create and Submit a Patch document]. This page describes how you can submit a patch. You can also post it to the mailing lists '''GIMP Developer''' or '''GEGL Developer''', but this only applies to very small patches (at maximum 10 KB). + + +==What is the preferred coding style used in GIMP?== + +See our [[Glossary#Hackordnung| Hackordnung]]. + + +==How can I configure my editor for this coding style?== + +Your editor will not be able to do everything for you, but you can configure most editors so that they use two spaces for indentation, use spaces instead of tabs, etc. + +If you are using Emacs, you can insert the following settings into your ~/.emacs file: + +
       ;; Merge this into your custom-set-variables section if you already have one
    +   (custom-set-variables
    +    ;; Syntax highlighting
    +    '(global-font-lock-mode t nil (font-lock))
    +    '(show-paren-mode t nil (paren))
    +   )
    +   ;; use UTF-8 by default
    +   (prefer-coding-system 'mule-utf-8)
    +   ;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces
    +   (setq c-mode-common-hook '(lambda () (c-set-style "gnu")
    +                               (setq indent-tabs-mode nil)
    +                               (setq show-trailing-whitespace t))) 
    +
    + +If you are using Vim, you can insert the following settings into your ~/.vimrc file: + +
       syn on           " syntax highlighting
    +   set expandtab    " use spaces instead of tabs
    +   set shiftwidth=2 " default indentation is 2 spaces 
    +
    + +If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ. + + +==Who coordinates the GIMP translation efforts?== + +Any help with translations is appreciated. If you want to help, please get in contact with the people from the [http://live.gnome.org/TranslationProject GNOME Translation Project] who coordinate all translation efforts for projects hosted in the GNOME GIT repository. + +More information about GIMP and localisation can be found in the file [https://git.gnome.org/browse/gimp/plain/README.i18n README.i18n]. + + +==Where do I find the code?== + +The GIMP source code lives in the [https://git.gnome.org/browse/gimp gimp] repository on the [https://git.gnome.org/browse/ GNOME git server]. + +The current production branch has the name of the current version, i.e. gimp-2-8. Bugfixes go here. + +The branch 'master' is the development branch. This is the place for bugfixes and new features. + +See also 'Which GIMP related projects can I contribute to?' + + + + +==What's the best way to download, compile and keep up-to-date Gimp's source code?== + +===Compiling GIMP=== + +# General: [[Hacking:Building]] +# Additional descriptions for Linux: [[Hacking:Building/Linux]] + + + + +===Short guide:=== + +# Pull the sources down from git. +# Configure and make babl. +# Configure and make gegl. +# Configure and make gimp. + +===Installing needed libraries on Ubuntu=== +
    apt-get build-dep gimp
    +
    + + + + +===Links to more detailed descriptions:=== + +* [http://www.graphics-muse.org/artistsguide/?p=247 http://www.graphics-muse.org/artistsguide/?p=247] +* [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html] +* [http://lightningismyname.blogspot.com/p/compiling-gimp.html http://lightningismyname.blogspot.com/p/compiling-gimp.html] + +===How to compile Gimp for Windows?=== + +The chapter [[Hacking:Building/Windows]] approaches this topic in detail. + + +==What are planned deadlines for next edititons of Gimp? Are there any?== + +Once we have a bigger team, we probably will have deadlines. At this point we don't have the resources to plan time-based releases. + + +==What were the last changes in the code?== + +[https://git.gnome.org/browse/gimp/log/?h=gimp-2-8 GIMP 2.8] +[https://git.gnome.org/browse/gimp/log/ GIMP master (the development version)] + + +=Plug-In Development= + +==How can I get started with developing plug-ins?== + +See [[Hacking:Plugins| How to write a GIMP plug-in]]. + + +==Is there a plug-in template available?== + +Yes. An official GIMP plug-in template is available in the [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template git module]. Snapshots are available at ftp.gimp.org. + + +==How about a Script-Fu template?== + +Yes. Simon Budig has written a fill-in-the-blanks Script-Fu template which is available [http://www.home.unix-ag.org/simon/files/script-fu-template.scm here]. + + +==How do I get my plug-in included in the GIMP?== + +The best way to make your plug-in available to the World is to submit it to the [http://registry.gimp.org/ GIMP Plug-In Registry]. + +If you are certain that your plug-in will be useful to all GIMP users, then you can ask the GIMP developers to consider it for inclusion in future GIMP release. The best way to do that is to suggest it on the GIMP developer mailing list or to open an enhancement request in Bugzilla. However, we would like to limit the number of plug-ins included in the standard distribution and encourage all users to use the registry. + + +==How do I debug a GIMP plug-in?== + +Eeek! The plug-in you're working on has a bug in it! And the fix isn't completely obvious, so you want to use debugger to see what is going on. But hmm, how does one start a plug-in under a debugger if GIMP is the one who is starting the plug-in... + +To address this issue, libgimp has some hooks controlled by the '''GIMP_PLUGIN_DEBUG''' environment variable. The idea is that you can attach a debugger to the pid of the plug-in you want to debug. The process is described in the file debug-plug-ins.txt. + + +==Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4?== + +The short answer is yes. GIMP 2.2 and 2.4 are binary compatible with plug-ins compiled for GIMP 2.0. The API is also backwards source compatible, so your plug-in should also compile cleanly against GIMP 2.2 and 2.4. + +If the plug-in you compiled for 2.0 does not work with 2.2 or 2.4, there is one change which has been made which is not backwards compatible, since the old behaviour was considered incorrect. If you create a temporary drawable, using for example gimp_layer_new(), you are now required to add it to an image before calling any functions with the drawable as an argument. + + +=GEGL= + +==What is GEGL?== + +GEGL is the [http://www.gegl.org/ Generic Graphical Library]. It is supposed to replace the handling of various image processing tasks in GIMP in a not too distant future (planned for GIMP 2.10). + + +==What will GEGL be able to do?== + +GEGL will be a general image processing library. It uses a directed acyclic graph, a DAG, to represent image processing operations. In the DAG, images are edges, and operations are nodes. It takes advantage of this DAG to minimize regions which are processed, provide efficient caching of operations, and efficient redrawing when a parameter of the graph changes. + +GEGL should also be independent of the data type being processed and will be able to handle high bit depth images, ICC profiles and parallel processing of image tiles. + + +==Where to contribute to the future of GEGL?== + +You can find a good start for GEGL here: +[http://gegl.org/contribute.html http://gegl.org/contribute.html] + + +==What does all that gibberish mean for GIMP?== + +Many highly requested features of the GIMP will be easier to do using GEGL. Layer effects, layer groups, and adjustment layers are quite easily represented (and efficiently calculated) using the DAG organization of GEGL. CMYK and high bit depth support will be easier because GEGL does not make the same assumptions about color spaces and data types that the GIMP does. + +The reusability of image processing operations means that plug-ins will be able to be designed in a much more modular way. The brush system will be able to become more flexible, especially when filter plug-ins are able to be used as procedural brush plug-ins. + + + + + +=Bugzilla= + +==What is Bugzilla?== + +The GIMP project uses GNOME Bugzilla for tracking of bug reports, enhancement requests etc. + +A beginners tutorial describing how to report a bug can be found in the [http://www.gimp.org/bugs/howtos/bugzilla.html How To Report GIMP Bugs] document. + + + + + +==What is the meaning of the NEEDINFO status code in Bugzilla?== + +If the status of a bug is changed to NEEDINFO it means the GIMP developers need more information from the bug reporter in order to resolve the bug. + +More information about the meaning of the Bugzilla status field codes can be found in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle]. + + +==What is the best way to refer to a bug in Bugzilla?== + +The best way to refer to a bug is “bug #nnnnn”, where nnnnn is the bug number. Using “bug” before the number allows Bugzilla to link to the corresponding bug report automatically. Using “#” before the number is optional for Bugzilla but makes it easier to locate references to bug reports in the ChangeLog or in e-mails. + +When referencing multiple bugs, it is better to be a bit redundant by writing “bug #xxxxx, bug #yyyyy and bug #zzzzz” instead of “bugs #xxxxx, #yyyyy and #zzzzz” in order to allow Bugzilla to link all bugs automatically. + + +==What is the proper way of handling duplicate bug reports?== + +A bug report describing the same bug as a previous bug report should be marked as DUPLICATE of the older one. In some exceptional cases, it is possible to mark an old bug report as DUPLICATE of a newer one (e.g., when the newer bug report has a significantly better description than the older one). + +Another exception is when the same person submits the same bug report several times (same description): in this case, it is better to mark the additional copies of the bug report as INVALID in order to avoid inflating the statistics about the number of duplicates. + + +==What is the proper way of marking a bug as RESOLVED?== + +When fixing a bug, always mention the bug number in the commit message. Once the changes are in git, paste the relevant part of the commit message (or all of it) in the comment field and mark the bug as RESOLVED FIXED. These cross-references help a lot when trying to find when a bug was fixed, its relations to other bugs, and potential regressions. + +A bug that is fixed in git or in an unstable release should be marked as RESOLVED FIXED. Optionally, the reporter or someone other than the one who fixed the bug can mark it as VERIFIED after some testing. When the fix is part of a stable release, it can be marked as CLOSED. + +This is explained further in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle] except for the difference between stable and unstable releases. + + + + + +=GIT= + +==How can I learn more about using git?== + +[https://wiki.gnome.org/Git Here] you find more information, including links to Git tutorials. + + +==How do I commit to the Git tree?== + +GIMP uses GNOME's Git repository for source code storage. Please read their [https://live.gnome.org/NewAccounts guidelines]. + +Please note that much like GNOME we want to work with you for a while before we can confirm that you are going to make a great upstream developer. Until then you can maintain your own branch on Github or Gitorious. + +We also wrote a guide on [[Hacking:Patches|submitting patches]]. + + +==What should I put in the commit message when doing a git commit?== + +Please put a short explanation of the change on the first line. Then, after an empty line, you can describe the change in more detail using as many lines as you need. Try not to exceed 72 colums. + +If the commit fixes a bug or part of a bug please use the bug number and description as the first line of the commit message. It's most convenient to just copy the line from the Bugzilla bug page. + + +==How can I add such a nicely formatted summary of my commit to a bug report?== + +If your commit is the latest commit on the branch, use + +
     git show --stat
    +
    + +If you want to output a particular commit, use + +
     git show --stat 1234567 (where 1234567 is the SHA1 hash of this commit)
    +
    + + +The output looks like: + +
    +commit 9b6201e2806920e66602302bfee3ae1341f38bd4
    +Author: John Doe 
    +Date:   Sat Feb 1 08:45:21 2010 +0100
    +
    +    Bug 8154711 - Add more tutorial links.
    +    
    +    Add more links to tutorial sites.
    +
    + links/index.htrw | 11 ++++++++++-
    + 1 file changed, 10 insertions(+), 1 deletion(-)
    +
    + +=Miscellaneous= + +==Where can I learn more about the GObject system used by GIMP?== + +The [https://developer.gnome.org/gobject/stable/ GObject documentation] has a nice [https://developer.gnome.org/gobject/stable/howto-gobject.html tutorial] that you might want to have a look at. + + +==Where can I learn more about color spaces, color space conversions and other color science topics?== + +Unfortunately, the theoretical foundations of colors and their internal representation +are not as easy as seeing them in nature. Elle Stone wrote [http://ninedegreesbelow.com/photography/xyz-rgb.html a good documentation of color spaces] which is recommended reading. + +Charles Poynton has collected a set of [http://www.poynton.com/ColorFAQ.html Frequently Asked Questions about Color]. + +In our [[Glossary]] we explain the relevant terms. + + +==Where can I learn more about image manipulation algorithms?== + +A good source of information is the comp.graphics.algorithms list of [http://www.faqs.org/faqs/graphics/algorithms-faq/ Frequently Asked Questions]. + + +==What is ohloh.net for? Why developers are listed there and not on an official Gimp website?== + +The GIMP project itself doesn't maintain a site with an overview of the developers. If you want to know who are most active developers in the project, you can look at [http://www.ohloh.net/p/gimp/contributors?query=&sort=commits_12_mo ohloh.net statistics of the last 12 months]. +Ohloh.net is free, public directory, a web service and online community platform that aims to map the landscape of open source development (see [http://en.wikipedia.org/w/index.php?title=Ohloh&oldid=495142279 the description in the English Wikipedia]). It collects information from public available source code repositories and creates statistics from it. +To read more about ohloh.net, visit [http://meta.ohloh.net/us/ the ohloh.net self-introduction] . + + +==What is buildbot? How to use Buildbot for GIMP?== + +Why is it on [https://gimptest.flamingtext.com:9090/ https://gimptest.flamingtext.com:9090/] and not on official Gimp's website? + +What are the most common uses of the Buildbot? + +TODO + + +==Is there a GIMP user FAQ available?== + +Yes, you find it [http://www.gimp.org/docs/userfaq.html here]. + + +==How can I contribute to this FAQ?== + +If you would like to contribute to this FAQ, send an e-mail to the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list] with the exact text you think should be included (both question and answer). + +With your help this FAQ will grow and become more useful. + + \ No newline at end of file diff --git a/wiki/Hacking:Developer_FAQ-20201115193707-show.txt b/wiki/Hacking:Developer_FAQ-20201115193707-show.txt new file mode 100644 index 0000000..faeacf1 --- /dev/null +++ b/wiki/Hacking:Developer_FAQ-20201115193707-show.txt @@ -0,0 +1,465 @@ + + +Below you find a collection of frequently asked questions regarding development of the GIMP. +If you find questions that are not answered yet, then feel free to change it! + + +__TOC__ + +=GIMP Development= + +==How can I support GIMP development?== + +By using GIMP and reporting any bugs you find to Bugzilla you're helping a great deal. But there are other non-technical ways of supporting the development of The GIMP as well. + +GIMP has a web site, application documentation, lots of tutorials, and more. Unfortunately, as GIMP develops over time, much of this documentation needs to be re-written or freshened up, documentation needs to be added for new functionality, the web site needs to get a new lick of paint and so on. + +If you're interested in helping out you should drop an e-mail to the GIMP developer mailing list offering your help. + +Currently the top priority in development is [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL porting all plugins to GEGL] and making GEGL faster. + +You can also have a look at bug reports filed for GIMP and pick something. You can use [https://bugzilla.gnome.org/browse.cgi?product=GIMP bugzilla] to find bug reports you could take care of, but we encourage you contacting us beforehand to find out if the task you picked is still valid. It's best to discuss working on something in either mailing list or IRC channel before beginning to fix things and implement features. This is because requests have to be checked against bigger design decisions. We'd hate if you wasted your time on something that shouldn't have been done. + +Major planned changes are listed at the [[GIMP_Roadmap|feature roadmap]] page. Some miscellaneous ideas are [https://wiki.gimp.org/index.php?title=Mindstorm:Misc_TODO%27s&action=edit&redlink=1 here] + +Contacting the team is essential when starting to solve bugs or realizing enhancements/features. + + +==Which GIMP related projects can I contribute to?== + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/babl babl] | Pixel format conversion library +|- +| [https://git.gnome.org/browse/gegl gegl] | Generic Graphical Library +|- +| [https://git.gnome.org/browse/gimp gimp] | GIMP and the standard set of plug-ins +|- +| [https://git.gnome.org/browse/gimp-data-extras gimp-data-extras] | GIMP Data files such as brushes, gradients, patterns and the like +|- +| [https://git.gnome.org/browse/gimp-gap gimp-gap]| GIMP Animation Package, a set of plug-ins that provide video editing functionality +|- +| [https://git.gnome.org/browse/gimp-help-2 gimp-help-2]| GIMP User Manual +|- +| [https://git.gnome.org/browse/gimp-perl gimp-perl] | GIMP Perl bindings and a bunch of nice gimp-perl scripts +|- +| [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template] | GIMP Plug-In Template, a starting ground for plug-in developers +|- +| [https://git.gnome.org/browse/gimp-ruby gimp-ruby] | GIMP Ruby-based scripting plug-in +|- +| [https://git.gnome.org/browse/gimp-tiny-fu gimp-tiny-fu] | GIMP Tiny-Fu, a drop-in replacement for Script-Fu +|- +| [https://git.gnome.org/browse/gimp-web gimp-web]| the GIMP web site, available at www.gimp.org +|- +| [https://git.gnome.org/browse/gimp-web-devel gimp-web-devel] | the source of developer.gimp.org (currently being migrated to this wiki) +|} + + +There are also some archived projects: + + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/archive/gimp-data-min gimp-data-min] | The archive of data files for GIMP, such as brushes, palettes and patterns. +|- +| [https://git.gnome.org/browse/archive/gimp-help gimp-help] | The archive of the former GIMP help. Obsolete, please use [https://git.gnome.org/browse/gimp-help-2 gimp-help-2] instead. +|- +| [https://git.gnome.org/browse/archive/gimp-plugins-unstable gimp-plugins-unstable] | GIMP plug-ins from the past, a collection of unstable and unmaintained plug-ins. +|- +| [https://git.gnome.org/browse/archive/gimp-resource-repository gimp-resource-repository] | GIMP Resource Repository, a proposal for GIMP's GSoC participation 2003. +|- +| [https://git.gnome.org/browse/archive/gimp2 gimp2] | Archived brainstorm for the technical architecture of GIMP2. +|} + +They have been unmaintained for long and the chances to get support for them are quite low. + + +==What should I know when starting with open source development?== + +If you're new to open source development, the article [http://schlitt.info/opensource/blog/0541_10_golden_rules_for_starting_with_open_source.html '10 golden rules for starting with open source'] from Tobias Schlitt offers useful and worth knowing hints. + + +==Who coordinates GIMP development?== + +GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list]. + + +==Who is planning Gimp's development?== + +GIMP team's approach to planning is a little different. We do not have time-based schedules, instead we rely on a [[GIMP_Roadmap|feature roadmap]]. + +We use Git branches for developing major new features. If a feature is ready for inclusion into the main branch, it is merged. The decision, whether it's ready, is made by the core team (currently: mitch, Alexia), typically on IRC. + + +==How can I become a GIMP developer?== + +If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. Pick a bug, perhaps ask the advice of another developer as to whether he/she thinks it will be an easy bug or not, and then fix it. Sounds easy, doesn't it? + +After helping with a couple of bugs, people will start to recognize your immense talent, and you will be on your way to becoming a GIMP developer. Any time you feel able, you can pick a smaller enhancement request and have a go at implementing it. It's that easy. + +For more information see also the developer documentation. + + +==Where should I go for help when I need it?== + +There are several channels of communication: + + +# GIMP developer IRC channel: irc://irc.gimp.org/#gimp. Users without IRC client can connect using one of the many online IRC clients, such as: [http://mibbit.com/?channel=%23gimp&server=irc.gimp.org Mibbit]. +# [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP mailing list for developers] (gimp-developer-list |at| gnome.org), but it's of course slower than IRC. + +See also the [http://www.gimp.org/mail_lists.html overview of Gimp mailing lists]. + + + + + +==Where can I discuss GIMP development?== + +There are [http://www.gimp.org/mail_lists.html several mailing lists] associated with the GIMP project. Developments related issues can be brought up on the [[https://mail.gnome.org/mailman/listinfo/gimp-developer-list https://mail.gnome.org/mailman/listinfo/gimp-developer-list] GIMP developer mailing list. + +GIMP has its own IRC channel on GIMPNet where most of the active developers hang out. Join us in #gimp on irc.gimp.org. + +Once in a year the developers of GIMP and other open source graphics software get together to throw the [http:///www.libregraphicsmeeting.org LibreGraphicsMeeting], formerly known as GIMPCon. To see what's going on there see the [[Main_Page#Developer_Meetings|summaries of the former meetings]]. + + +==Where can I find documentation for the GIMP API?== + +There are several ways, see [[Hacking:API documentation]]. + + +==How do I make a stack trace?== + +A stack trace is a list of function calls that leads to some point in the program. Debugging tools like gdb can get stack traces from crashed applications so that developers can figure out what went wrong. By including a stack trace with your bug report, it will be much easier for the developers to fix the reported problem. + +Information on how to make a stack trace can be found in the document [https://wiki.gnome.org/action/show/GettingInTouch/Bugzilla/GettingTraces?action=show Capturing Stack Traces]. + + +==What is the best way to submit a patch?== + +The best way to submit a patch is to open a bug report in Bugzilla and attach the patch there along with a description of what it does and why it should be applied. + +An introduction to how this is done can be found in the [http://www.gimp.org/bugs/howtos/submit-patch.html How To Create and Submit a Patch document]. This page describes how you can submit a patch. You can also post it to the mailing lists '''GIMP Developer''' or '''GEGL Developer''', but this only applies to very small patches (at maximum 10 KB). + + +==What is the preferred coding style used in GIMP?== + +See our [[Glossary#Hackordnung| Hackordnung]]. + + +==How can I configure my editor for this coding style?== + +Your editor will not be able to do everything for you, but you can configure most editors so that they use two spaces for indentation, use spaces instead of tabs, etc. + +If you are using Emacs, you can insert the following settings into your ~/.emacs file: + +
       ;; Merge this into your custom-set-variables section if you already have one
    +   (custom-set-variables
    +    ;; Syntax highlighting
    +    '(global-font-lock-mode t nil (font-lock))
    +    '(show-paren-mode t nil (paren))
    +   )
    +   ;; use UTF-8 by default
    +   (prefer-coding-system 'mule-utf-8)
    +   ;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces
    +   (setq c-mode-common-hook '(lambda () (c-set-style "gnu")
    +                               (setq indent-tabs-mode nil)
    +                               (setq show-trailing-whitespace t))) 
    +
    + +If you are using Vim, you can insert the following settings into your ~/.vimrc file: + +
       syn on           " syntax highlighting
    +   set expandtab    " use spaces instead of tabs
    +   set shiftwidth=2 " default indentation is 2 spaces 
    +
    + +If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ. + + +==Who coordinates the GIMP translation efforts?== + +Any help with translations is appreciated. If you want to help, please get in contact with the people from the [http://live.gnome.org/TranslationProject GNOME Translation Project] who coordinate all translation efforts for projects hosted in the GNOME GIT repository. + +More information about GIMP and localisation can be found in the file [https://git.gnome.org/browse/gimp/plain/README.i18n README.i18n]. + + +==Where do I find the code?== + +The GIMP source code lives in the [https://git.gnome.org/browse/gimp gimp] repository on the [https://git.gnome.org/browse/ GNOME git server]. + +The current production branch has the name of the current version, i.e. gimp-2-8. Bugfixes go here. + +The branch 'master' is the development branch. This is the place for bugfixes and new features. + +See also 'Which GIMP related projects can I contribute to?' + + + + +==What's the best way to download, compile and keep up-to-date Gimp's source code?== + +===Compiling GIMP=== + +# General: [[Hacking:Building]] +# Additional descriptions for Linux: [[Hacking:Building/Linux]] + + + + +===Short guide:=== + +# Pull the sources down from git. +# Configure and make babl. +# Configure and make gegl. +# Configure and make gimp. + +===Installing needed libraries on Ubuntu=== +
    apt-get build-dep gimp
    +
    + + + + +===Links to more detailed descriptions:=== + +* [http://www.graphics-muse.org/artistsguide/?p=247 http://www.graphics-muse.org/artistsguide/?p=247] +* [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html] +* [http://lightningismyname.blogspot.com/p/compiling-gimp.html http://lightningismyname.blogspot.com/p/compiling-gimp.html] + +===How to compile Gimp for Windows?=== + +The chapter [[Hacking:Building/Windows]] approaches this topic in detail. + + +==What are planned deadlines for next edititons of Gimp? Are there any?== + +Once we have a bigger team, we probably will have deadlines. At this point we don't have the resources to plan time-based releases. + + +==What were the last changes in the code?== + +[https://git.gnome.org/browse/gimp/log/?h=gimp-2-8 GIMP 2.8] +[https://git.gnome.org/browse/gimp/log/ GIMP master (the development version)] + + +=Plug-In Development= + +==How can I get started with developing plug-ins?== + +See [[Hacking:Plugins| How to write a GIMP plug-in]]. + + +==Is there a plug-in template available?== + +Yes. An official GIMP plug-in template is available in the [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template git module]. Snapshots are available at ftp.gimp.org. + + +==How about a Script-Fu template?== + +Yes. Simon Budig has written a fill-in-the-blanks Script-Fu template which is available [http://www.home.unix-ag.org/simon/files/script-fu-template.scm here]. + + +==How do I get my plug-in included in the GIMP?== + +The best way to make your plug-in available to the World is to submit it to the [http://registry.gimp.org/ GIMP Plug-In Registry]. + +If you are certain that your plug-in will be useful to all GIMP users, then you can ask the GIMP developers to consider it for inclusion in future GIMP release. The best way to do that is to suggest it on the GIMP developer mailing list or to open an enhancement request in Bugzilla. However, we would like to limit the number of plug-ins included in the standard distribution and encourage all users to use the registry. + + +==How do I debug a GIMP plug-in?== + +Eeek! The plug-in you're working on has a bug in it! And the fix isn't completely obvious, so you want to use debugger to see what is going on. But hmm, how does one start a plug-in under a debugger if GIMP is the one who is starting the plug-in... + +To address this issue, libgimp has some hooks controlled by the '''GIMP_PLUGIN_DEBUG''' environment variable. The idea is that you can attach a debugger to the pid of the plug-in you want to debug. The process is described in the file debug-plug-ins.txt. + + +==Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4?== + +The short answer is yes. GIMP 2.2 and 2.4 are binary compatible with plug-ins compiled for GIMP 2.0. The API is also backwards source compatible, so your plug-in should also compile cleanly against GIMP 2.2 and 2.4. + +If the plug-in you compiled for 2.0 does not work with 2.2 or 2.4, there is one change which has been made which is not backwards compatible, since the old behaviour was considered incorrect. If you create a temporary drawable, using for example gimp_layer_new(), you are now required to add it to an image before calling any functions with the drawable as an argument. + + +=GEGL= + +==What is GEGL?== + +GEGL is the [http://www.gegl.org/ Generic Graphical Library]. It is supposed to replace the handling of various image processing tasks in GIMP in a not too distant future (planned for GIMP 2.10). + + +==What will GEGL be able to do?== + +GEGL will be a general image processing library. It uses a directed acyclic graph, a DAG, to represent image processing operations. In the DAG, images are edges, and operations are nodes. It takes advantage of this DAG to minimize regions which are processed, provide efficient caching of operations, and efficient redrawing when a parameter of the graph changes. + +GEGL should also be independent of the data type being processed and will be able to handle high bit depth images, ICC profiles and parallel processing of image tiles. + + +==Where to contribute to the future of GEGL?== + +You can find a good start for GEGL here: +[http://gegl.org/contribute.html http://gegl.org/contribute.html] + + +==What does all that gibberish mean for GIMP?== + +Many highly requested features of the GIMP will be easier to do using GEGL. Layer effects, layer groups, and adjustment layers are quite easily represented (and efficiently calculated) using the DAG organization of GEGL. CMYK and high bit depth support will be easier because GEGL does not make the same assumptions about color spaces and data types that the GIMP does. + +The reusability of image processing operations means that plug-ins will be able to be designed in a much more modular way. The brush system will be able to become more flexible, especially when filter plug-ins are able to be used as procedural brush plug-ins. + + + + + +=Bugzilla= + +==What is Bugzilla?== + +The GIMP project uses GNOME Bugzilla for tracking of bug reports, enhancement requests etc. + +A beginners tutorial describing how to report a bug can be found in the [http://www.gimp.org/bugs/howtos/bugzilla.html How To Report GIMP Bugs] document. + + + + + +==What is the meaning of the NEEDINFO status code in Bugzilla?== + +If the status of a bug is changed to NEEDINFO it means the GIMP developers need more information from the bug reporter in order to resolve the bug. + +More information about the meaning of the Bugzilla status field codes can be found in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle]. + + +==What is the best way to refer to a bug in Bugzilla?== + +The best way to refer to a bug is “bug #nnnnn”, where nnnnn is the bug number. Using “bug” before the number allows Bugzilla to link to the corresponding bug report automatically. Using “#” before the number is optional for Bugzilla but makes it easier to locate references to bug reports in the ChangeLog or in e-mails. + +When referencing multiple bugs, it is better to be a bit redundant by writing “bug #xxxxx, bug #yyyyy and bug #zzzzz” instead of “bugs #xxxxx, #yyyyy and #zzzzz” in order to allow Bugzilla to link all bugs automatically. + + +==What is the proper way of handling duplicate bug reports?== + +A bug report describing the same bug as a previous bug report should be marked as DUPLICATE of the older one. In some exceptional cases, it is possible to mark an old bug report as DUPLICATE of a newer one (e.g., when the newer bug report has a significantly better description than the older one). + +Another exception is when the same person submits the same bug report several times (same description): in this case, it is better to mark the additional copies of the bug report as INVALID in order to avoid inflating the statistics about the number of duplicates. + + +==What is the proper way of marking a bug as RESOLVED?== + +When fixing a bug, always mention the bug number in the commit message. Once the changes are in git, paste the relevant part of the commit message (or all of it) in the comment field and mark the bug as RESOLVED FIXED. These cross-references help a lot when trying to find when a bug was fixed, its relations to other bugs, and potential regressions. + +A bug that is fixed in git or in an unstable release should be marked as RESOLVED FIXED. Optionally, the reporter or someone other than the one who fixed the bug can mark it as VERIFIED after some testing. When the fix is part of a stable release, it can be marked as CLOSED. + +This is explained further in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle] except for the difference between stable and unstable releases. + + + + + +=GIT= + +==How can I learn more about using git?== + +[https://wiki.gnome.org/Git Here] you find more information, including links to Git tutorials. + + +==How do I commit to the Git tree?== + +GIMP uses GNOME's Git repository for source code storage. Please read their [https://live.gnome.org/NewAccounts guidelines]. + +Please note that much like GNOME we want to work with you for a while before we can confirm that you are going to make a great upstream developer. Until then you can maintain your own branch on Github or Gitorious. + +We also wrote a guide on [[Hacking:Patches|submitting patches]]. + + +==What should I put in the commit message when doing a git commit?== + +Please put a short explanation of the change on the first line. Then, after an empty line, you can describe the change in more detail using as many lines as you need. Try not to exceed 72 colums. + +If the commit fixes a bug or part of a bug please use the bug number and description as the first line of the commit message. It's most convenient to just copy the line from the Bugzilla bug page. + + +==How can I add such a nicely formatted summary of my commit to a bug report?== + +If your commit is the latest commit on the branch, use + +
     git show --stat
    +
    + +If you want to output a particular commit, use + +
     git show --stat 1234567 (where 1234567 is the SHA1 hash of this commit)
    +
    + + +The output looks like: + +
    +commit 9b6201e2806920e66602302bfee3ae1341f38bd4
    +Author: John Doe 
    +Date:   Sat Feb 1 08:45:21 2010 +0100
    +
    +    Bug 8154711 - Add more tutorial links.
    +    
    +    Add more links to tutorial sites.
    +
    + links/index.htrw | 11 ++++++++++-
    + 1 file changed, 10 insertions(+), 1 deletion(-)
    +
    + +=Miscellaneous= + +==Where can I learn more about the GObject system used by GIMP?== + +The [https://developer.gnome.org/gobject/stable/ GObject documentation] has a nice [https://developer.gnome.org/gobject/stable/howto-gobject.html tutorial] that you might want to have a look at. + + +==Where can I learn more about color spaces, color space conversions and other color science topics?== + +Unfortunately, the theoretical foundations of colors and their internal representation +are not as easy as seeing them in nature. Elle Stone wrote [http://ninedegreesbelow.com/photography/xyz-rgb.html a good documentation of color spaces] which is recommended reading. + +Charles Poynton has collected a set of [http://www.poynton.com/ColorFAQ.html Frequently Asked Questions about Color]. + +In our [[Glossary]] we explain the relevant terms. + + +==Where can I learn more about image manipulation algorithms?== + +A good source of information is the comp.graphics.algorithms list of [http://www.faqs.org/faqs/graphics/algorithms-faq/ Frequently Asked Questions]. + + +==What is ohloh.net for? Why developers are listed there and not on an official Gimp website?== + +The GIMP project itself doesn't maintain a site with an overview of the developers. If you want to know who are most active developers in the project, you can look at [http://www.ohloh.net/p/gimp/contributors?query=&sort=commits_12_mo ohloh.net statistics of the last 12 months]. +Ohloh.net is free, public directory, a web service and online community platform that aims to map the landscape of open source development (see [http://en.wikipedia.org/w/index.php?title=Ohloh&oldid=495142279 the description in the English Wikipedia]). It collects information from public available source code repositories and creates statistics from it. +To read more about ohloh.net, visit [http://meta.ohloh.net/us/ the ohloh.net self-introduction] . + + +==What is buildbot? How to use Buildbot for GIMP?== + +Why is it on [https://gimptest.flamingtext.com:9090/ https://gimptest.flamingtext.com:9090/] and not on official Gimp's website? + +What are the most common uses of the Buildbot? + +TODO + + +==Is there a GIMP user FAQ available?== + +Yes, you find it [http://www.gimp.org/docs/userfaq.html here]. + + +==How can I contribute to this FAQ?== + +If you would like to contribute to this FAQ, send an e-mail to the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list] with the exact text you think should be included (both question and answer). + +With your help this FAQ will grow and become more useful. + + \ No newline at end of file diff --git a/wiki/Hacking:Developer_FAQ-20201123020435-show.txt b/wiki/Hacking:Developer_FAQ-20201123020435-show.txt new file mode 100644 index 0000000..faeacf1 --- /dev/null +++ b/wiki/Hacking:Developer_FAQ-20201123020435-show.txt @@ -0,0 +1,465 @@ + + +Below you find a collection of frequently asked questions regarding development of the GIMP. +If you find questions that are not answered yet, then feel free to change it! + + +__TOC__ + +=GIMP Development= + +==How can I support GIMP development?== + +By using GIMP and reporting any bugs you find to Bugzilla you're helping a great deal. But there are other non-technical ways of supporting the development of The GIMP as well. + +GIMP has a web site, application documentation, lots of tutorials, and more. Unfortunately, as GIMP develops over time, much of this documentation needs to be re-written or freshened up, documentation needs to be added for new functionality, the web site needs to get a new lick of paint and so on. + +If you're interested in helping out you should drop an e-mail to the GIMP developer mailing list offering your help. + +Currently the top priority in development is [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL porting all plugins to GEGL] and making GEGL faster. + +You can also have a look at bug reports filed for GIMP and pick something. You can use [https://bugzilla.gnome.org/browse.cgi?product=GIMP bugzilla] to find bug reports you could take care of, but we encourage you contacting us beforehand to find out if the task you picked is still valid. It's best to discuss working on something in either mailing list or IRC channel before beginning to fix things and implement features. This is because requests have to be checked against bigger design decisions. We'd hate if you wasted your time on something that shouldn't have been done. + +Major planned changes are listed at the [[GIMP_Roadmap|feature roadmap]] page. Some miscellaneous ideas are [https://wiki.gimp.org/index.php?title=Mindstorm:Misc_TODO%27s&action=edit&redlink=1 here] + +Contacting the team is essential when starting to solve bugs or realizing enhancements/features. + + +==Which GIMP related projects can I contribute to?== + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/babl babl] | Pixel format conversion library +|- +| [https://git.gnome.org/browse/gegl gegl] | Generic Graphical Library +|- +| [https://git.gnome.org/browse/gimp gimp] | GIMP and the standard set of plug-ins +|- +| [https://git.gnome.org/browse/gimp-data-extras gimp-data-extras] | GIMP Data files such as brushes, gradients, patterns and the like +|- +| [https://git.gnome.org/browse/gimp-gap gimp-gap]| GIMP Animation Package, a set of plug-ins that provide video editing functionality +|- +| [https://git.gnome.org/browse/gimp-help-2 gimp-help-2]| GIMP User Manual +|- +| [https://git.gnome.org/browse/gimp-perl gimp-perl] | GIMP Perl bindings and a bunch of nice gimp-perl scripts +|- +| [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template] | GIMP Plug-In Template, a starting ground for plug-in developers +|- +| [https://git.gnome.org/browse/gimp-ruby gimp-ruby] | GIMP Ruby-based scripting plug-in +|- +| [https://git.gnome.org/browse/gimp-tiny-fu gimp-tiny-fu] | GIMP Tiny-Fu, a drop-in replacement for Script-Fu +|- +| [https://git.gnome.org/browse/gimp-web gimp-web]| the GIMP web site, available at www.gimp.org +|- +| [https://git.gnome.org/browse/gimp-web-devel gimp-web-devel] | the source of developer.gimp.org (currently being migrated to this wiki) +|} + + +There are also some archived projects: + + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/archive/gimp-data-min gimp-data-min] | The archive of data files for GIMP, such as brushes, palettes and patterns. +|- +| [https://git.gnome.org/browse/archive/gimp-help gimp-help] | The archive of the former GIMP help. Obsolete, please use [https://git.gnome.org/browse/gimp-help-2 gimp-help-2] instead. +|- +| [https://git.gnome.org/browse/archive/gimp-plugins-unstable gimp-plugins-unstable] | GIMP plug-ins from the past, a collection of unstable and unmaintained plug-ins. +|- +| [https://git.gnome.org/browse/archive/gimp-resource-repository gimp-resource-repository] | GIMP Resource Repository, a proposal for GIMP's GSoC participation 2003. +|- +| [https://git.gnome.org/browse/archive/gimp2 gimp2] | Archived brainstorm for the technical architecture of GIMP2. +|} + +They have been unmaintained for long and the chances to get support for them are quite low. + + +==What should I know when starting with open source development?== + +If you're new to open source development, the article [http://schlitt.info/opensource/blog/0541_10_golden_rules_for_starting_with_open_source.html '10 golden rules for starting with open source'] from Tobias Schlitt offers useful and worth knowing hints. + + +==Who coordinates GIMP development?== + +GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list]. + + +==Who is planning Gimp's development?== + +GIMP team's approach to planning is a little different. We do not have time-based schedules, instead we rely on a [[GIMP_Roadmap|feature roadmap]]. + +We use Git branches for developing major new features. If a feature is ready for inclusion into the main branch, it is merged. The decision, whether it's ready, is made by the core team (currently: mitch, Alexia), typically on IRC. + + +==How can I become a GIMP developer?== + +If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. Pick a bug, perhaps ask the advice of another developer as to whether he/she thinks it will be an easy bug or not, and then fix it. Sounds easy, doesn't it? + +After helping with a couple of bugs, people will start to recognize your immense talent, and you will be on your way to becoming a GIMP developer. Any time you feel able, you can pick a smaller enhancement request and have a go at implementing it. It's that easy. + +For more information see also the developer documentation. + + +==Where should I go for help when I need it?== + +There are several channels of communication: + + +# GIMP developer IRC channel: irc://irc.gimp.org/#gimp. Users without IRC client can connect using one of the many online IRC clients, such as: [http://mibbit.com/?channel=%23gimp&server=irc.gimp.org Mibbit]. +# [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP mailing list for developers] (gimp-developer-list |at| gnome.org), but it's of course slower than IRC. + +See also the [http://www.gimp.org/mail_lists.html overview of Gimp mailing lists]. + + + + + +==Where can I discuss GIMP development?== + +There are [http://www.gimp.org/mail_lists.html several mailing lists] associated with the GIMP project. Developments related issues can be brought up on the [[https://mail.gnome.org/mailman/listinfo/gimp-developer-list https://mail.gnome.org/mailman/listinfo/gimp-developer-list] GIMP developer mailing list. + +GIMP has its own IRC channel on GIMPNet where most of the active developers hang out. Join us in #gimp on irc.gimp.org. + +Once in a year the developers of GIMP and other open source graphics software get together to throw the [http:///www.libregraphicsmeeting.org LibreGraphicsMeeting], formerly known as GIMPCon. To see what's going on there see the [[Main_Page#Developer_Meetings|summaries of the former meetings]]. + + +==Where can I find documentation for the GIMP API?== + +There are several ways, see [[Hacking:API documentation]]. + + +==How do I make a stack trace?== + +A stack trace is a list of function calls that leads to some point in the program. Debugging tools like gdb can get stack traces from crashed applications so that developers can figure out what went wrong. By including a stack trace with your bug report, it will be much easier for the developers to fix the reported problem. + +Information on how to make a stack trace can be found in the document [https://wiki.gnome.org/action/show/GettingInTouch/Bugzilla/GettingTraces?action=show Capturing Stack Traces]. + + +==What is the best way to submit a patch?== + +The best way to submit a patch is to open a bug report in Bugzilla and attach the patch there along with a description of what it does and why it should be applied. + +An introduction to how this is done can be found in the [http://www.gimp.org/bugs/howtos/submit-patch.html How To Create and Submit a Patch document]. This page describes how you can submit a patch. You can also post it to the mailing lists '''GIMP Developer''' or '''GEGL Developer''', but this only applies to very small patches (at maximum 10 KB). + + +==What is the preferred coding style used in GIMP?== + +See our [[Glossary#Hackordnung| Hackordnung]]. + + +==How can I configure my editor for this coding style?== + +Your editor will not be able to do everything for you, but you can configure most editors so that they use two spaces for indentation, use spaces instead of tabs, etc. + +If you are using Emacs, you can insert the following settings into your ~/.emacs file: + +
       ;; Merge this into your custom-set-variables section if you already have one
    +   (custom-set-variables
    +    ;; Syntax highlighting
    +    '(global-font-lock-mode t nil (font-lock))
    +    '(show-paren-mode t nil (paren))
    +   )
    +   ;; use UTF-8 by default
    +   (prefer-coding-system 'mule-utf-8)
    +   ;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces
    +   (setq c-mode-common-hook '(lambda () (c-set-style "gnu")
    +                               (setq indent-tabs-mode nil)
    +                               (setq show-trailing-whitespace t))) 
    +
    + +If you are using Vim, you can insert the following settings into your ~/.vimrc file: + +
       syn on           " syntax highlighting
    +   set expandtab    " use spaces instead of tabs
    +   set shiftwidth=2 " default indentation is 2 spaces 
    +
    + +If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ. + + +==Who coordinates the GIMP translation efforts?== + +Any help with translations is appreciated. If you want to help, please get in contact with the people from the [http://live.gnome.org/TranslationProject GNOME Translation Project] who coordinate all translation efforts for projects hosted in the GNOME GIT repository. + +More information about GIMP and localisation can be found in the file [https://git.gnome.org/browse/gimp/plain/README.i18n README.i18n]. + + +==Where do I find the code?== + +The GIMP source code lives in the [https://git.gnome.org/browse/gimp gimp] repository on the [https://git.gnome.org/browse/ GNOME git server]. + +The current production branch has the name of the current version, i.e. gimp-2-8. Bugfixes go here. + +The branch 'master' is the development branch. This is the place for bugfixes and new features. + +See also 'Which GIMP related projects can I contribute to?' + + + + +==What's the best way to download, compile and keep up-to-date Gimp's source code?== + +===Compiling GIMP=== + +# General: [[Hacking:Building]] +# Additional descriptions for Linux: [[Hacking:Building/Linux]] + + + + +===Short guide:=== + +# Pull the sources down from git. +# Configure and make babl. +# Configure and make gegl. +# Configure and make gimp. + +===Installing needed libraries on Ubuntu=== +
    apt-get build-dep gimp
    +
    + + + + +===Links to more detailed descriptions:=== + +* [http://www.graphics-muse.org/artistsguide/?p=247 http://www.graphics-muse.org/artistsguide/?p=247] +* [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html] +* [http://lightningismyname.blogspot.com/p/compiling-gimp.html http://lightningismyname.blogspot.com/p/compiling-gimp.html] + +===How to compile Gimp for Windows?=== + +The chapter [[Hacking:Building/Windows]] approaches this topic in detail. + + +==What are planned deadlines for next edititons of Gimp? Are there any?== + +Once we have a bigger team, we probably will have deadlines. At this point we don't have the resources to plan time-based releases. + + +==What were the last changes in the code?== + +[https://git.gnome.org/browse/gimp/log/?h=gimp-2-8 GIMP 2.8] +[https://git.gnome.org/browse/gimp/log/ GIMP master (the development version)] + + +=Plug-In Development= + +==How can I get started with developing plug-ins?== + +See [[Hacking:Plugins| How to write a GIMP plug-in]]. + + +==Is there a plug-in template available?== + +Yes. An official GIMP plug-in template is available in the [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template git module]. Snapshots are available at ftp.gimp.org. + + +==How about a Script-Fu template?== + +Yes. Simon Budig has written a fill-in-the-blanks Script-Fu template which is available [http://www.home.unix-ag.org/simon/files/script-fu-template.scm here]. + + +==How do I get my plug-in included in the GIMP?== + +The best way to make your plug-in available to the World is to submit it to the [http://registry.gimp.org/ GIMP Plug-In Registry]. + +If you are certain that your plug-in will be useful to all GIMP users, then you can ask the GIMP developers to consider it for inclusion in future GIMP release. The best way to do that is to suggest it on the GIMP developer mailing list or to open an enhancement request in Bugzilla. However, we would like to limit the number of plug-ins included in the standard distribution and encourage all users to use the registry. + + +==How do I debug a GIMP plug-in?== + +Eeek! The plug-in you're working on has a bug in it! And the fix isn't completely obvious, so you want to use debugger to see what is going on. But hmm, how does one start a plug-in under a debugger if GIMP is the one who is starting the plug-in... + +To address this issue, libgimp has some hooks controlled by the '''GIMP_PLUGIN_DEBUG''' environment variable. The idea is that you can attach a debugger to the pid of the plug-in you want to debug. The process is described in the file debug-plug-ins.txt. + + +==Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4?== + +The short answer is yes. GIMP 2.2 and 2.4 are binary compatible with plug-ins compiled for GIMP 2.0. The API is also backwards source compatible, so your plug-in should also compile cleanly against GIMP 2.2 and 2.4. + +If the plug-in you compiled for 2.0 does not work with 2.2 or 2.4, there is one change which has been made which is not backwards compatible, since the old behaviour was considered incorrect. If you create a temporary drawable, using for example gimp_layer_new(), you are now required to add it to an image before calling any functions with the drawable as an argument. + + +=GEGL= + +==What is GEGL?== + +GEGL is the [http://www.gegl.org/ Generic Graphical Library]. It is supposed to replace the handling of various image processing tasks in GIMP in a not too distant future (planned for GIMP 2.10). + + +==What will GEGL be able to do?== + +GEGL will be a general image processing library. It uses a directed acyclic graph, a DAG, to represent image processing operations. In the DAG, images are edges, and operations are nodes. It takes advantage of this DAG to minimize regions which are processed, provide efficient caching of operations, and efficient redrawing when a parameter of the graph changes. + +GEGL should also be independent of the data type being processed and will be able to handle high bit depth images, ICC profiles and parallel processing of image tiles. + + +==Where to contribute to the future of GEGL?== + +You can find a good start for GEGL here: +[http://gegl.org/contribute.html http://gegl.org/contribute.html] + + +==What does all that gibberish mean for GIMP?== + +Many highly requested features of the GIMP will be easier to do using GEGL. Layer effects, layer groups, and adjustment layers are quite easily represented (and efficiently calculated) using the DAG organization of GEGL. CMYK and high bit depth support will be easier because GEGL does not make the same assumptions about color spaces and data types that the GIMP does. + +The reusability of image processing operations means that plug-ins will be able to be designed in a much more modular way. The brush system will be able to become more flexible, especially when filter plug-ins are able to be used as procedural brush plug-ins. + + + + + +=Bugzilla= + +==What is Bugzilla?== + +The GIMP project uses GNOME Bugzilla for tracking of bug reports, enhancement requests etc. + +A beginners tutorial describing how to report a bug can be found in the [http://www.gimp.org/bugs/howtos/bugzilla.html How To Report GIMP Bugs] document. + + + + + +==What is the meaning of the NEEDINFO status code in Bugzilla?== + +If the status of a bug is changed to NEEDINFO it means the GIMP developers need more information from the bug reporter in order to resolve the bug. + +More information about the meaning of the Bugzilla status field codes can be found in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle]. + + +==What is the best way to refer to a bug in Bugzilla?== + +The best way to refer to a bug is “bug #nnnnn”, where nnnnn is the bug number. Using “bug” before the number allows Bugzilla to link to the corresponding bug report automatically. Using “#” before the number is optional for Bugzilla but makes it easier to locate references to bug reports in the ChangeLog or in e-mails. + +When referencing multiple bugs, it is better to be a bit redundant by writing “bug #xxxxx, bug #yyyyy and bug #zzzzz” instead of “bugs #xxxxx, #yyyyy and #zzzzz” in order to allow Bugzilla to link all bugs automatically. + + +==What is the proper way of handling duplicate bug reports?== + +A bug report describing the same bug as a previous bug report should be marked as DUPLICATE of the older one. In some exceptional cases, it is possible to mark an old bug report as DUPLICATE of a newer one (e.g., when the newer bug report has a significantly better description than the older one). + +Another exception is when the same person submits the same bug report several times (same description): in this case, it is better to mark the additional copies of the bug report as INVALID in order to avoid inflating the statistics about the number of duplicates. + + +==What is the proper way of marking a bug as RESOLVED?== + +When fixing a bug, always mention the bug number in the commit message. Once the changes are in git, paste the relevant part of the commit message (or all of it) in the comment field and mark the bug as RESOLVED FIXED. These cross-references help a lot when trying to find when a bug was fixed, its relations to other bugs, and potential regressions. + +A bug that is fixed in git or in an unstable release should be marked as RESOLVED FIXED. Optionally, the reporter or someone other than the one who fixed the bug can mark it as VERIFIED after some testing. When the fix is part of a stable release, it can be marked as CLOSED. + +This is explained further in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle] except for the difference between stable and unstable releases. + + + + + +=GIT= + +==How can I learn more about using git?== + +[https://wiki.gnome.org/Git Here] you find more information, including links to Git tutorials. + + +==How do I commit to the Git tree?== + +GIMP uses GNOME's Git repository for source code storage. Please read their [https://live.gnome.org/NewAccounts guidelines]. + +Please note that much like GNOME we want to work with you for a while before we can confirm that you are going to make a great upstream developer. Until then you can maintain your own branch on Github or Gitorious. + +We also wrote a guide on [[Hacking:Patches|submitting patches]]. + + +==What should I put in the commit message when doing a git commit?== + +Please put a short explanation of the change on the first line. Then, after an empty line, you can describe the change in more detail using as many lines as you need. Try not to exceed 72 colums. + +If the commit fixes a bug or part of a bug please use the bug number and description as the first line of the commit message. It's most convenient to just copy the line from the Bugzilla bug page. + + +==How can I add such a nicely formatted summary of my commit to a bug report?== + +If your commit is the latest commit on the branch, use + +
     git show --stat
    +
    + +If you want to output a particular commit, use + +
     git show --stat 1234567 (where 1234567 is the SHA1 hash of this commit)
    +
    + + +The output looks like: + +
    +commit 9b6201e2806920e66602302bfee3ae1341f38bd4
    +Author: John Doe 
    +Date:   Sat Feb 1 08:45:21 2010 +0100
    +
    +    Bug 8154711 - Add more tutorial links.
    +    
    +    Add more links to tutorial sites.
    +
    + links/index.htrw | 11 ++++++++++-
    + 1 file changed, 10 insertions(+), 1 deletion(-)
    +
    + +=Miscellaneous= + +==Where can I learn more about the GObject system used by GIMP?== + +The [https://developer.gnome.org/gobject/stable/ GObject documentation] has a nice [https://developer.gnome.org/gobject/stable/howto-gobject.html tutorial] that you might want to have a look at. + + +==Where can I learn more about color spaces, color space conversions and other color science topics?== + +Unfortunately, the theoretical foundations of colors and their internal representation +are not as easy as seeing them in nature. Elle Stone wrote [http://ninedegreesbelow.com/photography/xyz-rgb.html a good documentation of color spaces] which is recommended reading. + +Charles Poynton has collected a set of [http://www.poynton.com/ColorFAQ.html Frequently Asked Questions about Color]. + +In our [[Glossary]] we explain the relevant terms. + + +==Where can I learn more about image manipulation algorithms?== + +A good source of information is the comp.graphics.algorithms list of [http://www.faqs.org/faqs/graphics/algorithms-faq/ Frequently Asked Questions]. + + +==What is ohloh.net for? Why developers are listed there and not on an official Gimp website?== + +The GIMP project itself doesn't maintain a site with an overview of the developers. If you want to know who are most active developers in the project, you can look at [http://www.ohloh.net/p/gimp/contributors?query=&sort=commits_12_mo ohloh.net statistics of the last 12 months]. +Ohloh.net is free, public directory, a web service and online community platform that aims to map the landscape of open source development (see [http://en.wikipedia.org/w/index.php?title=Ohloh&oldid=495142279 the description in the English Wikipedia]). It collects information from public available source code repositories and creates statistics from it. +To read more about ohloh.net, visit [http://meta.ohloh.net/us/ the ohloh.net self-introduction] . + + +==What is buildbot? How to use Buildbot for GIMP?== + +Why is it on [https://gimptest.flamingtext.com:9090/ https://gimptest.flamingtext.com:9090/] and not on official Gimp's website? + +What are the most common uses of the Buildbot? + +TODO + + +==Is there a GIMP user FAQ available?== + +Yes, you find it [http://www.gimp.org/docs/userfaq.html here]. + + +==How can I contribute to this FAQ?== + +If you would like to contribute to this FAQ, send an e-mail to the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list] with the exact text you think should be included (both question and answer). + +With your help this FAQ will grow and become more useful. + + \ No newline at end of file diff --git a/wiki/Hacking:Developer_FAQ-20210515120627-edit.txt b/wiki/Hacking:Developer_FAQ-20210515120627-edit.txt new file mode 100644 index 0000000..fde250b --- /dev/null +++ b/wiki/Hacking:Developer_FAQ-20210515120627-edit.txt @@ -0,0 +1,381 @@ +Below you find a collection of frequently asked questions regarding development of the GIMP. +If you find questions that are not answered yet, then feel free to change it! + +__TOC__ + +=GIMP Development= + +==How can I support GIMP development?== + +By using GIMP and reporting any bugs you find to Bugzilla you're helping a great deal. But there are other non-technical ways of supporting the development of The GIMP as well. + +GIMP has a web site, application documentation, lots of tutorials, and more. Unfortunately, as GIMP develops over time, much of this documentation needs to be re-written or freshened up, documentation needs to be added for new functionality, the web site needs to get a new lick of paint and so on. + +If you're interested in helping out you should drop an e-mail to the GIMP developer mailing list offering your help. + +Currently the top priority in development is [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL porting all plugins to GEGL] and making GEGL faster. + +You can also have a look at bug reports filed for GIMP and pick something. You can use [https://bugzilla.gnome.org/browse.cgi?product=GIMP bugzilla] to find bug reports you could take care of, but we encourage you contacting us beforehand to find out if the task you picked is still valid. It's best to discuss working on something in either mailing list or IRC channel before beginning to fix things and implement features. This is because requests have to be checked against bigger design decisions. We'd hate if you wasted your time on something that shouldn't have been done. + +Major planned changes are listed at the [[GIMP_Roadmap|feature roadmap]] page. Some miscellaneous ideas are [[Mindstorm:Misc_TODO%27s|here]] + +Contacting the team is essential when starting to solve bugs or realizing enhancements/features. + +== Which GIMP related projects can I contribute to? == + +{| class="wikitable" style="text-align: left;" +!'''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/babl babl] || Pixel format conversion library +|- +| [https://git.gnome.org/browse/gegl gegl] || Generic Graphical Library +|- +| [https://git.gnome.org/browse/gimp gimp] || GIMP and the standard set of plug-ins +|- +| [https://git.gnome.org/browse/gimp-data-extras gimp-data-extras] || GIMP Data files such as brushes, gradients, patterns and the like +|- +| [https://git.gnome.org/browse/gimp-gap gimp-gap]|| GIMP Animation Package, a set of plug-ins that provide video editing functionality +|- +| [https://git.gnome.org/browse/gimp-help-2 gimp-help-2]|| GIMP User Manual +|- +| [https://git.gnome.org/browse/gimp-perl gimp-perl] || GIMP Perl bindings and a bunch of nice gimp-perl scripts +|- +| [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template] || GIMP Plug-In Template, a starting ground for plug-in developers +|- +| [https://git.gnome.org/browse/gimp-ruby gimp-ruby] || GIMP Ruby-based scripting plug-in +|- +| [https://git.gnome.org/browse/gimp-tiny-fu gimp-tiny-fu] || GIMP Tiny-Fu, a drop-in replacement for Script-Fu +|- +| [https://git.gnome.org/browse/gimp-web gimp-web]|| the GIMP web site, available at www.gimp.org +|- +| [https://git.gnome.org/browse/gimp-web-devel gimp-web-devel] || the source of developer.gimp.org (currently being migrated to this wiki) +|} + + +There are also some archived projects: +{| class="wikitable" style="text-align: left;" +!'''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/archive/gimp-data-min gimp-data-min] || The archive of data files for GIMP, such as brushes, palettes and patterns. +|- +| [https://git.gnome.org/browse/archive/gimp-help gimp-help] || The archive of the former GIMP help. Obsolete, please use [https://git.gnome.org/browse/gimp-help-2 gimp-help-2] instead. +|- +| [https://git.gnome.org/browse/archive/gimp-plugins-unstable gimp-plugins-unstable] || GIMP plug-ins from the past, a collection of unstable and unmaintained plug-ins. +|- +| [https://git.gnome.org/browse/archive/gimp-resource-repository gimp-resource-repository] || GIMP Resource Repository, a proposal for GIMP's GSoC participation 2003. +|- +| [https://git.gnome.org/browse/archive/gimp2 gimp2] || Archived brainstorm for the technical architecture of GIMP2. +|} +They have been unmaintained for long and the chances to get support for them are quite low. + +== What should I know when starting with open source development? == +If you're new to open source development, the article [http://schlitt.info/opensource/blog/0541_10_golden_rules_for_starting_with_open_source.html '10 golden rules for starting with open source'] from Tobias Schlitt offers useful and worth knowing hints. + +==Who coordinates GIMP development?== + +GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list]. + +== Who is planning Gimp's development? == + +GIMP team's approach to planning is a little different. We do not have time-based schedules, instead we rely on a [[GIMP_Roadmap|feature roadmap]]. + +We use Git branches for developing major new features. If a feature is ready for inclusion into the main branch, it is merged. The decision, whether it's ready, is made by the core team (currently: mitch, Alexia), typically on IRC. + +==How can I become a GIMP developer?== + +If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. Pick a bug, perhaps ask the advice of another developer as to whether he/she thinks it will be an easy bug or not, and then fix it. Sounds easy, doesn't it? + +After helping with a couple of bugs, people will start to recognize your immense talent, and you will be on your way to becoming a GIMP developer. Any time you feel able, you can pick a smaller enhancement request and have a go at implementing it. It's that easy. + +For more information see also [[#Developer information | the developer documentation]]. + +== Where should I go for help when I need it? == + +There are several channels of communication: +# GIMP developer IRC channel: irc://irc.gimp.org/#gimp. Users without IRC client can connect using one of the many online IRC clients, such as: [http://mibbit.com/?channel=%23gimp&server=irc.gimp.org Mibbit]. +# [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP mailing list for developers] (gimp-developer-list |at| gnome.org), but it's of course slower than IRC. + +See also the [http://www.gimp.org/mail_lists.html overview of Gimp mailing lists]. + + +==Where can I discuss GIMP development?== + +There are [http://www.gimp.org/mail_lists.html several mailing lists] associated with the GIMP project. Developments related issues can be brought up on the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list. + +GIMP has its own IRC channel on GIMPNet where most of the active developers hang out. Join us in [irc://irc.gimp.org/#gimp #gimp on irc.gimp.org]. + +Once in a year the developers of GIMP and other open source graphics software get together to throw the [http:///www.libregraphicsmeeting.org LibreGraphicsMeeting], formerly known as GIMPCon. To see what's going on there see the [[Main Page#Developer Meetings |summaries of the former meetings]]. + +==Where can I find documentation for the GIMP API?== + +There are several ways, see [[Hacking:API documentation]]. + +==How do I make a stack trace?== + +A stack trace is a list of function calls that leads to some point in the program. Debugging tools like gdb can get stack traces from crashed applications so that developers can figure out what went wrong. By including a stack trace with your bug report, it will be much easier for the developers to fix the reported problem. + +Information on how to make a stack trace can be found in the document [https://wiki.gnome.org/action/show/GettingInTouch/Bugzilla/GettingTraces?action=show Capturing Stack Traces]. + +==What is the best way to submit a patch?== + +The best way to submit a patch is to open a bug report in Bugzilla and attach the patch there along with a description of what it does and why it should be applied. + +An introduction to how this is done can be found in the [http://www.gimp.org/bugs/howtos/submit-patch.html How To Create and Submit a Patch document]. This page describes how you can submit a patch. You can also post it to the mailing lists '''GIMP Developer''' or '''GEGL Developer''', but this only applies to very small patches (at maximum 10 KB). + +==What is the preferred coding style used in GIMP?== + +See our [[Glossary#Hackordnung | Hackordnung]]. + +==How can I configure my editor for this coding style?== + +Your editor will not be able to do everything for you, but you can configure most editors so that they use two spaces for indentation, use spaces instead of tabs, etc. + +If you are using Emacs, you can insert the following settings into your ~/.emacs file: + + ;; Merge this into your custom-set-variables section if you already have one + (custom-set-variables + ;; Syntax highlighting + '(global-font-lock-mode t nil (font-lock)) + '(show-paren-mode t nil (paren)) + ) + ;; use UTF-8 by default + (prefer-coding-system 'mule-utf-8) + ;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces + (setq c-mode-common-hook '(lambda () (c-set-style "gnu") + (setq indent-tabs-mode nil) + (setq show-trailing-whitespace t))) + +If you are using Vim, you can insert the following settings into your ~/.vimrc file: + + syn on " syntax highlighting + set expandtab " use spaces instead of tabs + set shiftwidth=2 " default indentation is 2 spaces + +If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ. + +==Who coordinates the GIMP translation efforts?== + +Any help with translations is appreciated. If you want to help, please get in contact with the people from the [http://live.gnome.org/TranslationProject GNOME Translation Project] who coordinate all translation efforts for projects hosted in the GNOME GIT repository. + +More information about GIMP and localisation can be found in the file [https://git.gnome.org/browse/gimp/plain/README.i18n README.i18n]. + +== Where do I find the code? == +The GIMP source code lives in the [https://git.gnome.org/browse/gimp gimp] repository on the [https://git.gnome.org/browse/ GNOME git server]. + +The current production branch has the name of the current version, i.e. gimp-2-8. Bugfixes go here. + +The branch 'master' is the development branch. This is the place for bugfixes and new features. + +See also [[#Which_GIMP_related_projects_can_I_contribute_to.3F | 'Which GIMP related projects can I contribute to?']] + + +== What's the best way to download, compile and keep up-to-date Gimp's source code? == + +=== Compiling GIMP === +# General: [[Hacking:Building]] +# Additional descriptions for Linux: [[Hacking:Building/Linux]] + + +=== Short guide: === +# Pull the sources down from git. +# Configure and make babl. +# Configure and make gegl. +# Configure and make gimp. + +=== Installing needed libraries on Ubuntu === + apt-get build-dep gimp + + +=== Links to more detailed descriptions: === + +* http://www.graphics-muse.org/artistsguide/?p=247 +* http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html +* http://lightningismyname.blogspot.com/p/compiling-gimp.html + +=== How to compile Gimp for Windows? === + +The chapter [[Hacking:Building/Windows]] approaches this topic in detail. + +== What are planned deadlines for next edititons of Gimp? Are there any? == +Once we have a bigger team, we probably will have deadlines. At this point we don't have the resources to plan time-based releases. + +== What were the last changes in the code? == +[https://git.gnome.org/browse/gimp/log/?h=gimp-2-8 GIMP 2.8] + +[https://git.gnome.org/browse/gimp/log/ GIMP master (the development version)] + +=Plug-In Development= + +==How can I get started with developing plug-ins?== +See [[Hacking:Plugins | How to write a GIMP plug-in]]. + +==Is there a plug-in template available?== + +Yes. An official GIMP plug-in template is available in the [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template git module]. Snapshots are available at [ftp://ftp.gimp.org/pub/gimp/plugin-template/ ftp.gimp.org]. + +==How about a Script-Fu template?== + +Yes. Simon Budig has written a fill-in-the-blanks Script-Fu template which is available [http://www.home.unix-ag.org/simon/files/script-fu-template.scm here]. + +==How do I get my plug-in included in the GIMP?== + +The best way to make your plug-in available to the World is to submit it to the [http://registry.gimp.org/ GIMP Plug-In Registry]. + +If you are certain that your plug-in will be useful to all GIMP users, then you can ask the GIMP developers to consider it for inclusion in future GIMP release. The best way to do that is to suggest it on the GIMP developer mailing list or to open an enhancement request in Bugzilla. However, we would like to limit the number of plug-ins included in the standard distribution and encourage all users to use the registry. + +==How do I debug a GIMP plug-in?== + +Eeek! The plug-in you're working on has a bug in it! And the fix isn't completely obvious, so you want to use debugger to see what is going on. But hmm, how does one start a plug-in under a debugger if GIMP is the one who is starting the plug-in... + +To address this issue, libgimp has some hooks controlled by the '''GIMP_PLUGIN_DEBUG''' environment variable. The idea is that you can attach a debugger to the pid of the plug-in you want to debug. The process is described in the file debug-plug-ins.txt. + +==Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4?== + +The short answer is yes. GIMP 2.2 and 2.4 are binary compatible with plug-ins compiled for GIMP 2.0. The API is also backwards source compatible, so your plug-in should also compile cleanly against GIMP 2.2 and 2.4. + +If the plug-in you compiled for 2.0 does not work with 2.2 or 2.4, there is one change which has been made which is not backwards compatible, since the old behaviour was considered incorrect. If you create a temporary drawable, using for example gimp_layer_new(), you are now required to add it to an image before calling any functions with the drawable as an argument. + +=GEGL= + +==What is GEGL?== + +GEGL is the [http://www.gegl.org/ Generic Graphical Library]. It is supposed to replace the handling of various image processing tasks in GIMP in a not too distant future (planned for GIMP 2.10). + +==What will GEGL be able to do?== + +GEGL will be a general image processing library. It uses a directed acyclic graph, a DAG, to represent image processing operations. In the DAG, images are edges, and operations are nodes. It takes advantage of this DAG to minimize regions which are processed, provide efficient caching of operations, and efficient redrawing when a parameter of the graph changes. + +GEGL should also be independent of the data type being processed and will be able to handle high bit depth images, ICC profiles and parallel processing of image tiles. + +==Where to contribute to the future of GEGL?== +You can find a good start for GEGL here: +[http://gegl.org/contribute.html http://gegl.org/contribute.html] + +==What does all that gibberish mean for GIMP?== + +Many highly requested features of the GIMP will be easier to do using GEGL. Layer effects, layer groups, and adjustment layers are quite easily represented (and efficiently calculated) using the DAG organization of GEGL. CMYK and high bit depth support will be easier because GEGL does not make the same assumptions about color spaces and data types that the GIMP does. + +The reusability of image processing operations means that plug-ins will be able to be designed in a much more modular way. The brush system will be able to become more flexible, especially when filter plug-ins are able to be used as procedural brush plug-ins. + + +=Bugzilla= + +==What is Bugzilla?== + +The GIMP project uses GNOME Bugzilla for tracking of bug reports, enhancement requests etc. + +A beginners tutorial describing how to report a bug can be found in the [http://www.gimp.org/bugs/howtos/bugzilla.html How To Report GIMP Bugs] document. + + +==What is the meaning of the NEEDINFO status code in Bugzilla?== + +If the status of a bug is changed to NEEDINFO it means the GIMP developers need more information from the bug reporter in order to resolve the bug. + +More information about the meaning of the Bugzilla status field codes can be found in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle]. + +==What is the best way to refer to a bug in Bugzilla?== + +The best way to refer to a bug is “bug #nnnnn”, where nnnnn is the bug number. Using “bug” before the number allows Bugzilla to link to the corresponding bug report automatically. Using “#” before the number is optional for Bugzilla but makes it easier to locate references to bug reports in the ChangeLog or in e-mails. + +When referencing multiple bugs, it is better to be a bit redundant by writing “bug #xxxxx, bug #yyyyy and bug #zzzzz” instead of “bugs #xxxxx, #yyyyy and #zzzzz” in order to allow Bugzilla to link all bugs automatically. + +==What is the proper way of handling duplicate bug reports?== + +A bug report describing the same bug as a previous bug report should be marked as DUPLICATE of the older one. In some exceptional cases, it is possible to mark an old bug report as DUPLICATE of a newer one (e.g., when the newer bug report has a significantly better description than the older one). + +Another exception is when the same person submits the same bug report several times (same description): in this case, it is better to mark the additional copies of the bug report as INVALID in order to avoid inflating the statistics about the number of duplicates. + +==What is the proper way of marking a bug as RESOLVED?== + +When fixing a bug, always mention the bug number in the commit message. Once the changes are in git, paste the relevant part of the commit message (or all of it) in the comment field and mark the bug as RESOLVED FIXED. These cross-references help a lot when trying to find when a bug was fixed, its relations to other bugs, and potential regressions. + +A bug that is fixed in git or in an unstable release should be marked as RESOLVED FIXED. Optionally, the reporter or someone other than the one who fixed the bug can mark it as VERIFIED after some testing. When the fix is part of a stable release, it can be marked as CLOSED. + +This is explained further in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle] except for the difference between stable and unstable releases. + + +=GIT= + +== How can I learn more about using git? == +[https://wiki.gnome.org/Git Here] you find more information, including links to Git tutorials. + +== How do I commit to the Git tree? == +GIMP uses GNOME's Git repository for source code storage. Please read their [https://live.gnome.org/NewAccounts guidelines]. + +Please note that much like GNOME we want to work with you for a while before we can confirm that you are going to make a great upstream developer. Until then you can maintain your own branch on Github or Gitorious. + +We also wrote a guide on [[Hacking:Patches|submitting patches]]. + +==What should I put in the commit message when doing a git commit?== + +Please put a short explanation of the change on the first line. Then, after an empty line, you can describe the change in more detail using as many lines as you need. Try not to exceed 72 colums. + +If the commit fixes a bug or part of a bug please use the bug number and description as the first line of the commit message. It's most convenient to just copy the line from the Bugzilla bug page. + +==How can I add such a nicely formatted summary of my commit to a bug report?== + +If your commit is the latest commit on the branch, use + + git show --stat + +If you want to output a particular commit, use + + git show --stat 1234567 (where 1234567 is the SHA1 hash of this commit) + + +The output looks like: +
    +commit 9b6201e2806920e66602302bfee3ae1341f38bd4
    +Author: John Doe 
    +Date:   Sat Feb 1 08:45:21 2010 +0100
    +
    +    Bug 8154711 - Add more tutorial links.
    +    
    +    Add more links to tutorial sites.
    +
    + links/index.htrw | 11 ++++++++++-
    + 1 file changed, 10 insertions(+), 1 deletion(-)
    +
    + +=Miscellaneous= + +==Where can I learn more about the GObject system used by GIMP?== + +The [https://developer.gnome.org/gobject/stable/ GObject documentation] has a nice [https://developer.gnome.org/gobject/stable/howto-gobject.html tutorial] that you might want to have a look at. + +==Where can I learn more about color spaces, color space conversions and other color science topics?== + +Unfortunately, the theoretical foundations of colors and their internal representation +are not as easy as seeing them in nature. Elle Stone wrote [http://ninedegreesbelow.com/photography/xyz-rgb.html a good documentation of color spaces] which is recommended reading. + +Charles Poynton has collected a set of [http://www.poynton.com/ColorFAQ.html Frequently Asked Questions about Color]. + +In our [[Glossary]] we explain the relevant terms. + +==Where can I learn more about image manipulation algorithms?== + +A good source of information is the comp.graphics.algorithms list of [http://www.faqs.org/faqs/graphics/algorithms-faq/ Frequently Asked Questions]. + +== What is ohloh.net for? Why developers are listed there and not on an official Gimp website? == +The GIMP project itself doesn't maintain a site with an overview of the developers. If you want to know who are most active developers in the project, you can look at [http://www.ohloh.net/p/gimp/contributors?query=&sort=commits_12_mo ohloh.net statistics of the last 12 months]. +Ohloh.net is free, public directory, a web service and online community platform that aims to map the landscape of open source development (see [http://en.wikipedia.org/w/index.php?title=Ohloh&oldid=495142279 the description in the English Wikipedia]). It collects information from public available source code repositories and creates statistics from it. +To read more about ohloh.net, visit [http://meta.ohloh.net/us/ the ohloh.net self-introduction] . + +== What is buildbot? How to use Buildbot for GIMP? == +Why is it on https://gimptest.flamingtext.com:9090/ and not on official Gimp's website? + +What are the most common uses of the Buildbot? + +TODO + +==Is there a GIMP user FAQ available?== + +Yes, you find it [http://www.gimp.org/docs/userfaq.html here]. + +==How can I contribute to this FAQ?== + +If you would like to contribute to this FAQ, send an e-mail to the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list] with the exact text you think should be included (both question and answer). + +With your help this FAQ will grow and become more useful. diff --git a/wiki/Hacking:Developer_FAQ-20211122115844-show.txt b/wiki/Hacking:Developer_FAQ-20211122115844-show.txt new file mode 100644 index 0000000..faeacf1 --- /dev/null +++ b/wiki/Hacking:Developer_FAQ-20211122115844-show.txt @@ -0,0 +1,465 @@ + + +Below you find a collection of frequently asked questions regarding development of the GIMP. +If you find questions that are not answered yet, then feel free to change it! + + +__TOC__ + +=GIMP Development= + +==How can I support GIMP development?== + +By using GIMP and reporting any bugs you find to Bugzilla you're helping a great deal. But there are other non-technical ways of supporting the development of The GIMP as well. + +GIMP has a web site, application documentation, lots of tutorials, and more. Unfortunately, as GIMP develops over time, much of this documentation needs to be re-written or freshened up, documentation needs to be added for new functionality, the web site needs to get a new lick of paint and so on. + +If you're interested in helping out you should drop an e-mail to the GIMP developer mailing list offering your help. + +Currently the top priority in development is [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL porting all plugins to GEGL] and making GEGL faster. + +You can also have a look at bug reports filed for GIMP and pick something. You can use [https://bugzilla.gnome.org/browse.cgi?product=GIMP bugzilla] to find bug reports you could take care of, but we encourage you contacting us beforehand to find out if the task you picked is still valid. It's best to discuss working on something in either mailing list or IRC channel before beginning to fix things and implement features. This is because requests have to be checked against bigger design decisions. We'd hate if you wasted your time on something that shouldn't have been done. + +Major planned changes are listed at the [[GIMP_Roadmap|feature roadmap]] page. Some miscellaneous ideas are [https://wiki.gimp.org/index.php?title=Mindstorm:Misc_TODO%27s&action=edit&redlink=1 here] + +Contacting the team is essential when starting to solve bugs or realizing enhancements/features. + + +==Which GIMP related projects can I contribute to?== + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/babl babl] | Pixel format conversion library +|- +| [https://git.gnome.org/browse/gegl gegl] | Generic Graphical Library +|- +| [https://git.gnome.org/browse/gimp gimp] | GIMP and the standard set of plug-ins +|- +| [https://git.gnome.org/browse/gimp-data-extras gimp-data-extras] | GIMP Data files such as brushes, gradients, patterns and the like +|- +| [https://git.gnome.org/browse/gimp-gap gimp-gap]| GIMP Animation Package, a set of plug-ins that provide video editing functionality +|- +| [https://git.gnome.org/browse/gimp-help-2 gimp-help-2]| GIMP User Manual +|- +| [https://git.gnome.org/browse/gimp-perl gimp-perl] | GIMP Perl bindings and a bunch of nice gimp-perl scripts +|- +| [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template] | GIMP Plug-In Template, a starting ground for plug-in developers +|- +| [https://git.gnome.org/browse/gimp-ruby gimp-ruby] | GIMP Ruby-based scripting plug-in +|- +| [https://git.gnome.org/browse/gimp-tiny-fu gimp-tiny-fu] | GIMP Tiny-Fu, a drop-in replacement for Script-Fu +|- +| [https://git.gnome.org/browse/gimp-web gimp-web]| the GIMP web site, available at www.gimp.org +|- +| [https://git.gnome.org/browse/gimp-web-devel gimp-web-devel] | the source of developer.gimp.org (currently being migrated to this wiki) +|} + + +There are also some archived projects: + + +{| class="wikitable" +|- +! '''Module''' +! '''Description''' +|- +| [https://git.gnome.org/browse/archive/gimp-data-min gimp-data-min] | The archive of data files for GIMP, such as brushes, palettes and patterns. +|- +| [https://git.gnome.org/browse/archive/gimp-help gimp-help] | The archive of the former GIMP help. Obsolete, please use [https://git.gnome.org/browse/gimp-help-2 gimp-help-2] instead. +|- +| [https://git.gnome.org/browse/archive/gimp-plugins-unstable gimp-plugins-unstable] | GIMP plug-ins from the past, a collection of unstable and unmaintained plug-ins. +|- +| [https://git.gnome.org/browse/archive/gimp-resource-repository gimp-resource-repository] | GIMP Resource Repository, a proposal for GIMP's GSoC participation 2003. +|- +| [https://git.gnome.org/browse/archive/gimp2 gimp2] | Archived brainstorm for the technical architecture of GIMP2. +|} + +They have been unmaintained for long and the chances to get support for them are quite low. + + +==What should I know when starting with open source development?== + +If you're new to open source development, the article [http://schlitt.info/opensource/blog/0541_10_golden_rules_for_starting_with_open_source.html '10 golden rules for starting with open source'] from Tobias Schlitt offers useful and worth knowing hints. + + +==Who coordinates GIMP development?== + +GIMP development is coordinated by Wilber the GIMP along with a loosely knit team of GIMP developers. The developers can be reached through the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list]. + + +==Who is planning Gimp's development?== + +GIMP team's approach to planning is a little different. We do not have time-based schedules, instead we rely on a [[GIMP_Roadmap|feature roadmap]]. + +We use Git branches for developing major new features. If a feature is ready for inclusion into the main branch, it is merged. The decision, whether it's ready, is made by the core team (currently: mitch, Alexia), typically on IRC. + + +==How can I become a GIMP developer?== + +If you are a developer who wants to start contributing code to the GIMP, the best way to get to know its structure is by fixing bugs reported in Bugzilla. Pick a bug, perhaps ask the advice of another developer as to whether he/she thinks it will be an easy bug or not, and then fix it. Sounds easy, doesn't it? + +After helping with a couple of bugs, people will start to recognize your immense talent, and you will be on your way to becoming a GIMP developer. Any time you feel able, you can pick a smaller enhancement request and have a go at implementing it. It's that easy. + +For more information see also the developer documentation. + + +==Where should I go for help when I need it?== + +There are several channels of communication: + + +# GIMP developer IRC channel: irc://irc.gimp.org/#gimp. Users without IRC client can connect using one of the many online IRC clients, such as: [http://mibbit.com/?channel=%23gimp&server=irc.gimp.org Mibbit]. +# [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP mailing list for developers] (gimp-developer-list |at| gnome.org), but it's of course slower than IRC. + +See also the [http://www.gimp.org/mail_lists.html overview of Gimp mailing lists]. + + + + + +==Where can I discuss GIMP development?== + +There are [http://www.gimp.org/mail_lists.html several mailing lists] associated with the GIMP project. Developments related issues can be brought up on the [[https://mail.gnome.org/mailman/listinfo/gimp-developer-list https://mail.gnome.org/mailman/listinfo/gimp-developer-list] GIMP developer mailing list. + +GIMP has its own IRC channel on GIMPNet where most of the active developers hang out. Join us in #gimp on irc.gimp.org. + +Once in a year the developers of GIMP and other open source graphics software get together to throw the [http:///www.libregraphicsmeeting.org LibreGraphicsMeeting], formerly known as GIMPCon. To see what's going on there see the [[Main_Page#Developer_Meetings|summaries of the former meetings]]. + + +==Where can I find documentation for the GIMP API?== + +There are several ways, see [[Hacking:API documentation]]. + + +==How do I make a stack trace?== + +A stack trace is a list of function calls that leads to some point in the program. Debugging tools like gdb can get stack traces from crashed applications so that developers can figure out what went wrong. By including a stack trace with your bug report, it will be much easier for the developers to fix the reported problem. + +Information on how to make a stack trace can be found in the document [https://wiki.gnome.org/action/show/GettingInTouch/Bugzilla/GettingTraces?action=show Capturing Stack Traces]. + + +==What is the best way to submit a patch?== + +The best way to submit a patch is to open a bug report in Bugzilla and attach the patch there along with a description of what it does and why it should be applied. + +An introduction to how this is done can be found in the [http://www.gimp.org/bugs/howtos/submit-patch.html How To Create and Submit a Patch document]. This page describes how you can submit a patch. You can also post it to the mailing lists '''GIMP Developer''' or '''GEGL Developer''', but this only applies to very small patches (at maximum 10 KB). + + +==What is the preferred coding style used in GIMP?== + +See our [[Glossary#Hackordnung| Hackordnung]]. + + +==How can I configure my editor for this coding style?== + +Your editor will not be able to do everything for you, but you can configure most editors so that they use two spaces for indentation, use spaces instead of tabs, etc. + +If you are using Emacs, you can insert the following settings into your ~/.emacs file: + +
       ;; Merge this into your custom-set-variables section if you already have one
    +   (custom-set-variables
    +    ;; Syntax highlighting
    +    '(global-font-lock-mode t nil (font-lock))
    +    '(show-paren-mode t nil (paren))
    +   )
    +   ;; use UTF-8 by default
    +   (prefer-coding-system 'mule-utf-8)
    +   ;; use the GNU style for C files, spaces instead of tabs, highlight bad spaces
    +   (setq c-mode-common-hook '(lambda () (c-set-style "gnu")
    +                               (setq indent-tabs-mode nil)
    +                               (setq show-trailing-whitespace t))) 
    +
    + +If you are using Vim, you can insert the following settings into your ~/.vimrc file: + +
       syn on           " syntax highlighting
    +   set expandtab    " use spaces instead of tabs
    +   set shiftwidth=2 " default indentation is 2 spaces 
    +
    + +If you are using another editor and you know how to configure it correctly, please tell us about it on the GIMP developer mailing list so that we can update this FAQ. + + +==Who coordinates the GIMP translation efforts?== + +Any help with translations is appreciated. If you want to help, please get in contact with the people from the [http://live.gnome.org/TranslationProject GNOME Translation Project] who coordinate all translation efforts for projects hosted in the GNOME GIT repository. + +More information about GIMP and localisation can be found in the file [https://git.gnome.org/browse/gimp/plain/README.i18n README.i18n]. + + +==Where do I find the code?== + +The GIMP source code lives in the [https://git.gnome.org/browse/gimp gimp] repository on the [https://git.gnome.org/browse/ GNOME git server]. + +The current production branch has the name of the current version, i.e. gimp-2-8. Bugfixes go here. + +The branch 'master' is the development branch. This is the place for bugfixes and new features. + +See also 'Which GIMP related projects can I contribute to?' + + + + +==What's the best way to download, compile and keep up-to-date Gimp's source code?== + +===Compiling GIMP=== + +# General: [[Hacking:Building]] +# Additional descriptions for Linux: [[Hacking:Building/Linux]] + + + + +===Short guide:=== + +# Pull the sources down from git. +# Configure and make babl. +# Configure and make gegl. +# Configure and make gimp. + +===Installing needed libraries on Ubuntu=== +
    apt-get build-dep gimp
    +
    + + + + +===Links to more detailed descriptions:=== + +* [http://www.graphics-muse.org/artistsguide/?p=247 http://www.graphics-muse.org/artistsguide/?p=247] +* [http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html http://www.chromecode.com/2009/12/best-way-to-keep-up-with-gimp-from-git_26.html] +* [http://lightningismyname.blogspot.com/p/compiling-gimp.html http://lightningismyname.blogspot.com/p/compiling-gimp.html] + +===How to compile Gimp for Windows?=== + +The chapter [[Hacking:Building/Windows]] approaches this topic in detail. + + +==What are planned deadlines for next edititons of Gimp? Are there any?== + +Once we have a bigger team, we probably will have deadlines. At this point we don't have the resources to plan time-based releases. + + +==What were the last changes in the code?== + +[https://git.gnome.org/browse/gimp/log/?h=gimp-2-8 GIMP 2.8] +[https://git.gnome.org/browse/gimp/log/ GIMP master (the development version)] + + +=Plug-In Development= + +==How can I get started with developing plug-ins?== + +See [[Hacking:Plugins| How to write a GIMP plug-in]]. + + +==Is there a plug-in template available?== + +Yes. An official GIMP plug-in template is available in the [https://git.gnome.org/browse/gimp-plugin-template gimp-plugin-template git module]. Snapshots are available at ftp.gimp.org. + + +==How about a Script-Fu template?== + +Yes. Simon Budig has written a fill-in-the-blanks Script-Fu template which is available [http://www.home.unix-ag.org/simon/files/script-fu-template.scm here]. + + +==How do I get my plug-in included in the GIMP?== + +The best way to make your plug-in available to the World is to submit it to the [http://registry.gimp.org/ GIMP Plug-In Registry]. + +If you are certain that your plug-in will be useful to all GIMP users, then you can ask the GIMP developers to consider it for inclusion in future GIMP release. The best way to do that is to suggest it on the GIMP developer mailing list or to open an enhancement request in Bugzilla. However, we would like to limit the number of plug-ins included in the standard distribution and encourage all users to use the registry. + + +==How do I debug a GIMP plug-in?== + +Eeek! The plug-in you're working on has a bug in it! And the fix isn't completely obvious, so you want to use debugger to see what is going on. But hmm, how does one start a plug-in under a debugger if GIMP is the one who is starting the plug-in... + +To address this issue, libgimp has some hooks controlled by the '''GIMP_PLUGIN_DEBUG''' environment variable. The idea is that you can attach a debugger to the pid of the plug-in you want to debug. The process is described in the file debug-plug-ins.txt. + + +==Will the plug-in I compiled against 2.0 work with GIMP 2.2 or 2.4?== + +The short answer is yes. GIMP 2.2 and 2.4 are binary compatible with plug-ins compiled for GIMP 2.0. The API is also backwards source compatible, so your plug-in should also compile cleanly against GIMP 2.2 and 2.4. + +If the plug-in you compiled for 2.0 does not work with 2.2 or 2.4, there is one change which has been made which is not backwards compatible, since the old behaviour was considered incorrect. If you create a temporary drawable, using for example gimp_layer_new(), you are now required to add it to an image before calling any functions with the drawable as an argument. + + +=GEGL= + +==What is GEGL?== + +GEGL is the [http://www.gegl.org/ Generic Graphical Library]. It is supposed to replace the handling of various image processing tasks in GIMP in a not too distant future (planned for GIMP 2.10). + + +==What will GEGL be able to do?== + +GEGL will be a general image processing library. It uses a directed acyclic graph, a DAG, to represent image processing operations. In the DAG, images are edges, and operations are nodes. It takes advantage of this DAG to minimize regions which are processed, provide efficient caching of operations, and efficient redrawing when a parameter of the graph changes. + +GEGL should also be independent of the data type being processed and will be able to handle high bit depth images, ICC profiles and parallel processing of image tiles. + + +==Where to contribute to the future of GEGL?== + +You can find a good start for GEGL here: +[http://gegl.org/contribute.html http://gegl.org/contribute.html] + + +==What does all that gibberish mean for GIMP?== + +Many highly requested features of the GIMP will be easier to do using GEGL. Layer effects, layer groups, and adjustment layers are quite easily represented (and efficiently calculated) using the DAG organization of GEGL. CMYK and high bit depth support will be easier because GEGL does not make the same assumptions about color spaces and data types that the GIMP does. + +The reusability of image processing operations means that plug-ins will be able to be designed in a much more modular way. The brush system will be able to become more flexible, especially when filter plug-ins are able to be used as procedural brush plug-ins. + + + + + +=Bugzilla= + +==What is Bugzilla?== + +The GIMP project uses GNOME Bugzilla for tracking of bug reports, enhancement requests etc. + +A beginners tutorial describing how to report a bug can be found in the [http://www.gimp.org/bugs/howtos/bugzilla.html How To Report GIMP Bugs] document. + + + + + +==What is the meaning of the NEEDINFO status code in Bugzilla?== + +If the status of a bug is changed to NEEDINFO it means the GIMP developers need more information from the bug reporter in order to resolve the bug. + +More information about the meaning of the Bugzilla status field codes can be found in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle]. + + +==What is the best way to refer to a bug in Bugzilla?== + +The best way to refer to a bug is “bug #nnnnn”, where nnnnn is the bug number. Using “bug” before the number allows Bugzilla to link to the corresponding bug report automatically. Using “#” before the number is optional for Bugzilla but makes it easier to locate references to bug reports in the ChangeLog or in e-mails. + +When referencing multiple bugs, it is better to be a bit redundant by writing “bug #xxxxx, bug #yyyyy and bug #zzzzz” instead of “bugs #xxxxx, #yyyyy and #zzzzz” in order to allow Bugzilla to link all bugs automatically. + + +==What is the proper way of handling duplicate bug reports?== + +A bug report describing the same bug as a previous bug report should be marked as DUPLICATE of the older one. In some exceptional cases, it is possible to mark an old bug report as DUPLICATE of a newer one (e.g., when the newer bug report has a significantly better description than the older one). + +Another exception is when the same person submits the same bug report several times (same description): in this case, it is better to mark the additional copies of the bug report as INVALID in order to avoid inflating the statistics about the number of duplicates. + + +==What is the proper way of marking a bug as RESOLVED?== + +When fixing a bug, always mention the bug number in the commit message. Once the changes are in git, paste the relevant part of the commit message (or all of it) in the comment field and mark the bug as RESOLVED FIXED. These cross-references help a lot when trying to find when a bug was fixed, its relations to other bugs, and potential regressions. + +A bug that is fixed in git or in an unstable release should be marked as RESOLVED FIXED. Optionally, the reporter or someone other than the one who fixed the bug can mark it as VERIFIED after some testing. When the fix is part of a stable release, it can be marked as CLOSED. + +This is explained further in [http://bugzilla.gnome.org/page.cgi?id=bug-status.html A Bug's Life Cycle] except for the difference between stable and unstable releases. + + + + + +=GIT= + +==How can I learn more about using git?== + +[https://wiki.gnome.org/Git Here] you find more information, including links to Git tutorials. + + +==How do I commit to the Git tree?== + +GIMP uses GNOME's Git repository for source code storage. Please read their [https://live.gnome.org/NewAccounts guidelines]. + +Please note that much like GNOME we want to work with you for a while before we can confirm that you are going to make a great upstream developer. Until then you can maintain your own branch on Github or Gitorious. + +We also wrote a guide on [[Hacking:Patches|submitting patches]]. + + +==What should I put in the commit message when doing a git commit?== + +Please put a short explanation of the change on the first line. Then, after an empty line, you can describe the change in more detail using as many lines as you need. Try not to exceed 72 colums. + +If the commit fixes a bug or part of a bug please use the bug number and description as the first line of the commit message. It's most convenient to just copy the line from the Bugzilla bug page. + + +==How can I add such a nicely formatted summary of my commit to a bug report?== + +If your commit is the latest commit on the branch, use + +
     git show --stat
    +
    + +If you want to output a particular commit, use + +
     git show --stat 1234567 (where 1234567 is the SHA1 hash of this commit)
    +
    + + +The output looks like: + +
    +commit 9b6201e2806920e66602302bfee3ae1341f38bd4
    +Author: John Doe 
    +Date:   Sat Feb 1 08:45:21 2010 +0100
    +
    +    Bug 8154711 - Add more tutorial links.
    +    
    +    Add more links to tutorial sites.
    +
    + links/index.htrw | 11 ++++++++++-
    + 1 file changed, 10 insertions(+), 1 deletion(-)
    +
    + +=Miscellaneous= + +==Where can I learn more about the GObject system used by GIMP?== + +The [https://developer.gnome.org/gobject/stable/ GObject documentation] has a nice [https://developer.gnome.org/gobject/stable/howto-gobject.html tutorial] that you might want to have a look at. + + +==Where can I learn more about color spaces, color space conversions and other color science topics?== + +Unfortunately, the theoretical foundations of colors and their internal representation +are not as easy as seeing them in nature. Elle Stone wrote [http://ninedegreesbelow.com/photography/xyz-rgb.html a good documentation of color spaces] which is recommended reading. + +Charles Poynton has collected a set of [http://www.poynton.com/ColorFAQ.html Frequently Asked Questions about Color]. + +In our [[Glossary]] we explain the relevant terms. + + +==Where can I learn more about image manipulation algorithms?== + +A good source of information is the comp.graphics.algorithms list of [http://www.faqs.org/faqs/graphics/algorithms-faq/ Frequently Asked Questions]. + + +==What is ohloh.net for? Why developers are listed there and not on an official Gimp website?== + +The GIMP project itself doesn't maintain a site with an overview of the developers. If you want to know who are most active developers in the project, you can look at [http://www.ohloh.net/p/gimp/contributors?query=&sort=commits_12_mo ohloh.net statistics of the last 12 months]. +Ohloh.net is free, public directory, a web service and online community platform that aims to map the landscape of open source development (see [http://en.wikipedia.org/w/index.php?title=Ohloh&oldid=495142279 the description in the English Wikipedia]). It collects information from public available source code repositories and creates statistics from it. +To read more about ohloh.net, visit [http://meta.ohloh.net/us/ the ohloh.net self-introduction] . + + +==What is buildbot? How to use Buildbot for GIMP?== + +Why is it on [https://gimptest.flamingtext.com:9090/ https://gimptest.flamingtext.com:9090/] and not on official Gimp's website? + +What are the most common uses of the Buildbot? + +TODO + + +==Is there a GIMP user FAQ available?== + +Yes, you find it [http://www.gimp.org/docs/userfaq.html here]. + + +==How can I contribute to this FAQ?== + +If you would like to contribute to this FAQ, send an e-mail to the [https://mail.gnome.org/mailman/listinfo/gimp-developer-list GIMP developer mailing list] with the exact text you think should be included (both question and answer). + +With your help this FAQ will grow and become more useful. + + \ No newline at end of file diff --git a/wiki/Hacking:Developer_Meetings-20161024020212-edit.txt b/wiki/Hacking:Developer_Meetings-20161024020212-edit.txt new file mode 100644 index 0000000..571b8a1 --- /dev/null +++ b/wiki/Hacking:Developer_Meetings-20161024020212-edit.txt @@ -0,0 +1,20 @@ +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. This is where we get together and discuss the future development, hack on GIMP and meet GIMP users. Beginning from 2006 GIMPCon is part of the [http://libregraphicsmeeting.org/ LibreGraphicsMeeting]. + +Meetings are usually arranged by LightningIsMyName, and they take place once in every two weeks, on Monday at 10:00 PM, Central Europe Timezone (usually, CET = GMT+1). A mail should be sent to the mailing list before each meeting to discuss the agenda, and after every meeting with a link to the meeting page. + +* [[Hacking:GIMPCon_2000, Berlin, Germany, 2000]] +* [[Hacking:GIMPCon_2003, Berlin, Germany, 2003]] +* [[Hacking:GIMPCon_2004, Kristiansand, Norway, 2004]] +* [[Hacking:GIMPCon_2005, Stuttgart, Germany, 2005]] +* [[Hacking:GIMPCon_2006, Lyon, France, 2006]] +* [[Hacking:LGM_2007 Libre Graphics Meeting, Montréal, Canada, 2007]] +* [[Hacking:LGM_2008 Libre Graphics Meeting, Wrocław, Poland, 2008]] +* [[Hacking:LGM_2009 Libre Graphics Meeting, Montréal, Canada, 2009]] +* [[Hacking:LGM_2010 Libre Graphics Meeting, Brussels, Belgium, 2010]] +* [[Hacking:LGM_2011 Libre Graphics Meeting, Montréal, Canada, 2011]] +* [[Hacking:Dev_Meeting_28_Feb_2011]] - First developer meeting! +* [[Hacking:Dev_Meeting_14_Mar_2011]] - Done! +* [[Hacking:Dev_Meeting_28_Mar_2011]] - Agenda is up! +* [[Hacking:LGM_2012 Libre Graphics Meeting, Vienna, Austria, 2012]] +* [[Hacking:LGM_2013 Libre Graphics Meeting, Madrid, Spain, 2013]] +* [[Hacking:LGM_2014 Libre Graphics Meeting, Leipzig, Germany, 2014]] diff --git a/wiki/Hacking:Developer_Meetings-20170710205256-show.txt b/wiki/Hacking:Developer_Meetings-20170710205256-show.txt new file mode 100644 index 0000000..0873bcb --- /dev/null +++ b/wiki/Hacking:Developer_Meetings-20170710205256-show.txt @@ -0,0 +1,23 @@ + + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. This is where we get together and discuss the future development, hack on GIMP and meet GIMP users. Beginning from 2006 GIMPCon is part of the [http://libregraphicsmeeting.org/ LibreGraphicsMeeting]. + +Meetings are usually arranged by LightningIsMyName, and they take place once in every two weeks, on Monday at 10:00 PM, Central Europe Timezone (usually, CET = GMT+1). A mail should be sent to the mailing list before each meeting to discuss the agenda, and after every meeting with a link to the meeting page. + + +* [[Hacking:GIMPCon_2000, Berlin, Germany, 2000]] +* [[Hacking:GIMPCon_2003, Berlin, Germany, 2003]] +* [[Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004|Hacking:GIMPCon_2004, Kristiansand, Norway, 2004]] +* [[Hacking:GIMPCon_2005, Stuttgart, Germany, 2005]] +* [[Hacking:GIMPCon_2006, Lyon, France, 2006]] +* [[Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2007|Hacking:LGM_2007 Libre Graphics Meeting, Montréal, Canada, 2007]] +* [[Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008|Hacking:LGM_2008 Libre Graphics Meeting, Wrocław, Poland, 2008]] +* [[Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2009|Hacking:LGM_2009 Libre Graphics Meeting, Montréal, Canada, 2009]] +* [[Hacking:LGM_2010 Libre Graphics Meeting, Brussels, Belgium, 2010]] +* [[Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2011|Hacking:LGM_2011 Libre Graphics Meeting, Montréal, Canada, 2011]] +* [[Hacking:Dev_Meeting_28_Feb_2011]] - First developer meeting! +* [[Hacking:Dev_Meeting_14_Mar_2011]] - Done! +* [[Hacking:Dev_Meeting_28_Mar_2011]] - Agenda is up! +* [[Hacking:LGM_2012 Libre Graphics Meeting, Vienna, Austria, 2012]] +* [[Hacking:LGM_2013 Libre Graphics Meeting, Madrid, Spain, 2013]] +* [[Hacking:LGM_2014 Libre Graphics Meeting, Leipzig, Germany, 2014]] diff --git a/wiki/Hacking:Developer_Meetings-20201124143235-edit.txt b/wiki/Hacking:Developer_Meetings-20201124143235-edit.txt new file mode 100644 index 0000000..571b8a1 --- /dev/null +++ b/wiki/Hacking:Developer_Meetings-20201124143235-edit.txt @@ -0,0 +1,20 @@ +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. This is where we get together and discuss the future development, hack on GIMP and meet GIMP users. Beginning from 2006 GIMPCon is part of the [http://libregraphicsmeeting.org/ LibreGraphicsMeeting]. + +Meetings are usually arranged by LightningIsMyName, and they take place once in every two weeks, on Monday at 10:00 PM, Central Europe Timezone (usually, CET = GMT+1). A mail should be sent to the mailing list before each meeting to discuss the agenda, and after every meeting with a link to the meeting page. + +* [[Hacking:GIMPCon_2000, Berlin, Germany, 2000]] +* [[Hacking:GIMPCon_2003, Berlin, Germany, 2003]] +* [[Hacking:GIMPCon_2004, Kristiansand, Norway, 2004]] +* [[Hacking:GIMPCon_2005, Stuttgart, Germany, 2005]] +* [[Hacking:GIMPCon_2006, Lyon, France, 2006]] +* [[Hacking:LGM_2007 Libre Graphics Meeting, Montréal, Canada, 2007]] +* [[Hacking:LGM_2008 Libre Graphics Meeting, Wrocław, Poland, 2008]] +* [[Hacking:LGM_2009 Libre Graphics Meeting, Montréal, Canada, 2009]] +* [[Hacking:LGM_2010 Libre Graphics Meeting, Brussels, Belgium, 2010]] +* [[Hacking:LGM_2011 Libre Graphics Meeting, Montréal, Canada, 2011]] +* [[Hacking:Dev_Meeting_28_Feb_2011]] - First developer meeting! +* [[Hacking:Dev_Meeting_14_Mar_2011]] - Done! +* [[Hacking:Dev_Meeting_28_Mar_2011]] - Agenda is up! +* [[Hacking:LGM_2012 Libre Graphics Meeting, Vienna, Austria, 2012]] +* [[Hacking:LGM_2013 Libre Graphics Meeting, Madrid, Spain, 2013]] +* [[Hacking:LGM_2014 Libre Graphics Meeting, Leipzig, Germany, 2014]] diff --git a/wiki/Hacking:Developer_Meetings-20210515163235-edit.txt b/wiki/Hacking:Developer_Meetings-20210515163235-edit.txt new file mode 100644 index 0000000..571b8a1 --- /dev/null +++ b/wiki/Hacking:Developer_Meetings-20210515163235-edit.txt @@ -0,0 +1,20 @@ +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. This is where we get together and discuss the future development, hack on GIMP and meet GIMP users. Beginning from 2006 GIMPCon is part of the [http://libregraphicsmeeting.org/ LibreGraphicsMeeting]. + +Meetings are usually arranged by LightningIsMyName, and they take place once in every two weeks, on Monday at 10:00 PM, Central Europe Timezone (usually, CET = GMT+1). A mail should be sent to the mailing list before each meeting to discuss the agenda, and after every meeting with a link to the meeting page. + +* [[Hacking:GIMPCon_2000, Berlin, Germany, 2000]] +* [[Hacking:GIMPCon_2003, Berlin, Germany, 2003]] +* [[Hacking:GIMPCon_2004, Kristiansand, Norway, 2004]] +* [[Hacking:GIMPCon_2005, Stuttgart, Germany, 2005]] +* [[Hacking:GIMPCon_2006, Lyon, France, 2006]] +* [[Hacking:LGM_2007 Libre Graphics Meeting, Montréal, Canada, 2007]] +* [[Hacking:LGM_2008 Libre Graphics Meeting, Wrocław, Poland, 2008]] +* [[Hacking:LGM_2009 Libre Graphics Meeting, Montréal, Canada, 2009]] +* [[Hacking:LGM_2010 Libre Graphics Meeting, Brussels, Belgium, 2010]] +* [[Hacking:LGM_2011 Libre Graphics Meeting, Montréal, Canada, 2011]] +* [[Hacking:Dev_Meeting_28_Feb_2011]] - First developer meeting! +* [[Hacking:Dev_Meeting_14_Mar_2011]] - Done! +* [[Hacking:Dev_Meeting_28_Mar_2011]] - Agenda is up! +* [[Hacking:LGM_2012 Libre Graphics Meeting, Vienna, Austria, 2012]] +* [[Hacking:LGM_2013 Libre Graphics Meeting, Madrid, Spain, 2013]] +* [[Hacking:LGM_2014 Libre Graphics Meeting, Leipzig, Germany, 2014]] diff --git a/wiki/Hacking:Eclipse-20150911221746-edit.txt b/wiki/Hacking:Eclipse-20150911221746-edit.txt new file mode 100644 index 0000000..374c4d5 --- /dev/null +++ b/wiki/Hacking:Eclipse-20150911221746-edit.txt @@ -0,0 +1,120 @@ +This page will teach you how to set [http://www.eclipse.org/ Eclipse IDE] to work on the latest source of GIMP from git. + += About Eclipse = +== Why use Eclipse to work on Babl, GEGL and GIMP? == + +Some of the features that are interesting for C/C++ developers are: +* cross-referencing: Ctrl click an identifier and it will take you to its definition, +* call hierarchy, +* comprehensive search capabilities, +* built in Git support, +* Autotools integration, +* graphical debugger, +* explore remote systems from within Eclipse, +* focus on the current task, +* Bugzilla integration, +* static code analysis. +and more. +Eclipse runs on every platform that can run Java and has a graphical interface. + +It is actively developed and maintained from a living community, see the [http://www.eclipse.org/forums/ Eclipse community forums]. + +== Why not to use Eclipse to work on Babl, GEGL and GIMP? == +Because it's not Emacs :-P + +Eclipse is slow. + += Preparations = +The following steps describe the process for Eclipse 4.3 'Kepler' on Linux. It is assumed that your workspace for all projects is /home/user/workspace and GIMP will be installed in /home/user/prefix/gimp. + +The continuous example uses Babl, because it is small and easy for a start. Where necessary the tutorial describes the differences for GEGL and GIMP. + +== Prepare the build environment == + +clone the Babl Git repository into your workspace: +# '''cd /home/user/workspace''' +# '''git clone git://git.gnome.org/Babl''' + +To the same for GEGL and GIMP. + +== Get Eclipse == +The easiest way is simply to [http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/keplersr2 download Eclipse IDE for C/C++ Developers]). +If you already have a working Eclipse installation and want to upgrade it, then download the following plug-ins: +* CDT (for C/C++ development), + +and optionally +* Web Developer Tools (to edit HTML, XML and XSL), +* EGit (for Git integration), +* Subversive (for Subversion integration), +* Mylyn Task List (for Bugzilla integration and task focused working), +* Remote Systems Explorer (to manage files, search, execute commands and debug on remote systems). + +== Configure Eclipse to work on Babl, GEGL and GIMP == + +=== Create projects === +# Open the C/C++ perspective. +# Create the project: File/New/Makefile Project with Existing Code: +#:* Leave the field 'Project Name' empty. It will be filled in the next step. +#:* Click 'Browse' behind 'Existing Code Location' and select /home/user/workspace/babl. +#:* Languages: C (for GEGL also C++). +#:* Toolchain for Indexer settings: GNU Autotools Toolchain +# Tell Eclipse that it is an Autotools project, so you can build in Eclipse: +#:* Right click on the project +#:* From the context menu select New/Convert to a C/C++ Autotools project +#:* Candidates for conversion: babl; Convert to C or C++: C +#:* For Babl you're done, press 'Finish'. Otherwise hit 'Next' button two times. +#:* Referenced C/C++ projects: For GEGL: babl, For GIMP: babl and gegl + +=== Share projects with Git === +# Open the 'Git Repository Exploring' perspective. +# Open the 'Git Repositories' view. +# Add an existing local Git repositoriy to this view by clicking the button with this tooltip: +#:* Directory: Browse, select /home/user/workspace/babl. +#:* Make sure that Babl is checked in the search results list. +# Open the C/C++ perspective. +# Right click on the Babl project, select 'Team/Share Project...': +#:* Repository type: Git +#:* select repository: the Babl Git repository + +It is important to have created the Git repository before connecting to it from Eclipse. Eclipse refuses trying to create the repository in Babl's workspace folder, so we have to keep this order. + +=== Configure build environment === + +=== Integrate Autotools === + + +== Configure Eclipse to work with XML files == + +XML files appear either obviously with the extension .xml, but also a some more file formats are based on XML. +With Eclipse's XML plug-in you can edit the raw source code, but also work the XML tree structure of an XML file. +The following files are known to be XML files: + +* '''*.bundle''' Configuration files for gtk-mac-bundler +* '''*.modules''' Configuration files for JHBuild +* '''*.svg''' Vector graphics files +* '''*.plist''' OS X application metadata +* '''*.xml''' DocBook documents, D-Bus service configuration, menu descriptors, the authors list etc. + +To be able to edit XML files as such: + +# Open 'Help/Install new software...'. Install the plug-in '''XML Editors and Tools'''. If you want to edit XSL files, also install the '''XSL Developer Tools'''. +# Open 'Window/Preferences'. Select 'General/Content Types'. Select 'Text' and then 'XML'. Press the 'Add' button and add then enter *.bundle. Repeat the last step also for *.modules, *.plist etc. + += Working with Eclipse = + +== Code == + +== Build == + +== Install == + += Miscellanous = + +See also + +* [http://www.eclipse.org/ The Eclipse site] +* [https://wiki.gnome.org/Apps/Eclipse Eclipse in the GNOME wiki] + += Problems and solutions = + +See the [[Hacking:Problems_and_solutions| Problems and Solutions page]]. diff --git a/wiki/Hacking:Eclipse-20171105101404-show.txt b/wiki/Hacking:Eclipse-20171105101404-show.txt new file mode 100644 index 0000000..be4dca1 --- /dev/null +++ b/wiki/Hacking:Eclipse-20171105101404-show.txt @@ -0,0 +1,153 @@ + + +This page will teach you how to set [http://www.eclipse.org/ Eclipse IDE] to work on the latest source of GIMP from git. + + +__TOC__ + +=About Eclipse= + +==Why use Eclipse to work on Babl, GEGL and GIMP?== + +Some of the features that are interesting for C/C++ developers are: + + +* cross-referencing: Ctrl click an identifier and it will take you to its definition, +* call hierarchy, +* comprehensive search capabilities, +* built in Git support, +* Autotools integration, +* graphical debugger, +* explore remote systems from within Eclipse, +* focus on the current task, +* Bugzilla integration, +* static code analysis. + +and more. +Eclipse runs on every platform that can run Java and has a graphical interface. + +It is actively developed and maintained from a living community, see the [http://www.eclipse.org/forums/ Eclipse community forums]. + + +==Why not to use Eclipse to work on Babl, GEGL and GIMP?== + +Because it's not Emacs :-P + +Eclipse is slow. + + +=Preparations= + +The following steps describe the process for Eclipse 4.3 'Kepler' on Linux. It is assumed that your workspace for all projects is /home/user/workspace and GIMP will be installed in /home/user/prefix/gimp. + +The continuous example uses Babl, because it is small and easy for a start. Where necessary the tutorial describes the differences for GEGL and GIMP. + + +==Prepare the build environment== + +clone the Babl Git repository into your workspace: + + +# '''cd /home/user/workspace''' +# '''git clone git://git.gnome.org/Babl''' + +To the same for GEGL and GIMP. + + +==Get Eclipse== + +The easiest way is simply to [http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/keplersr2 download Eclipse IDE for C/C++ Developers]). +If you already have a working Eclipse installation and want to upgrade it, then download the following plug-ins: + + +* CDT (for C/C++ development), + +and optionally + + +* Web Developer Tools (to edit HTML, XML and XSL), +* EGit (for Git integration), +* Subversive (for Subversion integration), +* Mylyn Task List (for Bugzilla integration and task focused working), +* Remote Systems Explorer (to manage files, search, execute commands and debug on remote systems). + +==Configure Eclipse to work on Babl, GEGL and GIMP== + +===Create projects=== + +# Open the C/C++ perspective. +# Create the project: File/New/Makefile Project with Existing Code: +: +* Leave the field 'Project Name' empty. It will be filled in the next step. +* Click 'Browse' behind 'Existing Code Location' and select /home/user/workspace/babl. +* Languages: C (for GEGL also C++). +* Toolchain for Indexer settings: GNU Autotools Toolchain +# Tell Eclipse that it is an Autotools project, so you can build in Eclipse: +: +* Right click on the project +* From the context menu select New/Convert to a C/C++ Autotools project +* Candidates for conversion: babl; Convert to C or C++: C +* For Babl you're done, press 'Finish'. Otherwise hit 'Next' button two times. +* Referenced C/C++ projects: For GEGL: babl, For GIMP: babl and gegl + +===Share projects with Git=== + +# Open the 'Git Repository Exploring' perspective. +# Open the 'Git Repositories' view. +# Add an existing local Git repositoriy to this view by clicking the button with this tooltip: +: +* Directory: Browse, select /home/user/workspace/babl. +* Make sure that Babl is checked in the search results list. +# Open the C/C++ perspective. +# Right click on the Babl project, select 'Team/Share Project...': +: +* Repository type: Git +* select repository: the Babl Git repository + +It is important to have created the Git repository before connecting to it from Eclipse. Eclipse refuses trying to create the repository in Babl's workspace folder, so we have to keep this order. + + +===Configure build environment=== + +===Integrate Autotools=== + +==Configure Eclipse to work with XML files== + +XML files appear either obviously with the extension .xml, but also a some more file formats are based on XML. +With Eclipse's XML plug-in you can edit the raw source code, but also work the XML tree structure of an XML file. +The following files are known to be XML files: + + +* '''*.bundle''' Configuration files for gtk-mac-bundler +* '''*.modules''' Configuration files for JHBuild +* '''*.svg''' Vector graphics files +* '''*.plist''' OS X application metadata +* '''*.xml''' DocBook documents, D-Bus service configuration, menu descriptors, the authors list etc. + +To be able to edit XML files as such: + + +# Open 'Help/Install new software...'. Install the plug-in '''XML Editors and Tools'''. If you want to edit XSL files, also install the '''XSL Developer Tools'''. +# Open 'Window/Preferences'. Select 'General/Content Types'. Select 'Text' and then 'XML'. Press the 'Add' button and add then enter *.bundle. Repeat the last step also for *.modules, *.plist etc. + +=Working with Eclipse= + +==Code== + +==Build== + +==Install== + +=Miscellanous= + +See also + + +* [http://www.eclipse.org/ The Eclipse site] +* [https://wiki.gnome.org/Apps/Eclipse Eclipse in the GNOME wiki] + +=Problems and solutions= + +See the [[Hacking:Problems_and_solutions| Problems and Solutions page]]. + + \ No newline at end of file diff --git a/wiki/Hacking:Eclipse-20210515112800-edit.txt b/wiki/Hacking:Eclipse-20210515112800-edit.txt new file mode 100644 index 0000000..374c4d5 --- /dev/null +++ b/wiki/Hacking:Eclipse-20210515112800-edit.txt @@ -0,0 +1,120 @@ +This page will teach you how to set [http://www.eclipse.org/ Eclipse IDE] to work on the latest source of GIMP from git. + += About Eclipse = +== Why use Eclipse to work on Babl, GEGL and GIMP? == + +Some of the features that are interesting for C/C++ developers are: +* cross-referencing: Ctrl click an identifier and it will take you to its definition, +* call hierarchy, +* comprehensive search capabilities, +* built in Git support, +* Autotools integration, +* graphical debugger, +* explore remote systems from within Eclipse, +* focus on the current task, +* Bugzilla integration, +* static code analysis. +and more. +Eclipse runs on every platform that can run Java and has a graphical interface. + +It is actively developed and maintained from a living community, see the [http://www.eclipse.org/forums/ Eclipse community forums]. + +== Why not to use Eclipse to work on Babl, GEGL and GIMP? == +Because it's not Emacs :-P + +Eclipse is slow. + += Preparations = +The following steps describe the process for Eclipse 4.3 'Kepler' on Linux. It is assumed that your workspace for all projects is /home/user/workspace and GIMP will be installed in /home/user/prefix/gimp. + +The continuous example uses Babl, because it is small and easy for a start. Where necessary the tutorial describes the differences for GEGL and GIMP. + +== Prepare the build environment == + +clone the Babl Git repository into your workspace: +# '''cd /home/user/workspace''' +# '''git clone git://git.gnome.org/Babl''' + +To the same for GEGL and GIMP. + +== Get Eclipse == +The easiest way is simply to [http://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/keplersr2 download Eclipse IDE for C/C++ Developers]). +If you already have a working Eclipse installation and want to upgrade it, then download the following plug-ins: +* CDT (for C/C++ development), + +and optionally +* Web Developer Tools (to edit HTML, XML and XSL), +* EGit (for Git integration), +* Subversive (for Subversion integration), +* Mylyn Task List (for Bugzilla integration and task focused working), +* Remote Systems Explorer (to manage files, search, execute commands and debug on remote systems). + +== Configure Eclipse to work on Babl, GEGL and GIMP == + +=== Create projects === +# Open the C/C++ perspective. +# Create the project: File/New/Makefile Project with Existing Code: +#:* Leave the field 'Project Name' empty. It will be filled in the next step. +#:* Click 'Browse' behind 'Existing Code Location' and select /home/user/workspace/babl. +#:* Languages: C (for GEGL also C++). +#:* Toolchain for Indexer settings: GNU Autotools Toolchain +# Tell Eclipse that it is an Autotools project, so you can build in Eclipse: +#:* Right click on the project +#:* From the context menu select New/Convert to a C/C++ Autotools project +#:* Candidates for conversion: babl; Convert to C or C++: C +#:* For Babl you're done, press 'Finish'. Otherwise hit 'Next' button two times. +#:* Referenced C/C++ projects: For GEGL: babl, For GIMP: babl and gegl + +=== Share projects with Git === +# Open the 'Git Repository Exploring' perspective. +# Open the 'Git Repositories' view. +# Add an existing local Git repositoriy to this view by clicking the button with this tooltip: +#:* Directory: Browse, select /home/user/workspace/babl. +#:* Make sure that Babl is checked in the search results list. +# Open the C/C++ perspective. +# Right click on the Babl project, select 'Team/Share Project...': +#:* Repository type: Git +#:* select repository: the Babl Git repository + +It is important to have created the Git repository before connecting to it from Eclipse. Eclipse refuses trying to create the repository in Babl's workspace folder, so we have to keep this order. + +=== Configure build environment === + +=== Integrate Autotools === + + +== Configure Eclipse to work with XML files == + +XML files appear either obviously with the extension .xml, but also a some more file formats are based on XML. +With Eclipse's XML plug-in you can edit the raw source code, but also work the XML tree structure of an XML file. +The following files are known to be XML files: + +* '''*.bundle''' Configuration files for gtk-mac-bundler +* '''*.modules''' Configuration files for JHBuild +* '''*.svg''' Vector graphics files +* '''*.plist''' OS X application metadata +* '''*.xml''' DocBook documents, D-Bus service configuration, menu descriptors, the authors list etc. + +To be able to edit XML files as such: + +# Open 'Help/Install new software...'. Install the plug-in '''XML Editors and Tools'''. If you want to edit XSL files, also install the '''XSL Developer Tools'''. +# Open 'Window/Preferences'. Select 'General/Content Types'. Select 'Text' and then 'XML'. Press the 'Add' button and add then enter *.bundle. Repeat the last step also for *.modules, *.plist etc. + += Working with Eclipse = + +== Code == + +== Build == + +== Install == + += Miscellanous = + +See also + +* [http://www.eclipse.org/ The Eclipse site] +* [https://wiki.gnome.org/Apps/Eclipse Eclipse in the GNOME wiki] + += Problems and solutions = + +See the [[Hacking:Problems_and_solutions| Problems and Solutions page]]. diff --git a/wiki/Hacking:Emacs-20150910222259-edit.txt b/wiki/Hacking:Emacs-20150910222259-edit.txt new file mode 100644 index 0000000..68635fc --- /dev/null +++ b/wiki/Hacking:Emacs-20150910222259-edit.txt @@ -0,0 +1,46 @@ +== This page is a stub and need to be completed == + + +This page will teach you how to set [http://www.gnu.org/software/emacs/ Emacs editor] to work on the latest source of GIMP from git. The information below assume that you have installed the following tools: +* [https://github.com/Enselic/enselic-home/tree/master/elisp Enselic-elisp] +* [http://ctags.sourceforge.net/ Exuberant Ctags] + +== Configuring Emacs to work on GIMP == + + + + + + + + + +--------------------- +Tool: +Emacs + https://github.com/Enselic/enselic-home/tree/master/elisp + +Direct compilation: +Yes, with M-x compile and M-x flymake-mode + +Code completion: +Kind of, Emacs supports tab-completion for symbols in all buffers, so if +I have the relevant headers open, I have tab-completion for e.g. all +gtk_ functions. Not the best code completion, but you come pretty far +with it. + +Documentation browser: +I use exuberant-ctags for symbol definition lookup, so to get to the +documentation of a function, I usually go to the declaration/definition +of it using the exuberant-ctags indexes. I also occasionally use +devhelp, but that's an external program. + +Debugging: +Yes, M-x gdb + +Refactoring: +No, unfortunately not. + + +---------------------------- + +Thanks to Martin Nordholts for the above configuration diff --git a/wiki/Hacking:Emacs-20161024001914-show.txt b/wiki/Hacking:Emacs-20161024001914-show.txt new file mode 100644 index 0000000..881fa13 --- /dev/null +++ b/wiki/Hacking:Emacs-20161024001914-show.txt @@ -0,0 +1,44 @@ + + +==This page is a stub and need to be completed== + +This page will teach you how to set [http://www.gnu.org/software/emacs/ Emacs editor] to work on the latest source of GIMP from git. The information below assume that you have installed the following tools: + + +* [https://github.com/Enselic/enselic-home/tree/master/elisp Enselic-elisp] +* [http://ctags.sourceforge.net/ Exuberant Ctags] + +==Configuring Emacs to work on GIMP== +
    + +Tool: +Emacs + [https://github.com/Enselic/enselic-home/tree/master/elisp https://github.com/Enselic/enselic-home/tree/master/elisp] + +Direct compilation: +Yes, with M-x compile and M-x flymake-mode + +Code completion: +Kind of, Emacs supports tab-completion for symbols in all buffers, so if +I have the relevant headers open, I have tab-completion for e.g. all +gtk_ functions. Not the best code completion, but you come pretty far +with it. + +Documentation browser: +I use exuberant-ctags for symbol definition lookup, so to get to the +documentation of a function, I usually go to the declaration/definition +of it using the exuberant-ctags indexes. I also occasionally use +devhelp, but that's an external program. + +Debugging: +Yes, M-x gdb + +Refactoring: +No, unfortunately not. + + + +
    + +Thanks to Martin Nordholts for the above configuration + + \ No newline at end of file diff --git a/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150906183933-show.txt b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150906183933-show.txt new file mode 100644 index 0000000..2692375 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150906183933-show.txt @@ -0,0 +1,13 @@ + + +The first official GIMP Developers Conference took place June 2nd - 4th 2000 in [http://www.berlin.de/ Berlin]. + +The [http://berlin.ccc.de/ Chaos Computer Club Berlin] was so kind to allow us to use their rooms for the conference. The [https://www.ccc.de/ Chaos Computer Club] is a galactic community of human beings including all ages, genders, races and social positions. They demand unlimited freedom and flow of information without censorship. + +[[File:People2000-small.jpg|The People at GIMPCon 2000]] + +From left to right, top to bottom: Calvin, Simon, Seth, Jakub, Lauri, Austin, Tigert, Tim, Jens, Tor, Jay, Daniel, Sven, Adam, Mitch, Garry, Marc, Caroline, Andy, Yosh. + +We'd like to thank the [http://www.fsf.org/ Free Software Foundation], the [https://www.ccc.de/ Chaos Computer Club] and [http://www.oreilly.de/ O'Reilly Germany] for their help that made this meeting possible. + + \ No newline at end of file diff --git a/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150911224822-edit.txt b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150911224822-edit.txt new file mode 100644 index 0000000..7298fec --- /dev/null +++ b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20150911224822-edit.txt @@ -0,0 +1,9 @@ +The first official GIMP Developers Conference took place June 2nd - 4th 2000 in [http://www.berlin.de/ Berlin]. + +The [http://berlin.ccc.de/ Chaos Computer Club Berlin] was so kind to allow us to use their rooms for the conference. The [https://www.ccc.de/ Chaos Computer Club] is a galactic community of human beings including all ages, genders, races and social positions. They demand unlimited freedom and flow of information without censorship. + +[[File:people2000-small.jpg|The People at GIMPCon 2000]] + +From left to right, top to bottom: Calvin, Simon, Seth, Jakub, Lauri, Austin, Tigert, Tim, Jens, Tor, Jay, Daniel, Sven, Adam, Mitch, Garry, Marc, Caroline, Andy, Yosh. + +We'd like to thank the [http://www.fsf.org/ Free Software Foundation], the [https://www.ccc.de/ Chaos Computer Club] and [http://www.oreilly.de/ O'Reilly Germany] for their help that made this meeting possible. diff --git a/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20161024010119-show.txt b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20161024010119-show.txt new file mode 100644 index 0000000..e3f11f1 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20161024010119-show.txt @@ -0,0 +1,13 @@ + + +The first official GIMP Developers Conference took place June 2nd - 4th 2000 in [http://www.berlin.de/ Berlin]. + +The [http://berlin.ccc.de/ Chaos Computer Club Berlin] was so kind to allow us to use their rooms for the conference. The [https://www.ccc.de/ Chaos Computer Club] is a galactic community of human beings including all ages, genders, races and social positions. They demand unlimited freedom and flow of information without censorship. + +[[File:People2000-small.jpg|The People at GIMPCon 2000]] + +From left to right, top to bottom: Calvin, Simon, Seth, Jakub, Lauri, Austin, Tigert, Tim, Jens, Tor, Jay, Daniel, Sven, Adam, Mitch, Garry, Marc, Caroline, Andy, Yosh. + +We'd like to thank the [http://www.fsf.org/ Free Software Foundation], the [https://www.ccc.de/ Chaos Computer Club] and [http://www.oreilly.de/ O'Reilly Germany] for their help that made this meeting possible. + + \ No newline at end of file diff --git a/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20200811183201-edit.txt b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20200811183201-edit.txt new file mode 100644 index 0000000..7298fec --- /dev/null +++ b/wiki/Hacking:GIMPCon_2000,_Berlin,_Germany,_2000-20200811183201-edit.txt @@ -0,0 +1,9 @@ +The first official GIMP Developers Conference took place June 2nd - 4th 2000 in [http://www.berlin.de/ Berlin]. + +The [http://berlin.ccc.de/ Chaos Computer Club Berlin] was so kind to allow us to use their rooms for the conference. The [https://www.ccc.de/ Chaos Computer Club] is a galactic community of human beings including all ages, genders, races and social positions. They demand unlimited freedom and flow of information without censorship. + +[[File:people2000-small.jpg|The People at GIMPCon 2000]] + +From left to right, top to bottom: Calvin, Simon, Seth, Jakub, Lauri, Austin, Tigert, Tim, Jens, Tor, Jay, Daniel, Sven, Adam, Mitch, Garry, Marc, Caroline, Andy, Yosh. + +We'd like to thank the [http://www.fsf.org/ Free Software Foundation], the [https://www.ccc.de/ Chaos Computer Club] and [http://www.oreilly.de/ O'Reilly Germany] for their help that made this meeting possible. diff --git a/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150906164319-show.txt b/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150906164319-show.txt new file mode 100644 index 0000000..1aa402e --- /dev/null +++ b/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150906164319-show.txt @@ -0,0 +1,284 @@ + + +The second GIMP developers conference took place the 7/8/9/10th August 2003 at the Chaos Communication Camp. The Camp was an international, four-day open-air event for hackers and associated life-forms on a field near Berlin, Germany. The GIMP developers joined this event and set up a GIMP tent to get together and discuss the future of GIMP development. Three big meetings were held at GIMPCon 2003. The topics of these meetings are listed below along with links to the minutes of the meetings. + + +__TOC__ + + + +[[File:People2003-small.png|The People at GimpCon 2003]] + + + + +==The First Big Serious Meeting== + +August 7th 2003, around 8pm + +Written by Dave Neary + +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn't be any ad hominem attacks that way, and partly because I didn't take down any names. + +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski). + +Absent but at camp: Maurits Rijk (Maurits), Branko Collin (bbc). + +Topic discussion, in approximate chronological order: + + +===The GIMP Foundation=== + +The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on “marketing” in the broadest sense of the word. + +Some of the issues were whether the foundation would be set up in Europe or in the US (in the US it might make it easier to get donations from US companies, but in Europe we're not as litigious, so setting up would certainly cost less, but then we probably wouldn't have NPO status in the US), whether it would have any technical aspect (that is, would the foundation act as a kind of steering committee for the general direction of the GIMP?), and how, if the issue came up, we might pay someone. + +This led onto a discussion of whether the foundation would be responsible for setting release dates, or whether we would have a separate... + + +===Release Manager=== + +The general consensus (more on that later) was that a release manager is a good thing. There do seem to be a few different ideas of what the role would entail. The general idea would be that the release manager would be responsible for following CVS and know at what stage a given feature is at, follow bugzilla making sure that bugs got milestoned for some release in order of their priority, would annoy people to get commits in before feature freeze dates or postpone mercilessly features which are not finished. + +It was agreed that a release schedule would be helpful to define the perimeters of responsibility of the release manager - basically, some way to set up large milestones to aim for with things to go into those milestones. This release schedule would be subject to revision, and would be no more realistic than any other release schedule, but it would serve as a guide for development. Dan agreed to draw up a first draft of this, and we'll have something more concrete before the end of the weekend. + +The questions that came up about the release manager were things like where his authority comes from, how does he decide which bugs are important and which features can be postponed and so on. In other words, how do decisions get made. Is the release manager a benevolent dictator, or does he answer to the larger developer and user community? If so, to what extent? Is backing out CVS commits OK, for example? + +So we started talking about how to get contentious decisions made. + + +===Decision making (or lack of it)=== + +Currently, there are two ways to get something done in the GIMP. First, you can write decent code and patches for a while, until you get CVS commit access, then you write whatever feature you're interested in, and commit it. If no-one backs it out, then it's in. + +Second, you can bring it up on the mailing list, or in bugzilla, or in IRC (more on communication later), and discuss it until there is a consensus. However, we tend to be pretty bad at reaching consensus on anything even slightly contentious. The important questions to be answered any time a discussion like this comes up are what's going to be done, and who's going to do it. + +It was agreed that beyond a certain point, there is generally very little technical merit to these types of discussions. It was felt that about 5 days was enough for everyone with an opinion on a given matter to make that opinion known, and that after that point, it would be an idea to have a summary of the salient points and close the discussion. That means, the people here would stop posting to the discussion. Of course, if other people want to keep on flaming, they're free to do so, but people will just ignore the thread. + +At this point, the summary should sum up the various points, and finish with an answer to those two questions - what gets done, and who's doing it. + +We may even have a bake-off system. If there are two competing ideas for the way something should be done, currently no-one tends to do it. Ideally, both people would do it and we pick the best one. + +This brings up another point, though - in general, what is authority? And in particular, at what point has someone gained enough standing and authority to post one of these thread-ending summaries? Some discussion is going to be had on that over the weekend. + + +===General stuff, about Bugzilla and CVS=== + +We talked about various ways of improving the way we use these tools. First is whether it makes sense for us to have module owners, and if so, who should they be? Should we use the system of bug owners to track who is responsible for a bug at any given time, or is the current scheme of bugs@gimp.org sufficient? Do we need to change bugs@gimp.org to something else to avoid confusion with the old bug reporting address? There were a few open points in here. + +Second, we talked about pre-release branches, and whether it would be worthwhile having a mozilla style release cycle with feature-freezes, followed by concurrent bug-fixing before unstable releases, freeing up the branch for bigger stuff that people want to start committing. In general, it was felt that there was very little to be gained from that, and the current system of a long-lived devel branch with self-imposed feature freezes every few weeks was a better way to go. + +We also expressed a desire to have more redundancy in the non-technical aspects of The GIMP, things like the mailing lists and ftp mirror lists should have more than one person with the ability to change them so that if there's a problem, and that person has no time to take care of it, then someone will. Perhaps using a Debian or GNU style ticket system might help here fro these particular tasks? In any case, everyone in a given group should know everyone else in the group, and know more or less that when an issue gets in, it will be handled by at least one person. + + +===Communication=== + +It was agreed that we need to communicate better (that's a no-brainer, really). For a start, every developer should be subscribed to the userlist. gimp-devel (if it doesn't disappear altogether) would only be used for technical discussions of implementation details - all the philosophical level discussions of new features, ui changes, release mechanisms and so on should be discussed on the user list. + +Basically, we're going to talk a lot more about how the developers can interface better with the users. + + +===Decisions=== + +Not too many of these... we will have a release manager, but we need to define exactly what his/her remit will be. And who it will be. We agreed that the “5 days and it's dead” rule for threads makes sense, so that will be done. + + +===Future=== + +# Roadmap - rough release schedule, we will have a first draft today. +# GIMP Foundation - we need to define its responsibilities, set up election rules, and get this set up. The principle of the foundation is more or less agreed. +# Communication +# Release Manager - what'll he do, who'll he be. This should be short once we have discussed communication channels a bit. +# Technie stuff - Sven and mitch are going to talk to us about the re-organisation of the code, GObjectification of everything, and other stuff. Daniel and Calvin are going to talk to us about GEGL and how they feel The GIMP could use it. This will probably be a two-way discussion about what kind of things we expect GEGL to furnish as well. +# GIMP tutorials - jimmac and nomis are going to do some presentations for people, which should be good. +# Plug-in distribution - 3 years ago this was discussion, yosh has been working on something as a proof-of-concept, it would be nice to address this and get something in place soon. + + + + +==The Second Big Serious Meeting of GIMPCon2003== + +August 8th 2003, around 8pm + +Written by Dave Neary + +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn't be any ad hominem attacks that way, and partly because I didn't take down any names. + +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski), Maurits Rijk (Maurits), Branko Collin (bbc). + +Topic discussion, in approximate chronological order: + + +===Features required for 2.0=== + +There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. + +The major features or API changes which it was agreed are necessary are: + + +# Complete path tool (nomis) +# Remove libgck (Sven and mitch) +# Finish the text tool (Sven) +# Documentation (more on this later) +# Web-site (again, more on this later) +# Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2.2 release + +===Documentation=== + +We felt that with pre-releases, the documentation will become more complete. There should, however, be an effort to actively get people writing docs. The main requirement, then, for 2.0 pre-releases will be to have a working help framework, so that when people hit F1 for help, they at least get a message saying “This help item does not exist yet.If you would like to help write it, contact docs@gimp.org” or some such. [1] + +If documentation is going to be released as a separate package, as now seems likely, then we will need to define the interface between the core and the help pages reasonably quickly. The general idea is to more or less hard-code tagnames for a particular help topic, and get the core and help using the same tags, and agreeing on how they be communicated. This will presumably require a considerable amount of communication with the help team. + +We also need to have the docs browsable online so that if people want to browse them they can. + + +===Web-site=== + +The new site should switch over to www.gimp.org soon. There will obviously be quite a bit of pain involved as content gets added and we get lots of “your website sucks” type feedback, but this will only befor the short term. We should switch to mmaybe as the main site before 2.0pre1. It was suggested to do it even earlier than that, in the region of 2 to 3 weeks time. + +It was also discussed whether it was a good idea to have a separate coordinator for the website. + + +===Roadmap=== + +As an approximate set of ideals, it was agreed that we want this: 2.0pre1 very soon, 2.0 soon, 2.2 next year, and GEGL integration the end of next Summer. + +More specifically, the near-term release schedule that we agreed was reasonable is this: + +1 or 2 developer releases (one now, more or less, and another one in another 2 weeks). 6 weeks time (end of September 2003): First pre-release of 2.0, including the features mentioned above, and any other minor features that people code in the meantime (hint, hint). Roughly 3 months later: 2.0 + +It was more or less agreed that 3 to 4 weeks was a nice turnaround time for pre-releases, so that would imply between 4 and 6 (inclusive) pre-releases before 2.0. + +The reason for not having a pre-release straight away was mentioned above: to be feature complete, some features need a little more than 2 weeks work, and people have real lives. So 6 weeks was felt to be a reasonable amount of time to have the path tool and the help browser in place. + + +===Bugs=== + +The developer release will also be a prelude to a bug week. We would like people (that's you, in particular) to actively work on bugzilla clean-up for 2.0 - bugs need to be prioritized, unconfirmed bugs need confirming and milestoning (and if you're feeling really helpful, fixing). The idea would more or less be that the 2.0 milestone will be locked down for anything other than serious bugs after this bug week, so if there are bugs that are annoying you a lot, this is your chance to get them considered and worked on for the 2.0 releases. + +Just to spell that out - at the end of the bug week, any bugs reported against The GIMP in CVS will be milestoned for 2.0.x, or even 2.2, unless they are considered blockers for the release. If we want to get a 2.0 release soon, we need to get lots of testing done, and lots of bugfixing done, but we also need to choose what to do and what not to do. We felt this was a reasonable compromise. + +It was also re-discussed whether it would make sense to have module owners. The conclusion was that for certain components, it makes sense to have a smaller group of people getting the bug reports and having responsibility for them. This would be done via mail aliases for the group of people guiding the component, in a similar way to that which is used for (say) gtktreeview in gtk+. + +The module owner group wouldn't have to be technical, and we should be actively recruiting people to do this kind of work and leave more time for programmers to program. + +This leads us on to... + + +===Task list=== + +There are lots of non-technical jobs that need doing around the gimp-docs, website, bugzilla triage, internationalisation, etc. Often it is quite difficult to know what needs doing, and who to contact about getting it done. We need a list of bite-sized tasks that people can do, including the kinds of tasks that only take a few hours a week to do, but are ongoing tasks. + +We used to have a TODO, and we could use that system again, if someone were maintaining it. That could come under the remit of the release manager to some extent, but since the mainenance of the TODO list is mostly a non-technical task, anyone could do it (in fact, as an example of a task, “Maintaining the TODO list” would go in the TODO list). + +We might do this through Bugzilla using a keyword to allow getting at the list easily, which would imply getting more people looking at bugzilla regularly. Then again, if there were a link to a bugzilla query on the webpage marked “GIMP TODO list” we could get that for free. + + +===GIMP Foundation=== + +Basically, we're agreed this is a good idea to have some kind of public face people and companies can contribute to. There is no problem with having 2 foundations, one in Europe and one in the US. It was more or less agreed that assigning copyright to the foundation isn't going to happen soon (for a start, so many plug-in authors have gone their merry way and are almost unfindable) This may hapen in the future, but most people felt that it would not be something they'd be happy doing personally. + +Other people said they would prefer to assign copyright to an organism under the jurisdiction of European law rather than under US jurisdiction. + +So, to sum up, there's no reason not to have one of these. Daniel Rogers has agreed to do the necessary paperwork and set up the foundation and the bank account for donations in the US. Pretty quickly after getting that up and going, we will need to get a board of directors and a set of by-laws. We know lots of people who can help with this (in particular, the GNOME foundation and the FSF). + +If someone wants to set up an equivalent in Europe, we're all ears. Currently no-one has said they'll do it, so it's an open point. To start, the foundation will only be a board an a bank account - in the future, we could expand its responsibilities to promotional work, a single point where people could go to get speakers, a group that does press releases and so on. It was agreed that at least in the short term it is undesirable to have the foundation have actual control of source code, just in case the foundation then gets sued. + +In brief, it's being set up with a very narrow remit, with the possibility to expand later if it is felt that there is a need. + + +===Release manager=== + +The responsibilities are: + + +* Follow CVS so that he can write release notes, and knows at any given time who is working on what, and at what stage it is +* Follow bugzilla closely +* Make releases regularly, according to the roadmap (or make sure releases get made) +* Update the roadmap to reflect reality +* Write release notes for the releases (keep NEWS up to date) +* Generally annoy people sending mails to the mailing lists and sending content to the website to explain the state of play and get people to work on stuff. + +Dave Neary (me) agreed to do this. He already regrets it. + +That's it folks - today, Sven and mitch are going to talk to us about the major changes in the codebase and the general utility stuff which exists now which has been written from scratch, Calvin and Daniel are going to talk about GEGL and how we can use it, and work towards having a GEGL that we can use in a year. I'm going to lead a discussion on communication in the GIMP, and how to maybe make it easier for people to contribute, and jimmac is going to demonstrate what a power user really is. + +Goodbye from everyone at camp. As usual, comments are welcome on all this stuff. While on a philosophical level, we are agreed on the direction things should take, all the details are open to discussion, if there's any reason to change them. + + + + + +==The Third Big Serious Meeting of GIMPCon 2003== + +August 9th 2003, some time in the afternoon + +Written by Raphaël Quinet + +Here are the minutes of Yet Another Big Meeting that took place this afternoon in the GimpTent. The meeting was chaired by Dave Neary and these minutes were written by Raphaël Quinet. + +The title of this meeting was “Communication”. The main topics were how to improve the communication between developers and users or potential new developers. We also discussed how to present The GIMP to the “outside” and how to make it easier for new users to try out The GIMP or get involved in GIMP development. + +Altough there was no pre-defined agenda for this meeting, the following topics were discussed: + + +===How to get new developers?=== + +Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. + +Another reason may be that it is difficult to build the development version because it depends on released versions of some libraries that are not included yet in the major GNU/Linux distributions (e.g., GTK+ version 2.2.2). Also, the number of dependencies for GIMP 1.3.x is much higher than the number of dependencies for GIMP 1.2.x, so it ismore difficult to have a working build environment for the 1.3.x version. This problem may be solved as time passes, because more and more distributions will include the required libraries. + +There should be a section on www.gimp.org or developer.gimp.org titled “How to contribute?” or “How to get involved?”. It should be easy for potential new developers to see where to start and how they can help. More on that below. + + +===Do we need binary distributions?=== + +There was a discussion about binary distributions. This may help people to try some versions of the GIMP (especially the development versions) without having to compile everything. However, maintaining binaries is a lot of work, even if we only maintain binaries supplied by others. In addition, this would bring some additional responsabilities that we do not want to have. For these reasons, it was decided that www.gimp.org would not host any binaries but would link to the pages of those who are providing binaries for various platforms. + +It would be very nice to have Windows binaries for the development version. + + +===Is Bugzilla too hard to use for new users?=== + +It was suggested to make it easier for users to submit bug reports, for example by having an e-mail address to which bug reports can be sent without having to register to Bugzilla (we already have such an address, although it is not widely known). This proposal was rejected because most of the bug reports (especially from new users) are incomplete and require additional information. If the user does nothave a Bugzilla account, it is not possible to rely on the automatic notification system to send messages to the user when a comment is added to their bug report or when the status of their bug report changes. + +Most developers consider Bugzilla to be a very valuable tool that works well. Instead of trying to hide Bugzilla from the users, we should try to make it as easy as possible for the new users to join. This is already done to some extent by the bug submission wizard available from [http://bugs.gimp.org/ http://bugs.gimp.org/]. There is a small problem with the GNOME2 keyword that prevents the open GIMP bugs from being displayed to the user and we should try to get this fixed. + + +===List of open tasks=== + +There are many open bug reports or proposals for enhancements that would be relatively easy to fix or implement. We should make it easier for potential contributors to see the list of easy tasks that are open. The “easy tasks” should include anything that can be done in one or two hours by an average developer or maybe a bit more if the contributor is not familiar with the code. + +The best way to keep the list of open tasks up-to-date is probably to base it on Bugzilla. We could for example use a Bugzilla keyword for all bugs that are easy to fix (there is already a keyword “easy-fix” reserved for that, although we could invent our own). It would then be easy to create a Bugzilla query showing the list of easy tasks. Another solution would be to have a page on www.gimp.org or developer.gimp.org containing a list of all these bugs, with direct links to the corresponding bug reports. The second solution may require a bit more work because it would have to be maintained by someone, but it might be a bit easier to use. + + +===Mailing lists=== + +Sometimes, there is a lack of communication between users and developers of The GIMP. After some discussion, it was decided that we should not merge the mailing lists gimp-user and gimp-developer because this could cause various problems: the combined amount of traffic may be too high for some subscribers, the discussions among developers may be confusing for some users, and in general we should let people subscribe to what they are interested in, instead of removing this option by merging the lists (we cannot force anybody to read what they do not want to read). + +But it would be very useful for the developers to get more feedback from the users, especially about UI and usability issues. For this reason, all developers are strongly encouraged to subscribe to the gimp-user list. + +The web site (www.gimp.org) should contain a list of the various sources of information about the GIMP: mailing lists, newsgroup, Yahoo group, GUG, other web sites such as linuxgraphic.org or gimp.de, etc. The description of the mailing lists should encourage people to subscribe to both the users and developers lists. + + +===Summary=== + +We hope that the next stable release will attract new developers. This has been the case when 1.0 and 1.2 were released. The transition to the new web site will also help, especially if the navigation menu contains some useful items such as “Bugs”, “FAQ”, etc. The following items should be available in the web site: + + +* “How to contribute?” or “Getting involved” +* List of tasks +* List of sources of information (mailing lists, newsgroup, ...) +* FAQ + +As with the other documents summarizing what is happening here at GimpCon, comments are welcome... + + +==Sponsors== + +We'd like to thank the [http://www.fsf.org/ Free Software Foundation], [http://www.oreilly.de/ O'Reilly Germany], [http://www.macgimp.org/ MacGIMP], [http://www.flamingtext.com/ FlamingText] and the [https://www.ccc.de/ Chaos Computer Club]. Without their support this meeting wouldn't have been possible. + + + + +# That email address doesn't exist (yet). People interested in helping with the documentation should have a look at the Wiki. diff --git a/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150910192759-edit.txt b/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150910192759-edit.txt new file mode 100644 index 0000000..120a6ef --- /dev/null +++ b/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20150910192759-edit.txt @@ -0,0 +1,250 @@ +The second GIMP developers conference took place the 7/8/9/10th August 2003 at the Chaos Communication Camp. The Camp was an international, four-day open-air event for hackers and associated life-forms on a field near Berlin, Germany. The GIMP developers joined this event and set up a GIMP tent to get together and discuss the future of GIMP development. Three big meetings were held at GIMPCon 2003. The topics of these meetings are listed below along with links to the minutes of the meetings. + +__TOC__ + + +[[File:people2003-small.png|The People at GimpCon 2003]] + + + +==The First Big Serious Meeting== + +August 7th 2003, around 8pm + +Written by Dave Neary + +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn't be any ad hominem attacks that way, and partly because I didn't take down any names. + +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski). + +Absent but at camp: Maurits Rijk (Maurits), Branko Collin (bbc). + +Topic discussion, in approximate chronological order: + +===The GIMP Foundation=== + +The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on “marketing” in the broadest sense of the word. + +Some of the issues were whether the foundation would be set up in Europe or in the US (in the US it might make it easier to get donations from US companies, but in Europe we're not as litigious, so setting up would certainly cost less, but then we probably wouldn't have NPO status in the US), whether it would have any technical aspect (that is, would the foundation act as a kind of steering committee for the general direction of the GIMP?), and how, if the issue came up, we might pay someone. + +This led onto a discussion of whether the foundation would be responsible for setting release dates, or whether we would have a separate... + +===Release Manager=== + +The general consensus (more on that later) was that a release manager is a good thing. There do seem to be a few different ideas of what the role would entail. The general idea would be that the release manager would be responsible for following CVS and know at what stage a given feature is at, follow bugzilla making sure that bugs got milestoned for some release in order of their priority, would annoy people to get commits in before feature freeze dates or postpone mercilessly features which are not finished. + +It was agreed that a release schedule would be helpful to define the perimeters of responsibility of the release manager - basically, some way to set up large milestones to aim for with things to go into those milestones. This release schedule would be subject to revision, and would be no more realistic than any other release schedule, but it would serve as a guide for development. Dan agreed to draw up a first draft of this, and we'll have something more concrete before the end of the weekend. + +The questions that came up about the release manager were things like where his authority comes from, how does he decide which bugs are important and which features can be postponed and so on. In other words, how do decisions get made. Is the release manager a benevolent dictator, or does he answer to the larger developer and user community? If so, to what extent? Is backing out CVS commits OK, for example? + +So we started talking about how to get contentious decisions made. + +===Decision making (or lack of it)=== + +Currently, there are two ways to get something done in the GIMP. First, you can write decent code and patches for a while, until you get CVS commit access, then you write whatever feature you're interested in, and commit it. If no-one backs it out, then it's in. + +Second, you can bring it up on the mailing list, or in bugzilla, or in IRC (more on communication later), and discuss it until there is a consensus. However, we tend to be pretty bad at reaching consensus on anything even slightly contentious. The important questions to be answered any time a discussion like this comes up are what's going to be done, and who's going to do it. + +It was agreed that beyond a certain point, there is generally very little technical merit to these types of discussions. It was felt that about 5 days was enough for everyone with an opinion on a given matter to make that opinion known, and that after that point, it would be an idea to have a summary of the salient points and close the discussion. That means, the people here would stop posting to the discussion. Of course, if other people want to keep on flaming, they're free to do so, but people will just ignore the thread. + +At this point, the summary should sum up the various points, and finish with an answer to those two questions - what gets done, and who's doing it. + +We may even have a bake-off system. If there are two competing ideas for the way something should be done, currently no-one tends to do it. Ideally, both people would do it and we pick the best one. + +This brings up another point, though - in general, what is authority? And in particular, at what point has someone gained enough standing and authority to post one of these thread-ending summaries? Some discussion is going to be had on that over the weekend. + +===General stuff, about Bugzilla and CVS=== + +We talked about various ways of improving the way we use these tools. First is whether it makes sense for us to have module owners, and if so, who should they be? Should we use the system of bug owners to track who is responsible for a bug at any given time, or is the current scheme of bugs@gimp.org sufficient? Do we need to change bugs@gimp.org to something else to avoid confusion with the old bug reporting address? There were a few open points in here. + +Second, we talked about pre-release branches, and whether it would be worthwhile having a mozilla style release cycle with feature-freezes, followed by concurrent bug-fixing before unstable releases, freeing up the branch for bigger stuff that people want to start committing. In general, it was felt that there was very little to be gained from that, and the current system of a long-lived devel branch with self-imposed feature freezes every few weeks was a better way to go. + +We also expressed a desire to have more redundancy in the non-technical aspects of The GIMP, things like the mailing lists and ftp mirror lists should have more than one person with the ability to change them so that if there's a problem, and that person has no time to take care of it, then someone will. Perhaps using a Debian or GNU style ticket system might help here fro these particular tasks? In any case, everyone in a given group should know everyone else in the group, and know more or less that when an issue gets in, it will be handled by at least one person. + +===Communication=== + +It was agreed that we need to communicate better (that's a no-brainer, really). For a start, every developer should be subscribed to the userlist. gimp-devel (if it doesn't disappear altogether) would only be used for technical discussions of implementation details - all the philosophical level discussions of new features, ui changes, release mechanisms and so on should be discussed on the user list. + +Basically, we're going to talk a lot more about how the developers can interface better with the users. + +===Decisions=== + +Not too many of these... we will have a release manager, but we need to define exactly what his/her remit will be. And who it will be. We agreed that the “5 days and it's dead” rule for threads makes sense, so that will be done. + +===Future=== + +# Roadmap - rough release schedule, we will have a first draft today. +# GIMP Foundation - we need to define its responsibilities, set up election rules, and get this set up. The principle of the foundation is more or less agreed. +# Communication +# Release Manager - what'll he do, who'll he be. This should be short once we have discussed communication channels a bit. +# Technie stuff - Sven and mitch are going to talk to us about the re-organisation of the code, GObjectification of everything, and other stuff. Daniel and Calvin are going to talk to us about GEGL and how they feel The GIMP could use it. This will probably be a two-way discussion about what kind of things we expect GEGL to furnish as well. +# GIMP tutorials - jimmac and nomis are going to do some presentations for people, which should be good. +# Plug-in distribution - 3 years ago this was discussion, yosh has been working on something as a proof-of-concept, it would be nice to address this and get something in place soon. + + +==The Second Big Serious Meeting of GIMPCon2003== + +August 8th 2003, around 8pm + +Written by Dave Neary + +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn't be any ad hominem attacks that way, and partly because I didn't take down any names. + +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski), Maurits Rijk (Maurits), Branko Collin (bbc). + +Topic discussion, in approximate chronological order: + +===Features required for 2.0=== + +There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. + +The major features or API changes which it was agreed are necessary are: + +# Complete path tool (nomis) +# Remove libgck (Sven and mitch) +# Finish the text tool (Sven) +# Documentation (more on this later) +# Web-site (again, more on this later) +# Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2.2 release + +===Documentation=== + +We felt that with pre-releases, the documentation will become more complete. There should, however, be an effort to actively get people writing docs. The main requirement, then, for 2.0 pre-releases will be to have a working help framework, so that when people hit F1 for help, they at least get a message saying “This help item does not exist yet.If you would like to help write it, contact docs@gimp.org” or some such.{{fn_ref|1}} + +If documentation is going to be released as a separate package, as now seems likely, then we will need to define the interface between the core and the help pages reasonably quickly. The general idea is to more or less hard-code tagnames for a particular help topic, and get the core and help using the same tags, and agreeing on how they be communicated. This will presumably require a considerable amount of communication with the help team. + +We also need to have the docs browsable online so that if people want to browse them they can. + +===Web-site=== + +The new site should switch over to www.gimp.org soon. There will obviously be quite a bit of pain involved as content gets added and we get lots of “your website sucks” type feedback, but this will only befor the short term. We should switch to mmaybe as the main site before 2.0pre1. It was suggested to do it even earlier than that, in the region of 2 to 3 weeks time. + +It was also discussed whether it was a good idea to have a separate coordinator for the website. + +===Roadmap=== + +As an approximate set of ideals, it was agreed that we want this: 2.0pre1 very soon, 2.0 soon, 2.2 next year, and GEGL integration the end of next Summer. + +More specifically, the near-term release schedule that we agreed was reasonable is this: + +1 or 2 developer releases (one now, more or less, and another one in another 2 weeks). 6 weeks time (end of September 2003): First pre-release of 2.0, including the features mentioned above, and any other minor features that people code in the meantime (hint, hint). Roughly 3 months later: 2.0 + +It was more or less agreed that 3 to 4 weeks was a nice turnaround time for pre-releases, so that would imply between 4 and 6 (inclusive) pre-releases before 2.0. + +The reason for not having a pre-release straight away was mentioned above: to be feature complete, some features need a little more than 2 weeks work, and people have real lives. So 6 weeks was felt to be a reasonable amount of time to have the path tool and the help browser in place. + +===Bugs=== + +The developer release will also be a prelude to a bug week. We would like people (that's you, in particular) to actively work on bugzilla clean-up for 2.0 - bugs need to be prioritized, unconfirmed bugs need confirming and milestoning (and if you're feeling really helpful, fixing). The idea would more or less be that the 2.0 milestone will be locked down for anything other than serious bugs after this bug week, so if there are bugs that are annoying you a lot, this is your chance to get them considered and worked on for the 2.0 releases. + +Just to spell that out - at the end of the bug week, any bugs reported against The GIMP in CVS will be milestoned for 2.0.x, or even 2.2, unless they are considered blockers for the release. If we want to get a 2.0 release soon, we need to get lots of testing done, and lots of bugfixing done, but we also need to choose what to do and what not to do. We felt this was a reasonable compromise. + +It was also re-discussed whether it would make sense to have module owners. The conclusion was that for certain components, it makes sense to have a smaller group of people getting the bug reports and having responsibility for them. This would be done via mail aliases for the group of people guiding the component, in a similar way to that which is used for (say) gtktreeview in gtk+. + +The module owner group wouldn't have to be technical, and we should be actively recruiting people to do this kind of work and leave more time for programmers to program. + +This leads us on to... + +===Task list=== + +There are lots of non-technical jobs that need doing around the gimp-docs, website, bugzilla triage, internationalisation, etc. Often it is quite difficult to know what needs doing, and who to contact about getting it done. We need a list of bite-sized tasks that people can do, including the kinds of tasks that only take a few hours a week to do, but are ongoing tasks. + +We used to have a TODO, and we could use that system again, if someone were maintaining it. That could come under the remit of the release manager to some extent, but since the mainenance of the TODO list is mostly a non-technical task, anyone could do it (in fact, as an example of a task, “Maintaining the TODO list” would go in the TODO list). + +We might do this through Bugzilla using a keyword to allow getting at the list easily, which would imply getting more people looking at bugzilla regularly. Then again, if there were a link to a bugzilla query on the webpage marked “GIMP TODO list” we could get that for free. + +===GIMP Foundation=== + +Basically, we're agreed this is a good idea to have some kind of public face people and companies can contribute to. There is no problem with having 2 foundations, one in Europe and one in the US. It was more or less agreed that assigning copyright to the foundation isn't going to happen soon (for a start, so many plug-in authors have gone their merry way and are almost unfindable) This may hapen in the future, but most people felt that it would not be something they'd be happy doing personally. + +Other people said they would prefer to assign copyright to an organism under the jurisdiction of European law rather than under US jurisdiction. + +So, to sum up, there's no reason not to have one of these. Daniel Rogers has agreed to do the necessary paperwork and set up the foundation and the bank account for donations in the US. Pretty quickly after getting that up and going, we will need to get a board of directors and a set of by-laws. We know lots of people who can help with this (in particular, the GNOME foundation and the FSF). + +If someone wants to set up an equivalent in Europe, we're all ears. Currently no-one has said they'll do it, so it's an open point. To start, the foundation will only be a board an a bank account - in the future, we could expand its responsibilities to promotional work, a single point where people could go to get speakers, a group that does press releases and so on. It was agreed that at least in the short term it is undesirable to have the foundation have actual control of source code, just in case the foundation then gets sued. + +In brief, it's being set up with a very narrow remit, with the possibility to expand later if it is felt that there is a need. + +===Release manager=== + +The responsibilities are: + +* Follow CVS so that he can write release notes, and knows at any given time who is working on what, and at what stage it is +* Follow bugzilla closely +* Make releases regularly, according to the roadmap (or make sure releases get made) +* Update the roadmap to reflect reality +* Write release notes for the releases (keep NEWS up to date) +* Generally annoy people sending mails to the mailing lists and sending content to the website to explain the state of play and get people to work on stuff. + +Dave Neary (me) agreed to do this. He already regrets it. + +That's it folks - today, Sven and mitch are going to talk to us about the major changes in the codebase and the general utility stuff which exists now which has been written from scratch, Calvin and Daniel are going to talk about GEGL and how we can use it, and work towards having a GEGL that we can use in a year. I'm going to lead a discussion on communication in the GIMP, and how to maybe make it easier for people to contribute, and jimmac is going to demonstrate what a power user really is. + +Goodbye from everyone at camp. As usual, comments are welcome on all this stuff. While on a philosophical level, we are agreed on the direction things should take, all the details are open to discussion, if there's any reason to change them. + + +==The Third Big Serious Meeting of GIMPCon 2003== + +August 9th 2003, some time in the afternoon + +Written by Raphaël Quinet + +Here are the minutes of Yet Another Big Meeting that took place this afternoon in the GimpTent. The meeting was chaired by Dave Neary and these minutes were written by Raphaël Quinet. + +The title of this meeting was “Communication”. The main topics were how to improve the communication between developers and users or potential new developers. We also discussed how to present The GIMP to the “outside” and how to make it easier for new users to try out The GIMP or get involved in GIMP development. + +Altough there was no pre-defined agenda for this meeting, the following topics were discussed: + +===How to get new developers?=== + +Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. + +Another reason may be that it is difficult to build the development version because it depends on released versions of some libraries that are not included yet in the major GNU/Linux distributions (e.g., GTK+ version 2.2.2). Also, the number of dependencies for GIMP 1.3.x is much higher than the number of dependencies for GIMP 1.2.x, so it ismore difficult to have a working build environment for the 1.3.x version. This problem may be solved as time passes, because more and more distributions will include the required libraries. + +There should be a section on www.gimp.org or developer.gimp.org titled “How to contribute?” or “How to get involved?”. It should be easy for potential new developers to see where to start and how they can help. More on that below. + +===Do we need binary distributions?=== + +There was a discussion about binary distributions. This may help people to try some versions of the GIMP (especially the development versions) without having to compile everything. However, maintaining binaries is a lot of work, even if we only maintain binaries supplied by others. In addition, this would bring some additional responsabilities that we do not want to have. For these reasons, it was decided that www.gimp.org would not host any binaries but would link to the pages of those who are providing binaries for various platforms. + +It would be very nice to have Windows binaries for the development version. + +===Is Bugzilla too hard to use for new users?=== + +It was suggested to make it easier for users to submit bug reports, for example by having an e-mail address to which bug reports can be sent without having to register to Bugzilla (we already have such an address, although it is not widely known). This proposal was rejected because most of the bug reports (especially from new users) are incomplete and require additional information. If the user does nothave a Bugzilla account, it is not possible to rely on the automatic notification system to send messages to the user when a comment is added to their bug report or when the status of their bug report changes. + +Most developers consider Bugzilla to be a very valuable tool that works well. Instead of trying to hide Bugzilla from the users, we should try to make it as easy as possible for the new users to join. This is already done to some extent by the bug submission wizard available from http://bugs.gimp.org/. There is a small problem with the GNOME2 keyword that prevents the open GIMP bugs from being displayed to the user and we should try to get this fixed. + +===List of open tasks=== + +There are many open bug reports or proposals for enhancements that would be relatively easy to fix or implement. We should make it easier for potential contributors to see the list of easy tasks that are open. The “easy tasks” should include anything that can be done in one or two hours by an average developer or maybe a bit more if the contributor is not familiar with the code. + +The best way to keep the list of open tasks up-to-date is probably to base it on Bugzilla. We could for example use a Bugzilla keyword for all bugs that are easy to fix (there is already a keyword “easy-fix” reserved for that, although we could invent our own). It would then be easy to create a Bugzilla query showing the list of easy tasks. Another solution would be to have a page on www.gimp.org or developer.gimp.org containing a list of all these bugs, with direct links to the corresponding bug reports. The second solution may require a bit more work because it would have to be maintained by someone, but it might be a bit easier to use. + +===Mailing lists=== + +Sometimes, there is a lack of communication between users and developers of The GIMP. After some discussion, it was decided that we should not merge the mailing lists gimp-user and gimp-developer because this could cause various problems: the combined amount of traffic may be too high for some subscribers, the discussions among developers may be confusing for some users, and in general we should let people subscribe to what they are interested in, instead of removing this option by merging the lists (we cannot force anybody to read what they do not want to read). + +But it would be very useful for the developers to get more feedback from the users, especially about UI and usability issues. For this reason, all developers are strongly encouraged to subscribe to the gimp-user list. + +The web site (www.gimp.org) should contain a list of the various sources of information about the GIMP: mailing lists, newsgroup, Yahoo group, GUG, other web sites such as linuxgraphic.org or gimp.de, etc. The description of the mailing lists should encourage people to subscribe to both the users and developers lists. + +===Summary=== + +We hope that the next stable release will attract new developers. This has been the case when 1.0 and 1.2 were released. The transition to the new web site will also help, especially if the navigation menu contains some useful items such as “Bugs”, “FAQ”, etc. The following items should be available in the web site: + +* “How to contribute?” or “Getting involved” +* List of tasks +* List of sources of information (mailing lists, newsgroup, ...) +* FAQ + +As with the other documents summarizing what is happening here at GimpCon, comments are welcome... + +==Sponsors== + +We'd like to thank the [http://www.fsf.org Free Software Foundation], [http://www.oreilly.de/ O'Reilly Germany], [http://www.macgimp.org/ MacGIMP], [http://www.flamingtext.com/ FlamingText] and the [https://www.ccc.de/ Chaos Computer Club]. Without their support this meeting wouldn't have been possible. + + +
      +{{fn|1|That email address doesn't exist (yet). People interested in helping with the documentation should have a look at the Wiki.}} +
    diff --git a/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20161024011955-show.txt b/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20161024011955-show.txt new file mode 100644 index 0000000..d91796f --- /dev/null +++ b/wiki/Hacking:GIMPCon_2003,_Berlin,_Germany,_2003-20161024011955-show.txt @@ -0,0 +1,284 @@ + + +The second GIMP developers conference took place the 7/8/9/10th August 2003 at the Chaos Communication Camp. The Camp was an international, four-day open-air event for hackers and associated life-forms on a field near Berlin, Germany. The GIMP developers joined this event and set up a GIMP tent to get together and discuss the future of GIMP development. Three big meetings were held at GIMPCon 2003. The topics of these meetings are listed below along with links to the minutes of the meetings. + + +__TOC__ + + + +[[File:People2003-small.png|The People at GimpCon 2003]] + + + + +==The First Big Serious Meeting== + +August 7th 2003, around 8pm + +Written by Dave Neary + +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn't be any ad hominem attacks that way, and partly because I didn't take down any names. + +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski). + +Absent but at camp: Maurits Rijk (Maurits), Branko Collin (bbc). + +Topic discussion, in approximate chronological order: + + +===The GIMP Foundation=== + +The idea of a foundation was proposed. Lots of ideas were thrown about as to what kind of remit it would have. If created, the foundation would certainly have 2 things we don't have at the moment - a bank account people could donate to, and a focus on “marketing” in the broadest sense of the word. + +Some of the issues were whether the foundation would be set up in Europe or in the US (in the US it might make it easier to get donations from US companies, but in Europe we're not as litigious, so setting up would certainly cost less, but then we probably wouldn't have NPO status in the US), whether it would have any technical aspect (that is, would the foundation act as a kind of steering committee for the general direction of the GIMP?), and how, if the issue came up, we might pay someone. + +This led onto a discussion of whether the foundation would be responsible for setting release dates, or whether we would have a separate... + + +===Release Manager=== + +The general consensus (more on that later) was that a release manager is a good thing. There do seem to be a few different ideas of what the role would entail. The general idea would be that the release manager would be responsible for following CVS and know at what stage a given feature is at, follow bugzilla making sure that bugs got milestoned for some release in order of their priority, would annoy people to get commits in before feature freeze dates or postpone mercilessly features which are not finished. + +It was agreed that a release schedule would be helpful to define the perimeters of responsibility of the release manager - basically, some way to set up large milestones to aim for with things to go into those milestones. This release schedule would be subject to revision, and would be no more realistic than any other release schedule, but it would serve as a guide for development. Dan agreed to draw up a first draft of this, and we'll have something more concrete before the end of the weekend. + +The questions that came up about the release manager were things like where his authority comes from, how does he decide which bugs are important and which features can be postponed and so on. In other words, how do decisions get made. Is the release manager a benevolent dictator, or does he answer to the larger developer and user community? If so, to what extent? Is backing out CVS commits OK, for example? + +So we started talking about how to get contentious decisions made. + + +===Decision making (or lack of it)=== + +Currently, there are two ways to get something done in the GIMP. First, you can write decent code and patches for a while, until you get CVS commit access, then you write whatever feature you're interested in, and commit it. If no-one backs it out, then it's in. + +Second, you can bring it up on the mailing list, or in bugzilla, or in IRC (more on communication later), and discuss it until there is a consensus. However, we tend to be pretty bad at reaching consensus on anything even slightly contentious. The important questions to be answered any time a discussion like this comes up are what's going to be done, and who's going to do it. + +It was agreed that beyond a certain point, there is generally very little technical merit to these types of discussions. It was felt that about 5 days was enough for everyone with an opinion on a given matter to make that opinion known, and that after that point, it would be an idea to have a summary of the salient points and close the discussion. That means, the people here would stop posting to the discussion. Of course, if other people want to keep on flaming, they're free to do so, but people will just ignore the thread. + +At this point, the summary should sum up the various points, and finish with an answer to those two questions - what gets done, and who's doing it. + +We may even have a bake-off system. If there are two competing ideas for the way something should be done, currently no-one tends to do it. Ideally, both people would do it and we pick the best one. + +This brings up another point, though - in general, what is authority? And in particular, at what point has someone gained enough standing and authority to post one of these thread-ending summaries? Some discussion is going to be had on that over the weekend. + + +===General stuff, about Bugzilla and CVS=== + +We talked about various ways of improving the way we use these tools. First is whether it makes sense for us to have module owners, and if so, who should they be? Should we use the system of bug owners to track who is responsible for a bug at any given time, or is the current scheme of bugs@gimp.org sufficient? Do we need to change bugs@gimp.org to something else to avoid confusion with the old bug reporting address? There were a few open points in here. + +Second, we talked about pre-release branches, and whether it would be worthwhile having a mozilla style release cycle with feature-freezes, followed by concurrent bug-fixing before unstable releases, freeing up the branch for bigger stuff that people want to start committing. In general, it was felt that there was very little to be gained from that, and the current system of a long-lived devel branch with self-imposed feature freezes every few weeks was a better way to go. + +We also expressed a desire to have more redundancy in the non-technical aspects of The GIMP, things like the mailing lists and ftp mirror lists should have more than one person with the ability to change them so that if there's a problem, and that person has no time to take care of it, then someone will. Perhaps using a Debian or GNU style ticket system might help here fro these particular tasks? In any case, everyone in a given group should know everyone else in the group, and know more or less that when an issue gets in, it will be handled by at least one person. + + +===Communication=== + +It was agreed that we need to communicate better (that's a no-brainer, really). For a start, every developer should be subscribed to the userlist. gimp-devel (if it doesn't disappear altogether) would only be used for technical discussions of implementation details - all the philosophical level discussions of new features, ui changes, release mechanisms and so on should be discussed on the user list. + +Basically, we're going to talk a lot more about how the developers can interface better with the users. + + +===Decisions=== + +Not too many of these... we will have a release manager, but we need to define exactly what his/her remit will be. And who it will be. We agreed that the “5 days and it's dead” rule for threads makes sense, so that will be done. + + +===Future=== + +# Roadmap - rough release schedule, we will have a first draft today. +# GIMP Foundation - we need to define its responsibilities, set up election rules, and get this set up. The principle of the foundation is more or less agreed. +# Communication +# Release Manager - what'll he do, who'll he be. This should be short once we have discussed communication channels a bit. +# Technie stuff - Sven and mitch are going to talk to us about the re-organisation of the code, GObjectification of everything, and other stuff. Daniel and Calvin are going to talk to us about GEGL and how they feel The GIMP could use it. This will probably be a two-way discussion about what kind of things we expect GEGL to furnish as well. +# GIMP tutorials - jimmac and nomis are going to do some presentations for people, which should be good. +# Plug-in distribution - 3 years ago this was discussion, yosh has been working on something as a proof-of-concept, it would be nice to address this and get something in place soon. + + + + +==The Second Big Serious Meeting of GIMPCon2003== + +August 8th 2003, around 8pm + +Written by Dave Neary + +Discussion was led by Daniel Rogers (dsrogers) but stuff said is for the most part anonymous. Partly because there shouldn't be any ad hominem attacks that way, and partly because I didn't take down any names. + +Present: Daniel Rogers (dsrogers), Raphaël Quinet, Dave Neary (bolsh), Sven Neumann (Sven), Michael Natterer (mitch), Henrik Brix Andersen (brix), Jakub Steiner (jimmac), Simon Budig (nomis), Marc Lehmann, Ville Pätsi (drc), Øyvind Kolås (pippin), Calvin Williamson (calvin), Roman Joost (romanofski), Maurits Rijk (Maurits), Branko Collin (bbc). + +Topic discussion, in approximate chronological order: + + +===Features required for 2.0=== + +There was quite a lot of talk on what was required for a 2.0 release. It was agreed that a pre-release should have feature complete versions of everything going into 2.0, for obvious reasons. These can be somewhat buggy, but they should at least support what is supported in the 1.2 equivalents. + +The major features or API changes which it was agreed are necessary are: + + +# Complete path tool (nomis) +# Remove libgck (Sven and mitch) +# Finish the text tool (Sven) +# Documentation (more on this later) +# Web-site (again, more on this later) +# Some libgimp changes which need to be made now so that we can havebinary compatibility across a 2.2 release + +===Documentation=== + +We felt that with pre-releases, the documentation will become more complete. There should, however, be an effort to actively get people writing docs. The main requirement, then, for 2.0 pre-releases will be to have a working help framework, so that when people hit F1 for help, they at least get a message saying “This help item does not exist yet.If you would like to help write it, contact docs@gimp.org” or some such. [1] + +If documentation is going to be released as a separate package, as now seems likely, then we will need to define the interface between the core and the help pages reasonably quickly. The general idea is to more or less hard-code tagnames for a particular help topic, and get the core and help using the same tags, and agreeing on how they be communicated. This will presumably require a considerable amount of communication with the help team. + +We also need to have the docs browsable online so that if people want to browse them they can. + + +===Web-site=== + +The new site should switch over to www.gimp.org soon. There will obviously be quite a bit of pain involved as content gets added and we get lots of “your website sucks” type feedback, but this will only befor the short term. We should switch to mmaybe as the main site before 2.0pre1. It was suggested to do it even earlier than that, in the region of 2 to 3 weeks time. + +It was also discussed whether it was a good idea to have a separate coordinator for the website. + + +===Roadmap=== + +As an approximate set of ideals, it was agreed that we want this: 2.0pre1 very soon, 2.0 soon, 2.2 next year, and GEGL integration the end of next Summer. + +More specifically, the near-term release schedule that we agreed was reasonable is this: + +1 or 2 developer releases (one now, more or less, and another one in another 2 weeks). 6 weeks time (end of September 2003): First pre-release of 2.0, including the features mentioned above, and any other minor features that people code in the meantime (hint, hint). Roughly 3 months later: 2.0 + +It was more or less agreed that 3 to 4 weeks was a nice turnaround time for pre-releases, so that would imply between 4 and 6 (inclusive) pre-releases before 2.0. + +The reason for not having a pre-release straight away was mentioned above: to be feature complete, some features need a little more than 2 weeks work, and people have real lives. So 6 weeks was felt to be a reasonable amount of time to have the path tool and the help browser in place. + + +===Bugs=== + +The developer release will also be a prelude to a bug week. We would like people (that's you, in particular) to actively work on bugzilla clean-up for 2.0 - bugs need to be prioritized, unconfirmed bugs need confirming and milestoning (and if you're feeling really helpful, fixing). The idea would more or less be that the 2.0 milestone will be locked down for anything other than serious bugs after this bug week, so if there are bugs that are annoying you a lot, this is your chance to get them considered and worked on for the 2.0 releases. + +Just to spell that out - at the end of the bug week, any bugs reported against The GIMP in CVS will be milestoned for 2.0.x, or even 2.2, unless they are considered blockers for the release. If we want to get a 2.0 release soon, we need to get lots of testing done, and lots of bugfixing done, but we also need to choose what to do and what not to do. We felt this was a reasonable compromise. + +It was also re-discussed whether it would make sense to have module owners. The conclusion was that for certain components, it makes sense to have a smaller group of people getting the bug reports and having responsibility for them. This would be done via mail aliases for the group of people guiding the component, in a similar way to that which is used for (say) gtktreeview in gtk+. + +The module owner group wouldn't have to be technical, and we should be actively recruiting people to do this kind of work and leave more time for programmers to program. + +This leads us on to... + + +===Task list=== + +There are lots of non-technical jobs that need doing around the gimp-docs, website, bugzilla triage, internationalisation, etc. Often it is quite difficult to know what needs doing, and who to contact about getting it done. We need a list of bite-sized tasks that people can do, including the kinds of tasks that only take a few hours a week to do, but are ongoing tasks. + +We used to have a TODO, and we could use that system again, if someone were maintaining it. That could come under the remit of the release manager to some extent, but since the mainenance of the TODO list is mostly a non-technical task, anyone could do it (in fact, as an example of a task, “Maintaining the TODO list” would go in the TODO list). + +We might do this through Bugzilla using a keyword to allow getting at the list easily, which would imply getting more people looking at bugzilla regularly. Then again, if there were a link to a bugzilla query on the webpage marked “GIMP TODO list” we could get that for free. + + +===GIMP Foundation=== + +Basically, we're agreed this is a good idea to have some kind of public face people and companies can contribute to. There is no problem with having 2 foundations, one in Europe and one in the US. It was more or less agreed that assigning copyright to the foundation isn't going to happen soon (for a start, so many plug-in authors have gone their merry way and are almost unfindable) This may hapen in the future, but most people felt that it would not be something they'd be happy doing personally. + +Other people said they would prefer to assign copyright to an organism under the jurisdiction of European law rather than under US jurisdiction. + +So, to sum up, there's no reason not to have one of these. Daniel Rogers has agreed to do the necessary paperwork and set up the foundation and the bank account for donations in the US. Pretty quickly after getting that up and going, we will need to get a board of directors and a set of by-laws. We know lots of people who can help with this (in particular, the GNOME foundation and the FSF). + +If someone wants to set up an equivalent in Europe, we're all ears. Currently no-one has said they'll do it, so it's an open point. To start, the foundation will only be a board an a bank account - in the future, we could expand its responsibilities to promotional work, a single point where people could go to get speakers, a group that does press releases and so on. It was agreed that at least in the short term it is undesirable to have the foundation have actual control of source code, just in case the foundation then gets sued. + +In brief, it's being set up with a very narrow remit, with the possibility to expand later if it is felt that there is a need. + + +===Release manager=== + +The responsibilities are: + + +* Follow CVS so that he can write release notes, and knows at any given time who is working on what, and at what stage it is +* Follow bugzilla closely +* Make releases regularly, according to the roadmap (or make sure releases get made) +* Update the roadmap to reflect reality +* Write release notes for the releases (keep NEWS up to date) +* Generally annoy people sending mails to the mailing lists and sending content to the website to explain the state of play and get people to work on stuff. + +Dave Neary (me) agreed to do this. He already regrets it. + +That's it folks - today, Sven and mitch are going to talk to us about the major changes in the codebase and the general utility stuff which exists now which has been written from scratch, Calvin and Daniel are going to talk about GEGL and how we can use it, and work towards having a GEGL that we can use in a year. I'm going to lead a discussion on communication in the GIMP, and how to maybe make it easier for people to contribute, and jimmac is going to demonstrate what a power user really is. + +Goodbye from everyone at camp. As usual, comments are welcome on all this stuff. While on a philosophical level, we are agreed on the direction things should take, all the details are open to discussion, if there's any reason to change them. + + + + + +==The Third Big Serious Meeting of GIMPCon 2003== + +August 9th 2003, some time in the afternoon + +Written by Raphaël Quinet + +Here are the minutes of Yet Another Big Meeting that took place this afternoon in the GimpTent. The meeting was chaired by Dave Neary and these minutes were written by Raphaël Quinet. + +The title of this meeting was “Communication”. The main topics were how to improve the communication between developers and users or potential new developers. We also discussed how to present The GIMP to the “outside” and how to make it easier for new users to try out The GIMP or get involved in GIMP development. + +Altough there was no pre-defined agenda for this meeting, the following topics were discussed: + + +===How to get new developers?=== + +Like in any Free Software project, developers are leaving from time to time to pursue other projects. And from time to time, new developersare joining the team and starting to contribute. However, it looks like the number of new developers joining the GIMP development has been decreasing in the recent years. This may be due in part to the fact that there haven't been any major changes in a stable release for a long time. + +Another reason may be that it is difficult to build the development version because it depends on released versions of some libraries that are not included yet in the major GNU/Linux distributions (e.g., GTK+ version 2.2.2). Also, the number of dependencies for GIMP 1.3.x is much higher than the number of dependencies for GIMP 1.2.x, so it ismore difficult to have a working build environment for the 1.3.x version. This problem may be solved as time passes, because more and more distributions will include the required libraries. + +There should be a section on www.gimp.org or developer.gimp.org titled “How to contribute?” or “How to get involved?”. It should be easy for potential new developers to see where to start and how they can help. More on that below. + + +===Do we need binary distributions?=== + +There was a discussion about binary distributions. This may help people to try some versions of the GIMP (especially the development versions) without having to compile everything. However, maintaining binaries is a lot of work, even if we only maintain binaries supplied by others. In addition, this would bring some additional responsabilities that we do not want to have. For these reasons, it was decided that www.gimp.org would not host any binaries but would link to the pages of those who are providing binaries for various platforms. + +It would be very nice to have Windows binaries for the development version. + + +===Is Bugzilla too hard to use for new users?=== + +It was suggested to make it easier for users to submit bug reports, for example by having an e-mail address to which bug reports can be sent without having to register to Bugzilla (we already have such an address, although it is not widely known). This proposal was rejected because most of the bug reports (especially from new users) are incomplete and require additional information. If the user does nothave a Bugzilla account, it is not possible to rely on the automatic notification system to send messages to the user when a comment is added to their bug report or when the status of their bug report changes. + +Most developers consider Bugzilla to be a very valuable tool that works well. Instead of trying to hide Bugzilla from the users, we should try to make it as easy as possible for the new users to join. This is already done to some extent by the bug submission wizard available from [http://bugs.gimp.org/ http://bugs.gimp.org/]. There is a small problem with the GNOME2 keyword that prevents the open GIMP bugs from being displayed to the user and we should try to get this fixed. + + +===List of open tasks=== + +There are many open bug reports or proposals for enhancements that would be relatively easy to fix or implement. We should make it easier for potential contributors to see the list of easy tasks that are open. The “easy tasks” should include anything that can be done in one or two hours by an average developer or maybe a bit more if the contributor is not familiar with the code. + +The best way to keep the list of open tasks up-to-date is probably to base it on Bugzilla. We could for example use a Bugzilla keyword for all bugs that are easy to fix (there is already a keyword “easy-fix” reserved for that, although we could invent our own). It would then be easy to create a Bugzilla query showing the list of easy tasks. Another solution would be to have a page on www.gimp.org or developer.gimp.org containing a list of all these bugs, with direct links to the corresponding bug reports. The second solution may require a bit more work because it would have to be maintained by someone, but it might be a bit easier to use. + + +===Mailing lists=== + +Sometimes, there is a lack of communication between users and developers of The GIMP. After some discussion, it was decided that we should not merge the mailing lists gimp-user and gimp-developer because this could cause various problems: the combined amount of traffic may be too high for some subscribers, the discussions among developers may be confusing for some users, and in general we should let people subscribe to what they are interested in, instead of removing this option by merging the lists (we cannot force anybody to read what they do not want to read). + +But it would be very useful for the developers to get more feedback from the users, especially about UI and usability issues. For this reason, all developers are strongly encouraged to subscribe to the gimp-user list. + +The web site (www.gimp.org) should contain a list of the various sources of information about the GIMP: mailing lists, newsgroup, Yahoo group, GUG, other web sites such as linuxgraphic.org or gimp.de, etc. The description of the mailing lists should encourage people to subscribe to both the users and developers lists. + + +===Summary=== + +We hope that the next stable release will attract new developers. This has been the case when 1.0 and 1.2 were released. The transition to the new web site will also help, especially if the navigation menu contains some useful items such as “Bugs”, “FAQ”, etc. The following items should be available in the web site: + + +* “How to contribute?” or “Getting involved” +* List of tasks +* List of sources of information (mailing lists, newsgroup, ...) +* FAQ + +As with the other documents summarizing what is happening here at GimpCon, comments are welcome... + + +==Sponsors== + +We'd like to thank the [http://www.fsf.org/ Free Software Foundation], [http://www.oreilly.de/ O'Reilly Germany], [http://www.macgimp.org/ MacGIMP], [http://www.flamingtext.com/ FlamingText] and the [https://www.ccc.de/ Chaos Computer Club]. Without their support this meeting wouldn't have been possible. + + + + +# That email address doesn't exist (yet). People interested in helping with the documentation should have a look at the Wiki. diff --git a/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150906182230-show.txt b/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150906182230-show.txt new file mode 100644 index 0000000..b1b9751 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150906182230-show.txt @@ -0,0 +1,135 @@ + + +The GIMP Developers Conference 2004 was held as a sub-event of [http://2004.guadec.org/ GUADEC 5] in Kristiansand, Norway, on the 28th, 29th and 30th of June. + + +__TOC__ + + + + + +==GIMP related talks at GUADEC== + +===Programming a GIMP Plug-in — Dave Neary=== + +[[File:Dave_Neary.jpg|Dave Neary]] +Dave Neary + + +Dave Neary's been hanging around free software for about 6 years. He started off as a leech, and then decided to turn into a leechee sometime around 1999, when he started working on the GIMP. His main interest in the GIMP is revitalising the relationship betweek the user and developer communities. He has also helped out a little now and again on other things, and is listed as a co-author of gnect. + +He is currently living and working in Lyon, France. + + +===Custom widgets in GtkCairo — Øyvind Kolås=== + +[[File:Oyvind_Kolas.png|Øyvind Kolås]] +Øyvind Kolås + + +Øyvind is working on an application called Bauxite, which uses a node-based data structure similar to GEGL This application is both a standalone video editor and a comprehensive test bed of GEGL's node structrues. + +Øyvind is also working on the next generation XCF format. + +His primary interest in the GIMP is graph compositing. + + + + + +==Other graphics talks at GUADEC== + +* Typography and graphic design for programmers —Liam Quin +* The future of rendering in GNOME — Owen Taylor +* GStreamer Internals — Benjamin Otte +* Digital Photography in a GNOME Environment — Hubert Figuiére + + + + +==Sponsors== + +Many thanks to our generous sponsors, without whom GIMPCon would not be possible: + + + +[[File:Gnu-head-sm.jpg|The Free Software Foundation]] +[http://www.fsf.org/ The Free Software Foundation] + + +The Free Software Foundation has consistently been the greatest supporter of the GIMP project, and has been the primary sponsor of each of the three GIMP Conferences which we have held. Many thanks go out to RMS and everyone else at GNU. + + + +[[File:Mac_gimp_logo4.png|MacGIMP]] +[http://www.macgimp.com/ MacGIMP] + + +Mat Caughron sells the GIMP commercially with support and documentation, and has been generous on each occasion we have asked for his support. + + + +The GIMP is also fortunate to have a community of supporters who have donated smaller amounts to the project. Many thanks go out to all those supporters. More information on how to donate to the GIMP is available on the GIMP home page. + + + + + +==GIMP conference activities== + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. It is a vital opportunity for the GIMP developers to meet each other and discuss the direction which the software will take over the coming years. + +There have been two GIMP Conferences previously, both in Berlin, and both graciously hosted by the CCC (the Chaos Computer Club), a much less chaotic bunch of guys than their name suggests. + + + + + +==The GIMP Developers Conference 2003== + +[[File:People2003-small.png|The People at GimpCon 2003]] + +Last year's GIMP Conference was a sub-event of the Chaos Communications Camp, a camping trip with broadband and laptops. During the camp, we discussed ways we could make the GIMP better both technically and as a community, which led up to the 2.0 release at the end of March. + +At this year's conference we will discuss, among other things, + + +* What we expect from a replacement for the PDB (Procedural Database) +* How we will integrate GEGL into the GIMP +* Managing plug-in distribution +* The GIMP's organisation + + + + +==The GIMP, Live!== + +Two of our resident graphics designers, Jakub Steiner (jimmac) and Tuomas Kuosmanen (tigert) are giving a user-day GIMP demonstration on Wednesday. Last year, jimmac presented a series of tutorials on basic GIMP techniques to a crowd of over 100 people, and held them captivated for nearly 3 hours. + +This is an opportunity to see what the GIMP can do in the hands of professionals, and to pick up some tips for your own use. A spectacle not to be missed. + + + + + +==About the GIMP== + +Started in 1995 by Spencer Kimball and Peter Mattis, the GIMP has evolved into a mature and powerful application. The current release is version 2.0, which has major improvements over its predecessors in the user interface, making the GIMP more accessible for casual users as well as graphics professionals. + +[[File:Macosx_screenshot1_thumb.jpg|GIMP on the Mac OS X operating system]] + +GIMP on the Mac OS X operating system + +GIMP is expandable and extensible. It is designed to be augmented with plug-ins and extensions which allow access to its capabilties via a number of languages. The advanced scripting interface allows everything from the simplest task to the most complex image manipulation procedures to be easily scripted. + +The software comes with lots of features, some are newly implemented and available with the 2.0 Release. A short list over the most interesting features are: + + +* a full suite of tools for painting and image manipulation +* preview of brush outline while you're drawing +* customizable interface using a drag-and-drop dockable +* advanced scripting capabilities (Scheme, Python, Perl) +* over 100 plug-ins available as standard +* fullscreen mode and view filters +* much, much more! diff --git a/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150911043951-edit.txt b/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150911043951-edit.txt new file mode 100644 index 0000000..5cb5578 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20150911043951-edit.txt @@ -0,0 +1,113 @@ + + +The GIMP Developers Conference 2004 was held as a sub-event of [http://2004.guadec.org/ GUADEC 5] in Kristiansand, Norway, on the 28th, 29th and 30th of June. + +__TOC__ + + +==GIMP related talks at GUADEC== + +===Programming a GIMP Plug-in — Dave Neary=== + +[[File:Dave_Neary.jpg|Dave Neary]] + +[mailto:bolsh@NOSPAM.gimp.org Dave Neary] + + +Dave Neary's been hanging around free software for about 6 years. He started off as a leech, and then decided to turn into a leechee sometime around 1999, when he started working on the GIMP. His main interest in the GIMP is revitalising the relationship betweek the user and developer communities. He has also helped out a little now and again on other things, and is listed as a co-author of gnect. + +He is currently living and working in Lyon, France. + +===Custom widgets in GtkCairo — Øyvind Kolås=== + +[[File:Oyvind_Kolas.png|Øyvind Kolås]] + +[mailto:pippin@NOSPAM.gimp.org Øyvind Kolås] + + +Øyvind is working on an application called Bauxite, which uses a node-based data structure similar to GEGL This application is both a standalone video editor and a comprehensive test bed of GEGL's node structrues. + +Øyvind is also working on the next generation XCF format. + +His primary interest in the GIMP is graph compositing. + + +==Other graphics talks at GUADEC== + +* Typography and graphic design for programmers —Liam Quin +* The future of rendering in GNOME — Owen Taylor +* GStreamer Internals — Benjamin Otte +* Digital Photography in a GNOME Environment — Hubert Figuiére + + +==Sponsors== + +Many thanks to our generous sponsors, without whom GIMPCon would not be possible: + + +[[File:gnu-head-sm.jpg|The Free Software Foundation]] + +[http://www.fsf.org/ The Free Software Foundation] + + +The Free Software Foundation has consistently been the greatest supporter of the GIMP project, and has been the primary sponsor of each of the three GIMP Conferences which we have held. Many thanks go out to RMS and everyone else at GNU. + + +[[File:mac_gimp_logo4.png|MacGIMP]] + +[http://www.macgimp.com/ MacGIMP] + + +Mat Caughron sells the GIMP commercially with support and documentation, and has been generous on each occasion we have asked for his support. + + +The GIMP is also fortunate to have a community of supporters who have donated smaller amounts to the project. Many thanks go out to all those supporters. More information on how to donate to the GIMP is available on the GIMP home page. + + +==GIMP conference activities== + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. It is a vital opportunity for the GIMP developers to meet each other and discuss the direction which the software will take over the coming years. + +There have been two GIMP Conferences previously, both in Berlin, and both graciously hosted by the CCC (the Chaos Computer Club), a much less chaotic bunch of guys than their name suggests. + + +==The GIMP Developers Conference 2003== + +[[File:people2003-small.png|The People at GimpCon 2003]] + +Last year's GIMP Conference was a sub-event of the Chaos Communications Camp, a camping trip with broadband and laptops. During the camp, we discussed ways we could make the GIMP better both technically and as a community, which led up to the 2.0 release at the end of March. + +At this year's conference we will discuss, among other things, + +* What we expect from a replacement for the PDB (Procedural Database) +*How we will integrate GEGL into the GIMP +*Managing plug-in distribution +*The GIMP's organisation + + +==The GIMP, Live!== + +Two of our resident graphics designers, Jakub Steiner (jimmac) and Tuomas Kuosmanen (tigert) are giving a user-day GIMP demonstration on Wednesday. Last year, jimmac presented a series of tutorials on basic GIMP techniques to a crowd of over 100 people, and held them captivated for nearly 3 hours. + +This is an opportunity to see what the GIMP can do in the hands of professionals, and to pick up some tips for your own use. A spectacle not to be missed. + + +==About the GIMP== + +Started in 1995 by Spencer Kimball and Peter Mattis, the GIMP has evolved into a mature and powerful application. The current release is version 2.0, which has major improvements over its predecessors in the user interface, making the GIMP more accessible for casual users as well as graphics professionals. + +[[File:macosx_screenshot1_thumb.jpg|GIMP on the Mac OS X operating system]] + +GIMP on the Mac OS X operating system + +GIMP is expandable and extensible. It is designed to be augmented with plug-ins and extensions which allow access to its capabilties via a number of languages. The advanced scripting interface allows everything from the simplest task to the most complex image manipulation procedures to be easily scripted. + +The software comes with lots of features, some are newly implemented and available with the 2.0 Release. A short list over the most interesting features are: + +*a full suite of tools for painting and image manipulation +*preview of brush outline while you're drawing +*customizable interface using a drag-and-drop dockable +*advanced scripting capabilities (Scheme, Python, Perl) +*over 100 plug-ins available as standard +*fullscreen mode and view filters +*much, much more! diff --git a/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20161024001757-show.txt b/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20161024001757-show.txt new file mode 100644 index 0000000..a52a0a0 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2004,_Kristiansand,_Norway,_2004-20161024001757-show.txt @@ -0,0 +1,135 @@ + + +The GIMP Developers Conference 2004 was held as a sub-event of [http://2004.guadec.org/ GUADEC 5] in Kristiansand, Norway, on the 28th, 29th and 30th of June. + + +__TOC__ + + + + + +==GIMP related talks at GUADEC== + +===Programming a GIMP Plug-in — Dave Neary=== + +[[File:Dave_Neary.jpg|Dave Neary]] +Dave Neary + + +Dave Neary's been hanging around free software for about 6 years. He started off as a leech, and then decided to turn into a leechee sometime around 1999, when he started working on the GIMP. His main interest in the GIMP is revitalising the relationship betweek the user and developer communities. He has also helped out a little now and again on other things, and is listed as a co-author of gnect. + +He is currently living and working in Lyon, France. + + +===Custom widgets in GtkCairo — Øyvind Kolås=== + +[[File:Oyvind_Kolas.png|Øyvind Kolås]] +Øyvind Kolås + + +Øyvind is working on an application called Bauxite, which uses a node-based data structure similar to GEGL This application is both a standalone video editor and a comprehensive test bed of GEGL's node structrues. + +Øyvind is also working on the next generation XCF format. + +His primary interest in the GIMP is graph compositing. + + + + + +==Other graphics talks at GUADEC== + +* Typography and graphic design for programmers —Liam Quin +* The future of rendering in GNOME — Owen Taylor +* GStreamer Internals — Benjamin Otte +* Digital Photography in a GNOME Environment — Hubert Figuiére + + + + +==Sponsors== + +Many thanks to our generous sponsors, without whom GIMPCon would not be possible: + + + +[[File:Gnu-head-sm.jpg|The Free Software Foundation]] +[http://www.fsf.org/ The Free Software Foundation] + + +The Free Software Foundation has consistently been the greatest supporter of the GIMP project, and has been the primary sponsor of each of the three GIMP Conferences which we have held. Many thanks go out to RMS and everyone else at GNU. + + + +[[File:Mac_gimp_logo4.png|MacGIMP]] +[http://www.macgimp.com/ MacGIMP] + + +Mat Caughron sells the GIMP commercially with support and documentation, and has been generous on each occasion we have asked for his support. + + + +The GIMP is also fortunate to have a community of supporters who have donated smaller amounts to the project. Many thanks go out to all those supporters. More information on how to donate to the GIMP is available on the GIMP home page. + + + + + +==GIMP conference activities== + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. It is a vital opportunity for the GIMP developers to meet each other and discuss the direction which the software will take over the coming years. + +There have been two GIMP Conferences previously, both in Berlin, and both graciously hosted by the CCC (the Chaos Computer Club), a much less chaotic bunch of guys than their name suggests. + + + + + +==The GIMP Developers Conference 2003== + +[[File:People2003-small.png|The People at GimpCon 2003]] + +Last year's GIMP Conference was a sub-event of the Chaos Communications Camp, a camping trip with broadband and laptops. During the camp, we discussed ways we could make the GIMP better both technically and as a community, which led up to the 2.0 release at the end of March. + +At this year's conference we will discuss, among other things, + + +* What we expect from a replacement for the PDB (Procedural Database) +* How we will integrate GEGL into the GIMP +* Managing plug-in distribution +* The GIMP's organisation + + + + +==The GIMP, Live!== + +Two of our resident graphics designers, Jakub Steiner (jimmac) and Tuomas Kuosmanen (tigert) are giving a user-day GIMP demonstration on Wednesday. Last year, jimmac presented a series of tutorials on basic GIMP techniques to a crowd of over 100 people, and held them captivated for nearly 3 hours. + +This is an opportunity to see what the GIMP can do in the hands of professionals, and to pick up some tips for your own use. A spectacle not to be missed. + + + + + +==About the GIMP== + +Started in 1995 by Spencer Kimball and Peter Mattis, the GIMP has evolved into a mature and powerful application. The current release is version 2.0, which has major improvements over its predecessors in the user interface, making the GIMP more accessible for casual users as well as graphics professionals. + +[[File:Macosx_screenshot1_thumb.jpg|GIMP on the Mac OS X operating system]] + +GIMP on the Mac OS X operating system + +GIMP is expandable and extensible. It is designed to be augmented with plug-ins and extensions which allow access to its capabilties via a number of languages. The advanced scripting interface allows everything from the simplest task to the most complex image manipulation procedures to be easily scripted. + +The software comes with lots of features, some are newly implemented and available with the 2.0 Release. A short list over the most interesting features are: + + +* a full suite of tools for painting and image manipulation +* preview of brush outline while you're drawing +* customizable interface using a drag-and-drop dockable +* advanced scripting capabilities (Scheme, Python, Perl) +* over 100 plug-ins available as standard +* fullscreen mode and view filters +* much, much more! diff --git a/wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20150911225818-edit.txt b/wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20150911225818-edit.txt new file mode 100644 index 0000000..195c864 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20150911225818-edit.txt @@ -0,0 +1,66 @@ +The GIMP Developers Conference 2005 was held as a sub-event of the [http://2005.guadec.org/ GUADEC 2005] in Stuttgart, Germany on 30.05.2005. + +==Minutes of the GIMP Developers Conference 2005== + +About a dozen people were present at the meeting. We haven't made a +list but off the top of my head I remember Mitch, Michael Schumacher, +Øyvind Kolås, Simon Budig, Raphael Quinet, Karine Delvare and her +husband, David Odin and me. I know I missed someone. Please bear with +me, I suck at remembering names... + +===Merchandising=== +Picking up on the discussion about Sourcewear that we had on this list +earlier, we talked about merchandising. I had the impression that +everyone was rather happy about the solution that we found on the +mailing-list. We agreed that we don't need an official merchandiser +but that it is a good thing to link to shops that support the GIMP +project. + +===Spending our money=== +It was shortly discussed on how the money that is raised by donations +or from other sources should be spent. Problems with the mailing-list +server were mentioned, but without Yosh being around we weren't able +to tell if money could help to improve this. We seemed to agree that +the money should primarily be spent to bring together the people +working on GIMP. We think that it helps GIMP if money is used to help +contributors to attend the next GimpCon. This can also be seen as some +sort of reward for the active contributors and thus can serve a +similar role as a bounty. + +===Next GIMPCon=== +Everyone agreed that we should have another GimpCon soon, if possible +still this year. This needs a suitable location and people willing to +organize the event. A possible location would be Lyon, France where +David Odin has good connections to the university. He said he will +investigate for possible dates. If you can think of other locations +(Ottawa, Canada was mentioned), please tell us about it. + +===Roadmap=== +The roadmap for GIMP was discussed shortly. We would like to get GIMP +2.4 out soon. The plan is to finish what has been started in the +development branch. This should be doable over the summer. This means +that 2.4 will have color management but we aren't going to try larger +changes such as adding support for higher bit depths. + +===GEGL=== +We agreed though that 8bit is not going to get us much further and +that we need to pick up on GEGL again. The GEGL source tree had been +abandoned for a while, the last commit dating back to March 2004. We +found that in order to make further plans, we first need to get an +overview on the current state of the code. Mitch, Pippin and me +decided that we will spend the next days cleaning up the code in GEGl, +evaluating it and making plans. That's what we've been doing during +the last days. More on that later... + +===Menu reorganisation=== +The menu reorganisation effort was raised. It seems that Akkana's +proposal is widely accepted. The proposed patch can be improved but it +is a good start. If Akkana or someone else has time and motivation to +continute to work on this, then the patch can be committed right away. + + +GUADEC rocked hard this year and it was a pleasure to meet so many +great people. + + +Authors: Sven Neumann, Simon Budig. [http://gimp.1065349.n5.nabble.com/The-GUADEC-meeting-td15323.html Read source and discussion] diff --git a/wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20161024014518-show.txt b/wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20161024014518-show.txt new file mode 100644 index 0000000..7b0d16d --- /dev/null +++ b/wiki/Hacking:GIMPCon_2005,_Stuttgart,_Germany,_2005-20161024014518-show.txt @@ -0,0 +1,85 @@ + + +The GIMP Developers Conference 2005 was held as a sub-event of the [http://2005.guadec.org/ GUADEC 2005] in Stuttgart, Germany on 30.05.2005. + + +__TOC__ + +==Minutes of the GIMP Developers Conference 2005== + +About a dozen people were present at the meeting. We haven't made a +list but off the top of my head I remember Mitch, Michael Schumacher, +Øyvind Kolås, Simon Budig, Raphael Quinet, Karine Delvare and her +husband, David Odin and me. I know I missed someone. Please bear with +me, I suck at remembering names... + + +===Merchandising=== + +Picking up on the discussion about Sourcewear that we had on this list +earlier, we talked about merchandising. I had the impression that +everyone was rather happy about the solution that we found on the +mailing-list. We agreed that we don't need an official merchandiser +but that it is a good thing to link to shops that support the GIMP +project. + + +===Spending our money=== + +It was shortly discussed on how the money that is raised by donations +or from other sources should be spent. Problems with the mailing-list +server were mentioned, but without Yosh being around we weren't able +to tell if money could help to improve this. We seemed to agree that +the money should primarily be spent to bring together the people +working on GIMP. We think that it helps GIMP if money is used to help +contributors to attend the next GimpCon. This can also be seen as some +sort of reward for the active contributors and thus can serve a +similar role as a bounty. + + +===Next GIMPCon=== + +Everyone agreed that we should have another GimpCon soon, if possible +still this year. This needs a suitable location and people willing to +organize the event. A possible location would be Lyon, France where +David Odin has good connections to the university. He said he will +investigate for possible dates. If you can think of other locations +(Ottawa, Canada was mentioned), please tell us about it. + + +===Roadmap=== + +The roadmap for GIMP was discussed shortly. We would like to get GIMP +2.4 out soon. The plan is to finish what has been started in the +development branch. This should be doable over the summer. This means +that 2.4 will have color management but we aren't going to try larger +changes such as adding support for higher bit depths. + + +===GEGL=== + +We agreed though that 8bit is not going to get us much further and +that we need to pick up on GEGL again. The GEGL source tree had been +abandoned for a while, the last commit dating back to March 2004. We +found that in order to make further plans, we first need to get an +overview on the current state of the code. Mitch, Pippin and me +decided that we will spend the next days cleaning up the code in GEGl, +evaluating it and making plans. That's what we've been doing during +the last days. More on that later... + + +===Menu reorganisation=== + +The menu reorganisation effort was raised. It seems that Akkana's +proposal is widely accepted. The proposed patch can be improved but it +is a good start. If Akkana or someone else has time and motivation to +continute to work on this, then the patch can be committed right away. + + + +GUADEC rocked hard this year and it was a pleasure to meet so many +great people. + + + +Authors: Sven Neumann, Simon Budig. [http://gimp.1065349.n5.nabble.com/The-GUADEC-meeting-td15323.html Read source and discussion] diff --git a/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150907021633-show.txt b/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150907021633-show.txt new file mode 100644 index 0000000..8857801 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150907021633-show.txt @@ -0,0 +1,182 @@ + + +The GIMP Developers Conference 2006 was held as a sub-event of the [http://libregraphicsmeeting.org/ Libre Graphics Meeting] in Lyon, France, on the 17th, 18th and 19th of March. + + +__TOC__ + +[[File:People2006.jpg|The People at GIMPCon 2006]] + + + + +==About the GIMP Developers Conference== + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. It is a vital opportunity for GIMP developers to meet each other and discuss the direction which the software will take over the coming years. + +There have been four GIMP Conferences previously: two in Berlin, Germany hosted by the CCC (the Chaos Computer Club), one in Kristiansand, Norway as part of GUADEC 2004 and one in Stuttgart, Germany as part of GUADEC 2005. + + + + + +==Minutes of the GIMP Developers Conference 2006== + +During LGM, we had two sessions dedicated to GIMP: one on Saturday afternoon (16:30-18:00) and one on Sunday (10:30-16:00). The following points were on the agenda: + +[[File:Meetings2006.jpg|Discussions and presentations at GIMPCon 2006]] + + + + +===GIMP 2.4=== + +====SIOX==== + +Gerald explained the current status of SIOX and its future developments: + + +* There are still some performance concerns because SIOX was designed mainly for web-sized images. In the morning, Raphaël suggested a way to add a low resolution preview for large images and this feature will be implemented soon. +* Implement a detail refinement brush. Simon suggested to apply the refinement automatically on the edge area, but Gerald replied that defining such an area assumes that the shape is simple, which is something that SIOX tries to avoid. +* New preview toggle, which temporarily disables the automatic computation for multiple brush strokes for example. +* A volunteer for integrating more SIOX features in GIMP is needed. + +====New tools==== + +* Sven pointed out that the rectangular and ellipse selection tools should have the same behavior. +* The new align tool is also confusing for some users. Its behavior is still too flaky. Sven mentioned that Peter Sikking may be able to help in determining what the users want. A session with Peter is planned for tomorrow (the vision discussion). +* The code for the Lanczos interpolation is currently broken. Either we fix the Lanczos code or we hide it from the 2.4 release by removing it from the UI and from the PDB. + +====Google's Summer of Code==== + +Dave pointed out that the Summer of Code is coming soon and ideas are needed. GIMP is one of the projects which can offer tasks to be solved. + +Ideas and Tasks are needed soon, probably around the beginning of May. + + +====Preparation for the 2.4 release==== + +Michael pointed out that some terms in the GIMP UI uses are misleading and very different from other image manipulation programs. One example is the misleading dpi instead of ppi. + +Michael proposed a Texttool PDB and also new features: multiple styles for a line of text, more control over text. Unfortunately, GIMP does not currently support all pango features. Sometimes ligature problems occur with Bitstream Vera Sans. + +Various other issues were also discussed: undo handling of vector operations, improvements to the full screen mode (some plug-ins cannot display progress bars), etc. + + +====TODO==== + +* A list of blocker bugs for the 2.4 release is needed. +* A string and UI freeze is needed. +* Mitch's cleanup should not be commited before the 2.4 release. +* Volunteers are needed for checking GIMP terms (English and translations). A wiki page should track the terms and also possible translations. One volunteer should elaborate if Rosetta from Ubuntu can be used for this. +* A bug is needed for plug-ins which use g_message() and where dialogs pop up behind the main window. +* A volunteer is needed for the Texttool PDB. + + + + +===Documentation=== + +The manual currently features nine languages, five are activly worked on. Russian and Norwegian will be added after the 0.10 release. DocBook/XML is a barrier for new contributors, but there is currently no valuable alternative available. + +For PDF creation we should use dblatex instead of the dead project db2latex. + +The more translation an XML file holds the more difficult it is for contributors to concentrate on their content. Maybe we should split up the content directory-wise instead of profiling. + +Michael proposed way users can comment on HTML pages like the PHP documentation. The problems are: what will happen to comments after an update of the documentation, how and who manages comments, which system will suit our needs. + + +====TODO==== + +* Stick to DocBook/XML for the next year. Be aware of the problems and change to a different internal structure if needed. A new project page should make it easier to contributors to join the project. +* Elaborate which issue tracker can lower the barriers for feedback from our readers without turning it into a discussion forum that needs active moderation. + + + + +===GIMP 2.99=== + +====GEGL==== + +Pippin pointed out that GEGL does not yet support calculation over regions of interest. Some of the code that does that is currently 8-bits only, but the reference buffer implementation would be 32 bits float per pixel. Yosh proposed to generate all the code needed for this from a template. + +Pippin: GEGL is undead. + +Mitch suggested that the integration of GEGL should be in small steps. The plug-in API should be GEGL only, but will provide backwards compatibility from old plug-ins for 8bits only. + +UI and Usability problems are also caused by the indexed mode. We concluded that it should be available if the user exports his image to an indexed format, like GIF or PCX. For some indexed images, the order of the colors in the palette is significant. Raphaël proposed to handle these images through GEGL as 16bits images with the 8 least significant bits representing the original palette index so that it can be restored later when saving. Gerald mentioned that Apple may already be doing something similar. + + +====TODO==== + +* Write the 32 bits float version first, then generate others from that reference version. +* Replace the code in the base directory by GEGL operations. First replace the image map tool (used for color correction, etc.) using GEGL adapters around the pixel buffers. Then later replace the layers and masks. + + + + +===How can we motivate people to join the GIMP development?=== + +The current project page for gimp.org is not really structured and not very easy to get in touch with the developers. It would help to show to the potential contributers a list of tasks that GIMP developers consider relatively easy and useful for the next version. We could also use the task list for the Google Summer of Code or for bounties, etc. + +We should make sure that people feel welcome when they read the GIMP mailing lists. For example, we should avoid criticizing those who mention GimpShop or commercial programs such as Photoshop. + +Some suggestions were discussed, such as introducing aging in the list of GIMP authors. The About dialog would first list those who contributed to the current version and then a longer list of previous contributers. Sven and Yosh remarked that we are not really using the mailing lists for discussing GIMP development. Most of the discussion happens on IRC or directly between people. This could be improved. There was also some debate about how to avoid pointless discussions on the gimp-web mailing list. + + +====TODO==== + +* Setup a tasks list on the wiki of what can be achieved and implemented. It ranges from easy to very complex tasks. Each task should be linked to a bugzilla bug report. If someone starts working on one of these tasks, its bug report should be marked as ASSIGNED. +* Improve the infrastructure for the web site and try to make contributions easier: simpler installation and testing, if possible without requiring special skills or permissions. + + + + +===GIMP vision=== + +Peter Sikking helped us to formulate a product vision for GIMP. The vision helps to define what standard installation of the GIMP is: what plug-ins are standard and what plug-ins are optional. It shouldn't be a simple cost-and-benefit analysis of what it means to support a feature. The current problem of the product vision is too broad to be practical. Peter proposes that our product vision should address a kind of Gauss curve of what users GIMP is made for. Currently we have the experts and newbies, but a low point for the intermediates. + +Good defaults would be chosen depending on our vision, not by inventing new scenarios for each thing that we want to evaluate. The user scenarios would be written down in advance. These scenarios should not be changed afterwards because it would lead to too much discussion. The goal is to cut down all this discussion. '''The product vision is to be used as a filter.''' For example: If someone comes with the request that the UI of GIMP should be like Photoshop, we can simply state: “We are not trying to be like Photoshop, because we have a different product vision.” Though, the feature requests should still be examined carefully. + + +====Targeted user base==== + +GIMP targets experienced users. If we acknowledge that GIMP is not (primarily) for beginners, we cut off a lot of problems such as “do we need to support that,” etc. Peter noted that a “GIMP Light” would not just have some options cut off from the menus: it would have a completely different user interface, even if it would use the same code under the hood. + +Some developers work on GIMP to promote the Free Software movement and would probably not contribute if GIMP was not free. Others think that GIMP should provide fun for its developers, although our user base has grown a bit large for just doing fun experiments. We have to acknowledge that we address a user base that may be more experienced in image manipulation than we are, so the developers are partially out of the target group. + +Before converging towards a definition of the GIMP target groups and GIMP vision, there were several discussions involving examples and use cases, whether GIMP should be the best image manipulation program in the universe (best for who?), whether those working on icons and those working on photos have the same needs (number of images open, relative sizes), whether people need to switch frequently between GIMP and other applications (browser or editor for web work), whether we will support painting with shapes and natural media, etc. + +Eventually, a GIMP vision emerged... + + +====What GIMP is==== + +* GIMP is Free Software. + +* GIMP is a high-end photo manipulation application, and supports creating original art from images. + +* GIMP is a high-end application for producing icons, graphical elements of web pages, and art for user interface elements. + +* GIMP is a platform for programming cutting edge image processing algorithms, by scientists and artists. + +* GIMP is user-configurable to automate repetitive tasks. + +* GIMP is easily user-extendable, by easy installation of plug-ins. + +====What GIMP is not==== + +* GIMP is not MS Paint or Adobe Photoshop + +====TODO==== + +* Make it easier to perform repetitive tasks (macro recording) + +* Provide a UI with a low barrier to entry + +* GIMP should be easily extensible by the average user: one click-installation of plug-ins + + +Minutes written by Roman Joost and Raphaël Quinet. Photos by Jean + Karine Delvare and Raphaël Quinet. + + \ No newline at end of file diff --git a/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150914162213-edit.txt b/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150914162213-edit.txt new file mode 100644 index 0000000..c1f5c40 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20150914162213-edit.txt @@ -0,0 +1,153 @@ +The GIMP Developers Conference 2006 was held as a sub-event of the [http://libregraphicsmeeting.org Libre Graphics Meeting] in Lyon, France, on the 17th, 18th and 19th of March. + +__TOC__ + +[[File:People2006.jpg|450px|The People at GIMPCon 2006]] + + +==About the GIMP Developers Conference== + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. It is a vital opportunity for GIMP developers to meet each other and discuss the direction which the software will take over the coming years. + +There have been four GIMP Conferences previously: two in Berlin, Germany hosted by the CCC (the Chaos Computer Club), one in Kristiansand, Norway as part of GUADEC 2004 and one in Stuttgart, Germany as part of GUADEC 2005. + + +==Minutes of the GIMP Developers Conference 2006== + +During LGM, we had two sessions dedicated to GIMP: one on Saturday afternoon (16:30-18:00) and one on Sunday (10:30-16:00). The following points were on the agenda: + +[[File:Meetings2006.jpg|500 px| Discussions and presentations at GIMPCon 2006]] + + +===GIMP 2.4=== +====SIOX==== + +Gerald explained the current status of SIOX and its future developments: + +*There are still some performance concerns because SIOX was designed mainly for web-sized images. In the morning, Raphaël suggested a way to add a low resolution preview for large images and this feature will be implemented soon. +*Implement a detail refinement brush. Simon suggested to apply the refinement automatically on the edge area, but Gerald replied that defining such an area assumes that the shape is simple, which is something that SIOX tries to avoid. +*New preview toggle, which temporarily disables the automatic computation for multiple brush strokes for example. +*A volunteer for integrating more SIOX features in GIMP is needed. + +====New tools==== + +*Sven pointed out that the rectangular and ellipse selection tools should have the same behavior. +*The new align tool is also confusing for some users. Its behavior is still too flaky. Sven mentioned that Peter Sikking may be able to help in determining what the users want. A session with Peter is planned for tomorrow (the vision discussion). +*The code for the Lanczos interpolation is currently broken. Either we fix the Lanczos code or we hide it from the 2.4 release by removing it from the UI and from the PDB. + +====Google's Summer of Code==== + +Dave pointed out that the Summer of Code is coming soon and ideas are needed. GIMP is one of the projects which can offer tasks to be solved. + +Ideas and Tasks are needed soon, probably around the beginning of May. + +====Preparation for the 2.4 release==== + +Michael pointed out that some terms in the GIMP UI uses are misleading and very different from other image manipulation programs. One example is the misleading dpi instead of ppi. + +Michael proposed a Texttool PDB and also new features: multiple styles for a line of text, more control over text. Unfortunately, GIMP does not currently support all pango features. Sometimes ligature problems occur with Bitstream Vera Sans. + +Various other issues were also discussed: undo handling of vector operations, improvements to the full screen mode (some plug-ins cannot display progress bars), etc. + +====TODO==== + +*A list of blocker bugs for the 2.4 release is needed. +*A string and UI freeze is needed. +*Mitch's cleanup should not be commited before the 2.4 release. +*Volunteers are needed for checking GIMP terms (English and translations). A wiki page should track the terms and also possible translations. One volunteer should elaborate if Rosetta from Ubuntu can be used for this. +*A bug is needed for plug-ins which use g_message() and where dialogs pop up behind the main window. +*A volunteer is needed for the Texttool PDB. + + +===Documentation=== + +The manual currently features nine languages, five are activly worked on. Russian and Norwegian will be added after the 0.10 release. DocBook/XML is a barrier for new contributors, but there is currently no valuable alternative available. + +For PDF creation we should use dblatex instead of the dead project db2latex. + +The more translation an XML file holds the more difficult it is for contributors to concentrate on their content. Maybe we should split up the content directory-wise instead of profiling. + +Michael proposed way users can comment on HTML pages like the PHP documentation. The problems are: what will happen to comments after an update of the documentation, how and who manages comments, which system will suit our needs. + +====TODO==== + +*Stick to DocBook/XML for the next year. Be aware of the problems and change to a different internal structure if needed. A new project page should make it easier to contributors to join the project. +*Elaborate which issue tracker can lower the barriers for feedback from our readers without turning it into a discussion forum that needs active moderation. + + +===GIMP 2.99=== + +====GEGL==== + +Pippin pointed out that GEGL does not yet support calculation over regions of interest. Some of the code that does that is currently 8-bits only, but the reference buffer implementation would be 32 bits float per pixel. Yosh proposed to generate all the code needed for this from a template. + +Pippin: GEGL is undead. + +Mitch suggested that the integration of GEGL should be in small steps. The plug-in API should be GEGL only, but will provide backwards compatibility from old plug-ins for 8bits only. + +UI and Usability problems are also caused by the indexed mode. We concluded that it should be available if the user exports his image to an indexed format, like GIF or PCX. For some indexed images, the order of the colors in the palette is significant. Raphaël proposed to handle these images through GEGL as 16bits images with the 8 least significant bits representing the original palette index so that it can be restored later when saving. Gerald mentioned that Apple may already be doing something similar. + +====TODO==== + +*Write the 32 bits float version first, then generate others from that reference version. +*Replace the code in the base directory by GEGL operations. First replace the image map tool (used for color correction, etc.) using GEGL adapters around the pixel buffers. Then later replace the layers and masks. + + +===How can we motivate people to join the GIMP development?=== + +The current project page for gimp.org is not really structured and not very easy to get in touch with the developers. It would help to show to the potential contributers a list of tasks that GIMP developers consider relatively easy and useful for the next version. We could also use the task list for the Google Summer of Code or for bounties, etc. + +We should make sure that people feel welcome when they read the GIMP mailing lists. For example, we should avoid criticizing those who mention GimpShop or commercial programs such as Photoshop. + +Some suggestions were discussed, such as introducing aging in the list of GIMP authors. The About dialog would first list those who contributed to the current version and then a longer list of previous contributers. Sven and Yosh remarked that we are not really using the mailing lists for discussing GIMP development. Most of the discussion happens on IRC or directly between people. This could be improved. There was also some debate about how to avoid pointless discussions on the gimp-web mailing list. + +====TODO==== + +*Setup a tasks list on the wiki of what can be achieved and implemented. It ranges from easy to very complex tasks. Each task should be linked to a bugzilla bug report. If someone starts working on one of these tasks, its bug report should be marked as ASSIGNED. +*Improve the infrastructure for the web site and try to make contributions easier: simpler installation and testing, if possible without requiring special skills or permissions. + + +===GIMP vision=== + +Peter Sikking helped us to formulate a product vision for GIMP. The vision helps to define what standard installation of the GIMP is: what plug-ins are standard and what plug-ins are optional. It shouldn't be a simple cost-and-benefit analysis of what it means to support a feature. The current problem of the product vision is too broad to be practical. Peter proposes that our product vision should address a kind of Gauss curve of what users GIMP is made for. Currently we have the experts and newbies, but a low point for the intermediates. + +Good defaults would be chosen depending on our vision, not by inventing new scenarios for each thing that we want to evaluate. The user scenarios would be written down in advance. These scenarios should not be changed afterwards because it would lead to too much discussion. The goal is to cut down all this discussion. '''The product vision is to be used as a filter.''' For example: If someone comes with the request that the UI of GIMP should be like Photoshop, we can simply state: “We are not trying to be like Photoshop, because we have a different product vision.” Though, the feature requests should still be examined carefully. + +====Targeted user base==== + +GIMP targets experienced users. If we acknowledge that GIMP is not (primarily) for beginners, we cut off a lot of problems such as “do we need to support that,” etc. Peter noted that a “GIMP Light” would not just have some options cut off from the menus: it would have a completely different user interface, even if it would use the same code under the hood. + +Some developers work on GIMP to promote the Free Software movement and would probably not contribute if GIMP was not free. Others think that GIMP should provide fun for its developers, although our user base has grown a bit large for just doing fun experiments. We have to acknowledge that we address a user base that may be more experienced in image manipulation than we are, so the developers are partially out of the target group. + +Before converging towards a definition of the GIMP target groups and GIMP vision, there were several discussions involving examples and use cases, whether GIMP should be the best image manipulation program in the universe (best for who?), whether those working on icons and those working on photos have the same needs (number of images open, relative sizes), whether people need to switch frequently between GIMP and other applications (browser or editor for web work), whether we will support painting with shapes and natural media, etc. + +Eventually, a GIMP vision emerged... + +====What GIMP is==== + +*GIMP is Free Software. + +*GIMP is a high-end photo manipulation application, and supports creating original art from images. + +*GIMP is a high-end application for producing icons, graphical elements of web pages, and art for user interface elements. + +*GIMP is a platform for programming cutting edge image processing algorithms, by scientists and artists. + +*GIMP is user-configurable to automate repetitive tasks. + +*GIMP is easily user-extendable, by easy installation of plug-ins. + +====What GIMP is not==== + +*GIMP is not MS Paint or Adobe Photoshop + +====TODO==== + +*Make it easier to perform repetitive tasks (macro recording) + +*Provide a UI with a low barrier to entry + +*GIMP should be easily extensible by the average user: one click-installation of plug-ins + + +Minutes written by Roman Joost and Raphaël Quinet. Photos by Jean + Karine Delvare and Raphaël Quinet. diff --git a/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20161024012630-show.txt b/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20161024012630-show.txt new file mode 100644 index 0000000..39146f7 --- /dev/null +++ b/wiki/Hacking:GIMPCon_2006,_Lyon,_France,_2006-20161024012630-show.txt @@ -0,0 +1,182 @@ + + +The GIMP Developers Conference 2006 was held as a sub-event of the [http://libregraphicsmeeting.org/ Libre Graphics Meeting] in Lyon, France, on the 17th, 18th and 19th of March. + + +__TOC__ + +[[File:People2006.jpg|The People at GIMPCon 2006]] + + + + +==About the GIMP Developers Conference== + +The GIMP Developers Conference, also known as GIMPCon, is a gathering of GIMP and GEGL developers from all over the World. It is a vital opportunity for GIMP developers to meet each other and discuss the direction which the software will take over the coming years. + +There have been four GIMP Conferences previously: two in Berlin, Germany hosted by the CCC (the Chaos Computer Club), one in Kristiansand, Norway as part of GUADEC 2004 and one in Stuttgart, Germany as part of GUADEC 2005. + + + + + +==Minutes of the GIMP Developers Conference 2006== + +During LGM, we had two sessions dedicated to GIMP: one on Saturday afternoon (16:30-18:00) and one on Sunday (10:30-16:00). The following points were on the agenda: + +[[File:Meetings2006.jpg|Discussions and presentations at GIMPCon 2006]] + + + + +===GIMP 2.4=== + +====SIOX==== + +Gerald explained the current status of SIOX and its future developments: + + +* There are still some performance concerns because SIOX was designed mainly for web-sized images. In the morning, Raphaël suggested a way to add a low resolution preview for large images and this feature will be implemented soon. +* Implement a detail refinement brush. Simon suggested to apply the refinement automatically on the edge area, but Gerald replied that defining such an area assumes that the shape is simple, which is something that SIOX tries to avoid. +* New preview toggle, which temporarily disables the automatic computation for multiple brush strokes for example. +* A volunteer for integrating more SIOX features in GIMP is needed. + +====New tools==== + +* Sven pointed out that the rectangular and ellipse selection tools should have the same behavior. +* The new align tool is also confusing for some users. Its behavior is still too flaky. Sven mentioned that Peter Sikking may be able to help in determining what the users want. A session with Peter is planned for tomorrow (the vision discussion). +* The code for the Lanczos interpolation is currently broken. Either we fix the Lanczos code or we hide it from the 2.4 release by removing it from the UI and from the PDB. + +====Google's Summer of Code==== + +Dave pointed out that the Summer of Code is coming soon and ideas are needed. GIMP is one of the projects which can offer tasks to be solved. + +Ideas and Tasks are needed soon, probably around the beginning of May. + + +====Preparation for the 2.4 release==== + +Michael pointed out that some terms in the GIMP UI uses are misleading and very different from other image manipulation programs. One example is the misleading dpi instead of ppi. + +Michael proposed a Texttool PDB and also new features: multiple styles for a line of text, more control over text. Unfortunately, GIMP does not currently support all pango features. Sometimes ligature problems occur with Bitstream Vera Sans. + +Various other issues were also discussed: undo handling of vector operations, improvements to the full screen mode (some plug-ins cannot display progress bars), etc. + + +====TODO==== + +* A list of blocker bugs for the 2.4 release is needed. +* A string and UI freeze is needed. +* Mitch's cleanup should not be commited before the 2.4 release. +* Volunteers are needed for checking GIMP terms (English and translations). A wiki page should track the terms and also possible translations. One volunteer should elaborate if Rosetta from Ubuntu can be used for this. +* A bug is needed for plug-ins which use g_message() and where dialogs pop up behind the main window. +* A volunteer is needed for the Texttool PDB. + + + + +===Documentation=== + +The manual currently features nine languages, five are activly worked on. Russian and Norwegian will be added after the 0.10 release. DocBook/XML is a barrier for new contributors, but there is currently no valuable alternative available. + +For PDF creation we should use dblatex instead of the dead project db2latex. + +The more translation an XML file holds the more difficult it is for contributors to concentrate on their content. Maybe we should split up the content directory-wise instead of profiling. + +Michael proposed way users can comment on HTML pages like the PHP documentation. The problems are: what will happen to comments after an update of the documentation, how and who manages comments, which system will suit our needs. + + +====TODO==== + +* Stick to DocBook/XML for the next year. Be aware of the problems and change to a different internal structure if needed. A new project page should make it easier to contributors to join the project. +* Elaborate which issue tracker can lower the barriers for feedback from our readers without turning it into a discussion forum that needs active moderation. + + + + +===GIMP 2.99=== + +====GEGL==== + +Pippin pointed out that GEGL does not yet support calculation over regions of interest. Some of the code that does that is currently 8-bits only, but the reference buffer implementation would be 32 bits float per pixel. Yosh proposed to generate all the code needed for this from a template. + +Pippin: GEGL is undead. + +Mitch suggested that the integration of GEGL should be in small steps. The plug-in API should be GEGL only, but will provide backwards compatibility from old plug-ins for 8bits only. + +UI and Usability problems are also caused by the indexed mode. We concluded that it should be available if the user exports his image to an indexed format, like GIF or PCX. For some indexed images, the order of the colors in the palette is significant. Raphaël proposed to handle these images through GEGL as 16bits images with the 8 least significant bits representing the original palette index so that it can be restored later when saving. Gerald mentioned that Apple may already be doing something similar. + + +====TODO==== + +* Write the 32 bits float version first, then generate others from that reference version. +* Replace the code in the base directory by GEGL operations. First replace the image map tool (used for color correction, etc.) using GEGL adapters around the pixel buffers. Then later replace the layers and masks. + + + + +===How can we motivate people to join the GIMP development?=== + +The current project page for gimp.org is not really structured and not very easy to get in touch with the developers. It would help to show to the potential contributers a list of tasks that GIMP developers consider relatively easy and useful for the next version. We could also use the task list for the Google Summer of Code or for bounties, etc. + +We should make sure that people feel welcome when they read the GIMP mailing lists. For example, we should avoid criticizing those who mention GimpShop or commercial programs such as Photoshop. + +Some suggestions were discussed, such as introducing aging in the list of GIMP authors. The About dialog would first list those who contributed to the current version and then a longer list of previous contributers. Sven and Yosh remarked that we are not really using the mailing lists for discussing GIMP development. Most of the discussion happens on IRC or directly between people. This could be improved. There was also some debate about how to avoid pointless discussions on the gimp-web mailing list. + + +====TODO==== + +* Setup a tasks list on the wiki of what can be achieved and implemented. It ranges from easy to very complex tasks. Each task should be linked to a bugzilla bug report. If someone starts working on one of these tasks, its bug report should be marked as ASSIGNED. +* Improve the infrastructure for the web site and try to make contributions easier: simpler installation and testing, if possible without requiring special skills or permissions. + + + + +===GIMP vision=== + +Peter Sikking helped us to formulate a product vision for GIMP. The vision helps to define what standard installation of the GIMP is: what plug-ins are standard and what plug-ins are optional. It shouldn't be a simple cost-and-benefit analysis of what it means to support a feature. The current problem of the product vision is too broad to be practical. Peter proposes that our product vision should address a kind of Gauss curve of what users GIMP is made for. Currently we have the experts and newbies, but a low point for the intermediates. + +Good defaults would be chosen depending on our vision, not by inventing new scenarios for each thing that we want to evaluate. The user scenarios would be written down in advance. These scenarios should not be changed afterwards because it would lead to too much discussion. The goal is to cut down all this discussion. '''The product vision is to be used as a filter.''' For example: If someone comes with the request that the UI of GIMP should be like Photoshop, we can simply state: “We are not trying to be like Photoshop, because we have a different product vision.” Though, the feature requests should still be examined carefully. + + +====Targeted user base==== + +GIMP targets experienced users. If we acknowledge that GIMP is not (primarily) for beginners, we cut off a lot of problems such as “do we need to support that,” etc. Peter noted that a “GIMP Light” would not just have some options cut off from the menus: it would have a completely different user interface, even if it would use the same code under the hood. + +Some developers work on GIMP to promote the Free Software movement and would probably not contribute if GIMP was not free. Others think that GIMP should provide fun for its developers, although our user base has grown a bit large for just doing fun experiments. We have to acknowledge that we address a user base that may be more experienced in image manipulation than we are, so the developers are partially out of the target group. + +Before converging towards a definition of the GIMP target groups and GIMP vision, there were several discussions involving examples and use cases, whether GIMP should be the best image manipulation program in the universe (best for who?), whether those working on icons and those working on photos have the same needs (number of images open, relative sizes), whether people need to switch frequently between GIMP and other applications (browser or editor for web work), whether we will support painting with shapes and natural media, etc. + +Eventually, a GIMP vision emerged... + + +====What GIMP is==== + +* GIMP is Free Software. + +* GIMP is a high-end photo manipulation application, and supports creating original art from images. + +* GIMP is a high-end application for producing icons, graphical elements of web pages, and art for user interface elements. + +* GIMP is a platform for programming cutting edge image processing algorithms, by scientists and artists. + +* GIMP is user-configurable to automate repetitive tasks. + +* GIMP is easily user-extendable, by easy installation of plug-ins. + +====What GIMP is not==== + +* GIMP is not MS Paint or Adobe Photoshop + +====TODO==== + +* Make it easier to perform repetitive tasks (macro recording) + +* Provide a UI with a low barrier to entry + +* GIMP should be easily extensible by the average user: one click-installation of plug-ins + + +Minutes written by Roman Joost and Raphaël Quinet. Photos by Jean + Karine Delvare and Raphaël Quinet. + + \ No newline at end of file diff --git a/wiki/Hacking:GSOC%2Archive-20161109165241-show.txt b/wiki/Hacking:GSOC%2Archive-20161109165241-show.txt new file mode 100644 index 0000000..8172a10 --- /dev/null +++ b/wiki/Hacking:GSOC%2Archive-20161109165241-show.txt @@ -0,0 +1,520 @@ + + +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/ archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +'''''In short, what is Google Summer of Code (GSoC)?''''' + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year''' google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months''', to implement a specific feature. '''Each student is assigned a mentor''' which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). '''About 1000 students are accepted''' each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for ''students'' who are ''older than 18''. For details about applications see [[Hacking:GSOC|Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + + +__TOC__ + + + + + +==Projects in GSoC 2013== + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + + +Minimal Student Requirements: + + +* Good C knowledge +* basic GObject knowledge + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL| Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + + +Minimal Student Requirements: + + +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also + + +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + + + +==Projects in GSoC 2012== + +====Port missing GIMP features to GEGL==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + + +====Porting GEGL operations==== + +'''Mentor:''' Victor Oliviera + +'''Student:''' Hans Lo + +I am applying for the GEGL operation porting project. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + + +====Graphical Node Editor==== + +'''Mentor:''' Alexia Death + +'''Student:''' Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + + +====Unified Transformation Tool==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Mikael Magnusson + +'''Category:''' Tools, User Interface + + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +==Projects in GSoC 2011== + +====Porting GIMP plugins to GEGL operations==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====OpenCL in GEGL==== + +'''Mentor:''' João S. O. Bueno + +'''Student:''' Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====Adaptive Cloning (aka Seamless cloning)==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + + +====Replace GimpSizeEntry widget==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====Warp tool for GIMP==== + +'''Mentor:''' Alexia Death + +'''Student:''' Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + + +==Projects in GSoC 2010== + +====HDR and matting operators for GEGL==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + + +====Cage-based deformation tool==== + +'''Mentor:''' Kaja Liiv + +'''Student:''' Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + + +* you "put" a closed polygon on the image (not limited to 4 handles) +* you deform the cage, the image is deformed accordingly + +====Implement and add infrastructure for on-canvas tool drawing/options==== + +'''Mentor:''' Joao Bueno + +'''Student:''' Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +==Projects finished in GSoC 2009== + +====Better nonlinear resampler with built-in antialiasing (GEGL)==== + +'''Mentor:''' Nicolas Robidoux + +'''Student:''' Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at [http://gsoc.rivetsforbreakfast.com/enlargements.html http://gsoc.rivetsforbreakfast.com/enlargements.html]. + + +====OpenGL GPU-based Buffer & Operations in GEGL==== + +'''Mentor:''' Martin Nordholts +'''Student:''' Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + + +====Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL)==== + +'''Mentor:''' Nicolas Robidoux +'''Student:''' Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + + +====Improve Foreground Selection Tool==== + +'''Mentor:''' Gerald Friedland +'''Student:''' Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + + +====Proposal - Advanced GUI for brush dynamics (GIMP)==== + +'''Mentor:''' Kaja Liiv +'''Student:''' Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + + +==Projects finished in GSoC 2008== + +====Improving the text-tool in GIMP==== + +'''Mentor:''' Daniel Eddeland +'''Student:''' William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + + +====Enhance Python Scripting Interface Experience==== + +'''Mentor:''' João Sebastião de Oliveira Bueno +'''Student:''' Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + + +====Tagging of GIMP Resources==== + +'''Mentor:''' Aurimas Juska +'''Student:''' Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + + +====Operations in Frequency Domain==== + +'''Mentor: '''Øyvind Kolås +'''Student:''' Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + + +===GSoC 2007 - GIMP wasn't accepted =(=== + +==Projects finished in GSoC 2006== + +====JPEG2000 plug-in==== + +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + + +====Vector layers and tools to manipulate them==== + +'''Mentor:''' Simon Budig +'''Student:''' Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + + +====Ruby binding for GIMP scripting==== + +'''Mentor:''' Kevin Cozens +'''Student:''' Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + + +====Healing brush==== + +'''Mentor:''' Manish Singh +'''Student:''' Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + + +====Vanishing point cloning==== + +'''Mentor:''' Manish Singh +'''Student:''' Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it + + \ No newline at end of file diff --git a/wiki/Hacking:GSOC%2Archive-20180812150611-show.txt b/wiki/Hacking:GSOC%2Archive-20180812150611-show.txt new file mode 100644 index 0000000..8172a10 --- /dev/null +++ b/wiki/Hacking:GSOC%2Archive-20180812150611-show.txt @@ -0,0 +1,520 @@ + + +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/ archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +'''''In short, what is Google Summer of Code (GSoC)?''''' + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year''' google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months''', to implement a specific feature. '''Each student is assigned a mentor''' which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). '''About 1000 students are accepted''' each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for ''students'' who are ''older than 18''. For details about applications see [[Hacking:GSOC|Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + + +__TOC__ + + + + + +==Projects in GSoC 2013== + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + + +Minimal Student Requirements: + + +* Good C knowledge +* basic GObject knowledge + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL| Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + + +Minimal Student Requirements: + + +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also + + +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + + + +==Projects in GSoC 2012== + +====Port missing GIMP features to GEGL==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + + +====Porting GEGL operations==== + +'''Mentor:''' Victor Oliviera + +'''Student:''' Hans Lo + +I am applying for the GEGL operation porting project. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + + +====Graphical Node Editor==== + +'''Mentor:''' Alexia Death + +'''Student:''' Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + + +====Unified Transformation Tool==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Mikael Magnusson + +'''Category:''' Tools, User Interface + + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +==Projects in GSoC 2011== + +====Porting GIMP plugins to GEGL operations==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====OpenCL in GEGL==== + +'''Mentor:''' João S. O. Bueno + +'''Student:''' Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====Adaptive Cloning (aka Seamless cloning)==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + + +====Replace GimpSizeEntry widget==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====Warp tool for GIMP==== + +'''Mentor:''' Alexia Death + +'''Student:''' Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + + +==Projects in GSoC 2010== + +====HDR and matting operators for GEGL==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + + +====Cage-based deformation tool==== + +'''Mentor:''' Kaja Liiv + +'''Student:''' Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + + +* you "put" a closed polygon on the image (not limited to 4 handles) +* you deform the cage, the image is deformed accordingly + +====Implement and add infrastructure for on-canvas tool drawing/options==== + +'''Mentor:''' Joao Bueno + +'''Student:''' Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +==Projects finished in GSoC 2009== + +====Better nonlinear resampler with built-in antialiasing (GEGL)==== + +'''Mentor:''' Nicolas Robidoux + +'''Student:''' Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at [http://gsoc.rivetsforbreakfast.com/enlargements.html http://gsoc.rivetsforbreakfast.com/enlargements.html]. + + +====OpenGL GPU-based Buffer & Operations in GEGL==== + +'''Mentor:''' Martin Nordholts +'''Student:''' Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + + +====Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL)==== + +'''Mentor:''' Nicolas Robidoux +'''Student:''' Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + + +====Improve Foreground Selection Tool==== + +'''Mentor:''' Gerald Friedland +'''Student:''' Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + + +====Proposal - Advanced GUI for brush dynamics (GIMP)==== + +'''Mentor:''' Kaja Liiv +'''Student:''' Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + + +==Projects finished in GSoC 2008== + +====Improving the text-tool in GIMP==== + +'''Mentor:''' Daniel Eddeland +'''Student:''' William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + + +====Enhance Python Scripting Interface Experience==== + +'''Mentor:''' João Sebastião de Oliveira Bueno +'''Student:''' Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + + +====Tagging of GIMP Resources==== + +'''Mentor:''' Aurimas Juska +'''Student:''' Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + + +====Operations in Frequency Domain==== + +'''Mentor: '''Øyvind Kolås +'''Student:''' Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + + +===GSoC 2007 - GIMP wasn't accepted =(=== + +==Projects finished in GSoC 2006== + +====JPEG2000 plug-in==== + +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + + +====Vector layers and tools to manipulate them==== + +'''Mentor:''' Simon Budig +'''Student:''' Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + + +====Ruby binding for GIMP scripting==== + +'''Mentor:''' Kevin Cozens +'''Student:''' Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + + +====Healing brush==== + +'''Mentor:''' Manish Singh +'''Student:''' Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + + +====Vanishing point cloning==== + +'''Mentor:''' Manish Singh +'''Student:''' Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it + + \ No newline at end of file diff --git a/wiki/Hacking:GSOC%2FArchive-20140901134801-show.txt b/wiki/Hacking:GSOC%2FArchive-20140901134801-show.txt new file mode 100644 index 0000000..66cc1db --- /dev/null +++ b/wiki/Hacking:GSOC%2FArchive-20140901134801-show.txt @@ -0,0 +1,616 @@ + + +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/ archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +'''''In short, what is Google Summer of Code (GSoC)?''''' + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year''' google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months''', to implement a specific feature. '''Each student is assigned a mentor''' which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). '''About 1000 students are accepted''' each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for ''students'' who are ''older than 18''. For details about applications see [[Hacking:GSOC|Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + + +{| class="wikitable" +|- +|

    Contents

    + +** 1.1 Implement GEGL ops that GIMP needs (OpenCL ports) +** 1.2 Implement the combined selection tool +** 1.3 Improve support for importing and exporting PSD files +** 1.4 n-Point Image Deformation Tool +** 1.1 Implement GEGL ops that GIMP needs (OpenCL ports) +** 1.2 Implement the combined selection tool +** 1.3 Improve support for importing and exporting PSD files +** 1.4 n-Point Image Deformation Tool +* 1.1 Implement GEGL ops that GIMP needs (OpenCL ports) +* 1.2 Implement the combined selection tool +* 1.3 Improve support for importing and exporting PSD files +* 1.4 n-Point Image Deformation Tool +** 2.1 Port missing GIMP features to GEGL +** 2.2 Porting GEGL operations +** 2.3 Graphical Node Editor +** 2.4 Unified Transformation Tool +** 2.1 Port missing GIMP features to GEGL +** 2.2 Porting GEGL operations +** 2.3 Graphical Node Editor +** 2.4 Unified Transformation Tool +* 2.1 Port missing GIMP features to GEGL +* 2.2 Porting GEGL operations +* 2.3 Graphical Node Editor +* 2.4 Unified Transformation Tool +** 3.1 Porting GIMP plugins to GEGL operations +** 3.2 OpenCL in GEGL +** 3.3 Adaptive Cloning (aka Seamless cloning) +** 3.4 Replace GimpSizeEntry widget +** 3.5 Warp tool for GIMP +** 3.1 Porting GIMP plugins to GEGL operations +** 3.2 OpenCL in GEGL +** 3.3 Adaptive Cloning (aka Seamless cloning) +** 3.4 Replace GimpSizeEntry widget +** 3.5 Warp tool for GIMP +* 3.1 Porting GIMP plugins to GEGL operations +* 3.2 OpenCL in GEGL +* 3.3 Adaptive Cloning (aka Seamless cloning) +* 3.4 Replace GimpSizeEntry widget +* 3.5 Warp tool for GIMP +** 4.1 HDR and matting operators for GEGL +** 4.2 Cage-based deformation tool +** 4.3 Implement and add infrastructure for on-canvas tool drawing/options +** 4.1 HDR and matting operators for GEGL +** 4.2 Cage-based deformation tool +** 4.3 Implement and add infrastructure for on-canvas tool drawing/options +* 4.1 HDR and matting operators for GEGL +* 4.2 Cage-based deformation tool +* 4.3 Implement and add infrastructure for on-canvas tool drawing/options +** 5.1 Better nonlinear resampler with built-in antialiasing (GEGL) +** 5.2 OpenGL GPU-based Buffer & Operations in GEGL +** 5.3 Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) +** 5.4 Improve Foreground Selection Tool +** 5.5 Proposal - Advanced GUI for brush dynamics (GIMP) +** 5.1 Better nonlinear resampler with built-in antialiasing (GEGL) +** 5.2 OpenGL GPU-based Buffer & Operations in GEGL +** 5.3 Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) +** 5.4 Improve Foreground Selection Tool +** 5.5 Proposal - Advanced GUI for brush dynamics (GIMP) +* 5.1 Better nonlinear resampler with built-in antialiasing (GEGL) +* 5.2 OpenGL GPU-based Buffer & Operations in GEGL +* 5.3 Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) +* 5.4 Improve Foreground Selection Tool +* 5.5 Proposal - Advanced GUI for brush dynamics (GIMP) +** 6.1 Improving the text-tool in GIMP +** 6.2 Enhance Python Scripting Interface Experience +** 6.3 Tagging of GIMP Resources +** 6.4 Operations in Frequency Domain +** 6.5 GSoC 2007 - GIMP wasn't accepted =( +** 6.1 Improving the text-tool in GIMP +** 6.2 Enhance Python Scripting Interface Experience +** 6.3 Tagging of GIMP Resources +** 6.4 Operations in Frequency Domain +** 6.5 GSoC 2007 - GIMP wasn't accepted =( +* 6.1 Improving the text-tool in GIMP +* 6.2 Enhance Python Scripting Interface Experience +* 6.3 Tagging of GIMP Resources +* 6.4 Operations in Frequency Domain +* 6.5 GSoC 2007 - GIMP wasn't accepted =( +** 7.1 JPEG2000 plug-in +** 7.2 Vector layers and tools to manipulate them +** 7.3 Ruby binding for GIMP scripting +** 7.4 Healing brush +** 7.5 Vanishing point cloning +** 7.1 JPEG2000 plug-in +** 7.2 Vector layers and tools to manipulate them +** 7.3 Ruby binding for GIMP scripting +** 7.4 Healing brush +** 7.5 Vanishing point cloning +* 7.1 JPEG2000 plug-in +* 7.2 Vector layers and tools to manipulate them +* 7.3 Ruby binding for GIMP scripting +* 7.4 Healing brush +* 7.5 Vanishing point cloning +|} + + + + +== Projects in GSoC 2013 == + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + + +Minimal Student Requirements: + + +* Good C knowledge +* basic GObject knowledge + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL| Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + + +Minimal Student Requirements: + + +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also + + +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + + + +== Projects in GSoC 2012 == + +==== Port missing GIMP features to GEGL ==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + + +==== Porting GEGL operations ==== + +'''Mentor:''' Victor Oliviera + +'''Student:''' Hans Lo + +I am applying for the GEGL operation porting project. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + + +==== Graphical Node Editor ==== + +'''Mentor:''' Alexia Death + +'''Student:''' Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + + +==== Unified Transformation Tool ==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Mikael Magnusson + +'''Category:''' Tools, User Interface + + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +== Projects in GSoC 2011 == + +==== Porting GIMP plugins to GEGL operations ==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +==== OpenCL in GEGL ==== + +'''Mentor:''' João S. O. Bueno + +'''Student:''' Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +==== Adaptive Cloning (aka Seamless cloning) ==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + + +==== Replace GimpSizeEntry widget ==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +==== Warp tool for GIMP ==== + +'''Mentor:''' Alexia Death + +'''Student:''' Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + + +== Projects in GSoC 2010 == + +==== HDR and matting operators for GEGL ==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + + +==== Cage-based deformation tool ==== + +'''Mentor:''' Kaja Liiv + +'''Student:''' Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + + +* you "put" a closed polygon on the image (not limited to 4 handles) +* you deform the cage, the image is deformed accordingly + +==== Implement and add infrastructure for on-canvas tool drawing/options ==== + +'''Mentor:''' Joao Bueno + +'''Student:''' Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +== Projects finished in GSoC 2009 == + +==== Better nonlinear resampler with built-in antialiasing (GEGL) ==== + +'''Mentor:''' Nicolas Robidoux + +'''Student:''' Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at [http://gsoc.rivetsforbreakfast.com/enlargements.html http://gsoc.rivetsforbreakfast.com/enlargements.html]. + + +==== OpenGL GPU-based Buffer & Operations in GEGL ==== + +'''Mentor:''' Martin Nordholts +'''Student:''' Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + + +==== Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) ==== + +'''Mentor:''' Nicolas Robidoux +'''Student:''' Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + + +==== Improve Foreground Selection Tool ==== + +'''Mentor:''' Gerald Friedland +'''Student:''' Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + + +==== Proposal - Advanced GUI for brush dynamics (GIMP) ==== + +'''Mentor:''' Kaja Liiv +'''Student:''' Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + + +== Projects finished in GSoC 2008 == + +==== Improving the text-tool in GIMP ==== + +'''Mentor:''' Daniel Eddeland +'''Student:''' William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + + +==== Enhance Python Scripting Interface Experience ==== + +'''Mentor:''' João Sebastião de Oliveira Bueno +'''Student:''' Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + + +==== Tagging of GIMP Resources ==== + +'''Mentor:''' Aurimas Juska +'''Student:''' Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + + +==== Operations in Frequency Domain ==== + +'''Mentor: '''Øyvind Kolås +'''Student:''' Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + + +=== GSoC 2007 - GIMP wasn't accepted =( === + +== Projects finished in GSoC 2006 == + +==== JPEG2000 plug-in ==== + +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + + +==== Vector layers and tools to manipulate them ==== + +'''Mentor:''' Simon Budig +'''Student:''' Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + + +==== Ruby binding for GIMP scripting ==== + +'''Mentor:''' Kevin Cozens +'''Student:''' Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + + +==== Healing brush ==== + +'''Mentor:''' Manish Singh +'''Student:''' Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + + +==== Vanishing point cloning ==== + +'''Mentor:''' Manish Singh +'''Student:''' Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it + + \ No newline at end of file diff --git a/wiki/Hacking:GSOC%2FArchive-20140901141912-history.txt b/wiki/Hacking:GSOC%2FArchive-20140901141912-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:GSOC%2FArchive-20140901141912-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:GSOC%2FArchive-20140901145810-edit.txt b/wiki/Hacking:GSOC%2FArchive-20140901145810-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:GSOC%2FArchive-20140901145810-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:GSOC%2FArchive-20161024003038-edit.txt b/wiki/Hacking:GSOC%2FArchive-20161024003038-edit.txt new file mode 100644 index 0000000..8dafad4 --- /dev/null +++ b/wiki/Hacking:GSOC%2FArchive-20161024003038-edit.txt @@ -0,0 +1,431 @@ +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/web/20080225093418/wiki.gimp.org/gimp/SummerOfCode archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +In short, what is Google Summer of Code (GSoC)? + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months, to implement a specific feature. Each student is assigned a mentor which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). About 1000 students are accepted each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for students who are older than 18. For details about applications see [[Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + +__TOC__ + + + +== Projects in GSoC 2013 == + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + +Minimal Student Requirements: +* Good C knowledge +* basic GObject knowledge + + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL | Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + +Minimal Student Requirements: +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + +== Projects in GSoC 2012 == +==== Port missing GIMP features to GEGL ==== +Mentor: Mukund Sivaraman + +Student: Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + +==== Porting GEGL operations ==== +Mentor: Victor Oliviera + +Student: Hans Lo + +I am applying for the GEGL operation porting project. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + +==== Graphical Node Editor ==== +Mentor: Alexia Death + +Student: Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + +==== Unified Transformation Tool ==== +Mentor: Michael Natterer + +Student: Mikael Magnusson + +'''Category:''' Tools, User Interface + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + +== Projects in GSoC 2011 == + +==== Porting GIMP plugins to GEGL operations ==== +Mentor: Mukund Sivaraman + +Student: Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== OpenCL in GEGL ==== +Mentor: João S. O. Bueno + +Student: Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== Adaptive Cloning (aka Seamless cloning) ==== +Mentor: Michael Natterer + +Student: Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + +==== Replace GimpSizeEntry widget ==== +Mentor: Martin Nordholts + +Student: Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== Warp tool for GIMP ==== +Mentor: Alexia Death + +Student: Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + +== Projects in GSoC 2010 == + +==== HDR and matting operators for GEGL ==== +Mentor: Martin Nordholts + +Student: Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + +==== Cage-based deformation tool ==== +Mentor: Kaja Liiv + +Student: Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + +
      +
    • you "put" a closed polygon on the image (not limited to 4 handles)
    • +
    • you deform the cage, the image is deformed accordingly
    +==== Implement and add infrastructure for on-canvas tool drawing/options ==== +Mentor: Joao Bueno + +Student: Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +== Projects finished in GSoC 2009 == +==== Better nonlinear resampler with built-in antialiasing (GEGL) ==== +Mentor: Nicolas Robidoux + +Student: Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at http://gsoc.rivetsforbreakfast.com/enlargements.html. + +==== OpenGL GPU-based Buffer & Operations in GEGL ==== +Mentor: Martin Nordholts +Student: Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + +==== Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) ==== +Mentor: Nicolas Robidoux +Student: Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + +==== Improve Foreground Selection Tool ==== +Mentor: Gerald Friedland +Student: Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + +==== Proposal - Advanced GUI for brush dynamics (GIMP) ==== +Mentor: Kaja Liiv +Student: Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + +== Projects finished in GSoC 2008 == +==== Improving the text-tool in GIMP ==== +Mentor: Daniel Eddeland +Student: William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + +==== Enhance Python Scripting Interface Experience ==== +Mentor: João Sebastião de Oliveira Bueno +Student: Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + +==== Tagging of GIMP Resources ==== +Mentor: Aurimas Juska +Student: Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + +==== Operations in Frequency Domain ==== +Mentor: Øyvind Kolås +Student: Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + +=== GSoC 2007 - GIMP wasn't accepted =( === + +== Projects finished in GSoC 2006 == +==== JPEG2000 plug-in ==== +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + +==== Vector layers and tools to manipulate them ==== +Mentor: Simon Budig +Student: Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + +==== Ruby binding for GIMP scripting ==== +Mentor: Kevin Cozens +Student: Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + +==== Healing brush ==== +Mentor: Manish Singh +Student: Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + +==== Vanishing point cloning ==== +Mentor: Manish Singh +Student: Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it diff --git a/wiki/Hacking:GSOC%2FArchive-20210124015050-edit.txt b/wiki/Hacking:GSOC%2FArchive-20210124015050-edit.txt new file mode 100644 index 0000000..8dafad4 --- /dev/null +++ b/wiki/Hacking:GSOC%2FArchive-20210124015050-edit.txt @@ -0,0 +1,431 @@ +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/web/20080225093418/wiki.gimp.org/gimp/SummerOfCode archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +In short, what is Google Summer of Code (GSoC)? + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months, to implement a specific feature. Each student is assigned a mentor which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). About 1000 students are accepted each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for students who are older than 18. For details about applications see [[Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + +__TOC__ + + + +== Projects in GSoC 2013 == + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + +Minimal Student Requirements: +* Good C knowledge +* basic GObject knowledge + + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL | Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + +Minimal Student Requirements: +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + +== Projects in GSoC 2012 == +==== Port missing GIMP features to GEGL ==== +Mentor: Mukund Sivaraman + +Student: Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + +==== Porting GEGL operations ==== +Mentor: Victor Oliviera + +Student: Hans Lo + +I am applying for the GEGL operation porting project. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + +==== Graphical Node Editor ==== +Mentor: Alexia Death + +Student: Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + +==== Unified Transformation Tool ==== +Mentor: Michael Natterer + +Student: Mikael Magnusson + +'''Category:''' Tools, User Interface + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + +== Projects in GSoC 2011 == + +==== Porting GIMP plugins to GEGL operations ==== +Mentor: Mukund Sivaraman + +Student: Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== OpenCL in GEGL ==== +Mentor: João S. O. Bueno + +Student: Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== Adaptive Cloning (aka Seamless cloning) ==== +Mentor: Michael Natterer + +Student: Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + +==== Replace GimpSizeEntry widget ==== +Mentor: Martin Nordholts + +Student: Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== Warp tool for GIMP ==== +Mentor: Alexia Death + +Student: Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + +== Projects in GSoC 2010 == + +==== HDR and matting operators for GEGL ==== +Mentor: Martin Nordholts + +Student: Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + +==== Cage-based deformation tool ==== +Mentor: Kaja Liiv + +Student: Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + +
      +
    • you "put" a closed polygon on the image (not limited to 4 handles)
    • +
    • you deform the cage, the image is deformed accordingly
    +==== Implement and add infrastructure for on-canvas tool drawing/options ==== +Mentor: Joao Bueno + +Student: Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +== Projects finished in GSoC 2009 == +==== Better nonlinear resampler with built-in antialiasing (GEGL) ==== +Mentor: Nicolas Robidoux + +Student: Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at http://gsoc.rivetsforbreakfast.com/enlargements.html. + +==== OpenGL GPU-based Buffer & Operations in GEGL ==== +Mentor: Martin Nordholts +Student: Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + +==== Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) ==== +Mentor: Nicolas Robidoux +Student: Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + +==== Improve Foreground Selection Tool ==== +Mentor: Gerald Friedland +Student: Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + +==== Proposal - Advanced GUI for brush dynamics (GIMP) ==== +Mentor: Kaja Liiv +Student: Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + +== Projects finished in GSoC 2008 == +==== Improving the text-tool in GIMP ==== +Mentor: Daniel Eddeland +Student: William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + +==== Enhance Python Scripting Interface Experience ==== +Mentor: João Sebastião de Oliveira Bueno +Student: Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + +==== Tagging of GIMP Resources ==== +Mentor: Aurimas Juska +Student: Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + +==== Operations in Frequency Domain ==== +Mentor: Øyvind Kolås +Student: Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + +=== GSoC 2007 - GIMP wasn't accepted =( === + +== Projects finished in GSoC 2006 == +==== JPEG2000 plug-in ==== +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + +==== Vector layers and tools to manipulate them ==== +Mentor: Simon Budig +Student: Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + +==== Ruby binding for GIMP scripting ==== +Mentor: Kevin Cozens +Student: Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + +==== Healing brush ==== +Mentor: Manish Singh +Student: Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + +==== Vanishing point cloning ==== +Mentor: Manish Singh +Student: Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it diff --git a/wiki/Hacking:GSOC%2FArchive-20210513081836-edit.txt b/wiki/Hacking:GSOC%2FArchive-20210513081836-edit.txt new file mode 100644 index 0000000..8dafad4 --- /dev/null +++ b/wiki/Hacking:GSOC%2FArchive-20210513081836-edit.txt @@ -0,0 +1,431 @@ +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/web/20080225093418/wiki.gimp.org/gimp/SummerOfCode archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +In short, what is Google Summer of Code (GSoC)? + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months, to implement a specific feature. Each student is assigned a mentor which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). About 1000 students are accepted each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for students who are older than 18. For details about applications see [[Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + +__TOC__ + + + +== Projects in GSoC 2013 == + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + +Minimal Student Requirements: +* Good C knowledge +* basic GObject knowledge + + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL | Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + +Minimal Student Requirements: +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + +== Projects in GSoC 2012 == +==== Port missing GIMP features to GEGL ==== +Mentor: Mukund Sivaraman + +Student: Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + +==== Porting GEGL operations ==== +Mentor: Victor Oliviera + +Student: Hans Lo + +I am applying for the GEGL operation porting project. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + +==== Graphical Node Editor ==== +Mentor: Alexia Death + +Student: Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + +==== Unified Transformation Tool ==== +Mentor: Michael Natterer + +Student: Mikael Magnusson + +'''Category:''' Tools, User Interface + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + +== Projects in GSoC 2011 == + +==== Porting GIMP plugins to GEGL operations ==== +Mentor: Mukund Sivaraman + +Student: Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== OpenCL in GEGL ==== +Mentor: João S. O. Bueno + +Student: Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== Adaptive Cloning (aka Seamless cloning) ==== +Mentor: Michael Natterer + +Student: Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + +==== Replace GimpSizeEntry widget ==== +Mentor: Martin Nordholts + +Student: Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +==== Warp tool for GIMP ==== +Mentor: Alexia Death + +Student: Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + +== Projects in GSoC 2010 == + +==== HDR and matting operators for GEGL ==== +Mentor: Martin Nordholts + +Student: Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + +==== Cage-based deformation tool ==== +Mentor: Kaja Liiv + +Student: Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + +
      +
    • you "put" a closed polygon on the image (not limited to 4 handles)
    • +
    • you deform the cage, the image is deformed accordingly
    +==== Implement and add infrastructure for on-canvas tool drawing/options ==== +Mentor: Joao Bueno + +Student: Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +== Projects finished in GSoC 2009 == +==== Better nonlinear resampler with built-in antialiasing (GEGL) ==== +Mentor: Nicolas Robidoux + +Student: Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at http://gsoc.rivetsforbreakfast.com/enlargements.html. + +==== OpenGL GPU-based Buffer & Operations in GEGL ==== +Mentor: Martin Nordholts +Student: Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + +==== Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL) ==== +Mentor: Nicolas Robidoux +Student: Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + +==== Improve Foreground Selection Tool ==== +Mentor: Gerald Friedland +Student: Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + +==== Proposal - Advanced GUI for brush dynamics (GIMP) ==== +Mentor: Kaja Liiv +Student: Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + +== Projects finished in GSoC 2008 == +==== Improving the text-tool in GIMP ==== +Mentor: Daniel Eddeland +Student: William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + +==== Enhance Python Scripting Interface Experience ==== +Mentor: João Sebastião de Oliveira Bueno +Student: Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + +==== Tagging of GIMP Resources ==== +Mentor: Aurimas Juska +Student: Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + +==== Operations in Frequency Domain ==== +Mentor: Øyvind Kolås +Student: Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + +=== GSoC 2007 - GIMP wasn't accepted =( === + +== Projects finished in GSoC 2006 == +==== JPEG2000 plug-in ==== +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + +==== Vector layers and tools to manipulate them ==== +Mentor: Simon Budig +Student: Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + +==== Ruby binding for GIMP scripting ==== +Mentor: Kevin Cozens +Student: Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + +==== Healing brush ==== +Mentor: Manish Singh +Student: Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + +==== Vanishing point cloning ==== +Mentor: Manish Singh +Student: Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it diff --git a/wiki/Hacking:GSOC-20200923035123-edit.txt b/wiki/Hacking:GSOC-20200923035123-edit.txt new file mode 100644 index 0000000..6884845 --- /dev/null +++ b/wiki/Hacking:GSOC-20200923035123-edit.txt @@ -0,0 +1,38 @@ +GSoC is Google-s way of supporting open source. They offer to pay to students for work done in open source projects. As a rule GIMP participates in this project. This is true for 2011 as well. + +Take a look at: +* [[Hacking:GSoC/2013/Ideas]] - Ideas for GSoC 2013 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + +== How do participate == + +* '''Get GIMP''' +**At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* '''Introduce your project''' +**Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* '''Socialize and communicate''' +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* '''Get familiarized with GIMP and/or GEGL code''' +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) + +'''If you have done this, you are ready to file the application.''' + +People who haven't done the above don't have much of a chance of getting accepted. People who have done all this compete against each other for the limited resource of willing mentors and slots. + +== General student requirements for GIMP related GSoC == + +What we look for in a student is initiative, a strong understanding of either gimp or the project or both and '''communication'''. + +
      +
    • Knowledge and expirience of coding. C is the preferable language.
    • +
    • Experience with GTK+, glib and gobject is a plus
    • +
    • If you are implementing a graphical algorithm, then some knowledge of the algorithm, or at least about general computer graphics/image manipulation, is obvoiusly required
    + +== Recommended == +Ideas which are generally considered as good for GSoC this year, and are recommended for students. Note that students are strongly encouraged to come up with their own project - this list is not exhaustive. A submission to gsoc which is just a copy-and paste job of one of these suggestions is not likely to be accepted. + +'''Note about mentors:''' Some projects have mentors listed for them. These are projects where a specific mentor has already agreed to work with a student if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here will be accepted, a mentor will be assigned for them. + +'''Note about tasks:''' Some ideas here may already be claimed by a potential student. If a claim is listed here it's solid enough that, unless the person claiming it gives it up, it wont go to another. diff --git a/wiki/Hacking:GSOC_Archive-20151230115515-edit.txt b/wiki/Hacking:GSOC_Archive-20151230115515-edit.txt new file mode 100644 index 0000000..4096f75 --- /dev/null +++ b/wiki/Hacking:GSOC_Archive-20151230115515-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Hacking:GSOC/Archive]] diff --git a/wiki/Hacking:GSOC_Archive-20161225035744-show.txt b/wiki/Hacking:GSOC_Archive-20161225035744-show.txt new file mode 100644 index 0000000..8172a10 --- /dev/null +++ b/wiki/Hacking:GSOC_Archive-20161225035744-show.txt @@ -0,0 +1,520 @@ + + +This page lists old/new ideas for GSoC for GIMP. It's based on the [http://web.archive.org/ archived GIMP wiki GSoC page] and on the former offical GSoC pages for GIMP. + +'''''In short, what is Google Summer of Code (GSoC)?''''' + +From the official site: "Google Summer of Code is a global program that offers student developers stipends to write code for various open source software projects." Practically, this means that each year''' google selects about 150 open-source projects, and pays students 5000$ (USD) for working on the project for 3 months''', to implement a specific feature. '''Each student is assigned a mentor''' which will guide him through the process, but most of the work (if not all of it) will still be done by the student. Therefore, each open-source project decides on some requirements that students must fullfil in order to participate. Each year, the open-source applies for GSoC and when (and if) it's accepted then students may apply (students must fullfil the requirements of google and of the specific project). '''About 1000 students are accepted''' each year (since each open-source project may have several GSoC projects). + +More information can be found at the [http://code.google.com/soc/ GSoC site]. Note that participation is only allowed for ''students'' who are ''older than 18''. For details about applications see [[Hacking:GSOC|Hacking:GSOC‎]]. + +Obviously, this page exists here since GIMP applies for GSoC almost every year =) + + +__TOC__ + + + + + +==Projects in GSoC 2013== + +===Implement GEGL ops that GIMP needs (OpenCL ports)=== + +'''Mentor:''' Victor Oliviera (victorm) + +'''Student:''' Carlos Zubieta (zurwolf) + +'''Category:''' Plug-Ins/Scripts + +'''Status:''' finished + +'''Integration status: ''' work in progress + +The release of GIMP 2.10 is partially blocked by legacy plug-ins. Some of them have to be ported to GEGL operations, some can just work on GEGL buffers for now. For a list of plug-ins please refer to [[Hacking:Porting_filters_to_GEGL]]. +Since 2011 with the participation of Victor Oliveira at the GSoC, the “new” Gimp core library, GEGL has support for OpenCL. A lot of work has been done to give full OpenCL support to GEGL, but there still much more to do. Some of the laking OpenCL support parts are the GEGL operations. I propose to port to OpenCL the existing GEGL operations list on the wiki at the processing, color grading and effects section of the Porting filters to OpenCL page [1]. + + + +Minimal Student Requirements: + + +* Good C knowledge +* basic GObject knowledge + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2013/zurwolf/8001 GSoC page] +* [[Hacking:GSOC/Archive#OpenCL_in_GEGL| Victor Olivieras OpenCL GSoC 2011 project ]] +* Victor Olivieras presentation at LGM: [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* [http://gimp.markmail.org/search/gegl+OpenCL GIMP mailing list discussions (OpenCL)] +* [http://gimp.markmail.org/search/gegl+GPU GIMP mailing list discussions (GPU)] +* [http://gegl.markmail.org/search/OpenCL GEGL mailing list discussions (OpenCL)] +* [http://gegl.markmail.org/search/GPU GEGL mailing list discussions (GPU)] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-opecl-ops Repository branch] +* [http://wiki.gimp.org/index.php/Hacking:Porting_filters_to_GEGL GEGL and OpenCL porting matrix] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-opencl/lastBuild/console Last results] + + + + +===Implement the combined selection tool=== + +'''Mentor:''' Michael Natterer (mitch) + +'''Student:''' Ajay Ramanathan (Chinu) + +'''Category:''' Tools, User Interface + +'''Status:''' not finished + +'''Integration status: ''' not integrated + +This projects aim is to implement a unified selection tool that combines the functionality of the rectangle/ellipse selection tool, fuzzy select, select by color, foreground selection tool, free selection tool and intelligent scissors into three new tools, and is easier and faster to use. The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html an interaction design research] made by Voralberg students in 2010. + + + +Minimal Student Requirements: + + +* Good C knowledge +* Basic Gtk+/GObject knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/chinu_93/4001?ModPagespeed=noscript GSoC page] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool/blob/master/Documentation/Modified%20tools.md Specification Draft] +* [http://gimp.markmail.org/search/combined+selection GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-combined-selection-tool Repository branch] +* [https://github.com/AjayRamanathan/soc-2013-combined-selection-tool External project repository] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-combined-selection-tool/lastBuild/console Last results] + + + + +===Improve support for importing and exporting PSD files=== + +'''Mentor:''' Michael Schumacher (schumaml) + +'''Student:''' Simon Lui (Crystallis) + +'''Status:''' finished + +'''Integration status: ''' work in progress, see [https://mail.gnome.org/archives/gimp-developer-list/2014-February/msg00085.html call for testers and contributors] + +While existing PSD plug-in supports many essential features of the file format, fixing bugs and adding support for some missing features would make a rather useful GSoC project. + +Note that until non-destructive editing is at least designed for GIMP, it isn't possible to implement support for layer styles or adjustment layers. The code, however, should be ready for that. + +Additional work could involve (better) support for resources, such as: + + +* Photoshop gradients ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/grd/grd-spec.htm reverse-engineered]) +* Photoshop patterns (merge/adapt [http://registry.gimp.org/node/10879 existing PAT loader]) +* brush dynamics in ABR files ([https://gitorious.org/re-lab/graphics/blobs/raw/master/photoshop/abr/abr-spec.htm reverse-engineered]) + + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core) + + +See also + + +* [http://google-melange.appspot.com/gsoc/project/google/gsoc2013/crystallis/10001?ModPagespeed=noscript GSoC page] +* [http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ PSD specification] +* [https://bugzilla.gnome.org/buglist.cgi?quicksearch=product%3A%22GIMP%22+PSD PSD related bugs in GIMP] +* [http://gimp.markmail.org/search/PSD GIMP mailing list discussions] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-psd Repository branch] +* [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/ Continuous Integration site]: [https://gimptest.flamingtext.com:9090/view/GSoC%20projects/job/gimp-distcheck-soc-2013-psd/lastBuild/console Last results] + + + + +===n-Point Image Deformation Tool=== + +'''Mentor:''' Alexia Death (Alexia_Death) + +'''Student:''' Marek Dvorožňák (korek) + +'''Category:''' Tools + +'''Status:''' finished + +'''Integration status: ''' work in progress + +During image editing it's very useful to have a possibility to deform an image in a way so that it behaves like a real world object (or object made of a rubber). At present there are many image deformation methods allowing us to do that. Some of them are implemented as tools in various software - for example Puppet Warp in Photoshop. I propose to implement a method into GIMP which behaves similarly to these methods but is more intuitive (easier to use), more predictable and should be fast enough. + +See also + + +* [https://google-melange.appspot.com/gsoc/proposal/review/google/gsoc2013/dvoromar/1?ModPagespeed=noscript GSoC page] +* [http://wiki.gimp.org/index.php/Mindstorm:n-point_image_deformation_tool Description of features] +* [http://gui.gimp.org/index.php/Cage_tool Specification of the similar Cage Tool] +* [http://gimp-brainstorm.blogspot.de/2010/02/bend-in-curves.html GIMP UI brainstorm idea 'Bend in curves'] +* [http://gimp.markmail.org/search/deformation+tool GIMP mailing list discussions] +* [http://www.youtube.com/watch?v=k3gN6aZWc-8&feature=youtu.be Youtube demo video] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2013-n-point-deformation Repository branch (GEGL part)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2013-n-point-deformation-tool Repository branch (GIMP part)] +* [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GEGL part)]: [https://gimptest.flamingtext.com:9090/view/GEGL/job/gegl-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] +* [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/ Continuous Integration site (GIMP part)]: [https://gimptest.flamingtext.com:9090/view/GIMP/job/gimp-distcheck-soc-2013-n-point-deformation/lastBuild/console Last results] + + + + +==Projects in GSoC 2012== + +====Port missing GIMP features to GEGL==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Ville Sokk + +Working on recreating legacy GIMP features that are missing from GEGL. The aim is to help replace the existing GIMP image processing core with GEGL to bring better precision, more colour formats and better programmer flexibility to GIMP while keeping all the familiar GIMP features working as they are. + +See also the [http://www.google-melange.com/gsoc/project/google/gsoc2012/embassyhill/9001 GSoC page]. + +Integration status: work in progress + + +====Porting GEGL operations==== + +'''Mentor:''' Victor Oliviera + +'''Student:''' Hans Lo + +I am applying for the GEGL operation porting project. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/hansshulo/17002 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-ops GEGL-repository branch] + +Integration status: work in progress + + +====Graphical Node Editor==== + +'''Mentor:''' Alexia Death + +'''Student:''' Isaac Wagner + +It consists of two components. The first and largest component is the development of a fully-featured graphical node editor ("box and hose editor") which will sit on top of the GEGL public API and allow for fast sandboxing of GEGL operations for debugging, artistic, and showcase purposes. The editor will be similar to familiar editors such as Blenders shader editor and the MathMap1 editor. The second component of my proposal is to develop code for saving and loading meta-ops to and from XML (resolving bug 465743). This code will exist within the GEGL codebase and manifest itself as a component of the node editors interface. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/isaacbw/10001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2012-editor GEGL-repository branch] +* [https://git.gnome.org/browse/gegl-edit/ Project repository] + +To build the project yourself, you also need [https://git.gnome.org/browse/graph-gtk Graph-gtk]. + + +====Unified Transformation Tool==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Mikael Magnusson + +'''Category:''' Tools, User Interface + + + +Implement a unified transformation tool that combines the functionality of the rotate, shear, scale and perspective tools, and is easier and faster to use. + +Initial implementation is available in [http://cgit.mika.l3ib.org/cgit/gimp/log/?h=mika-topics/hack-perspective Mikael Magnusson's Git branch]. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2012/mikachu/10001 GSoC page]. +* [http://gui.gimp.org/index.php/Transformation_tool_specification Specification] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2012-unified-transformation Repository branch] + + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +==Projects in GSoC 2011== + +====Porting GIMP plugins to GEGL operations==== + +'''Mentor:''' Mukund Sivaraman + +'''Student:''' Robert Sasu + +The main point is to port GIMP plug-ins to GEGL, because GEGL API supports higher pixel depth, has a smart job and memory management, allows non-destructive editing. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 GSoC page] +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/robert_sasu/17001 Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====OpenCL in GEGL==== + +'''Mentor:''' João S. O. Bueno + +'''Student:''' Victor Oliveira + +The proposal is about making it possible to write GEGL operations in OpenCL. There are two tasks: + + +# Automatic memory management and migration of tiles from GPU to the CPU and the other way around. +# Make some GEGL operations in OpenCL. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=opencl-ops Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====Adaptive Cloning (aka Seamless cloning)==== + +'''Mentor:''' Michael Natterer + +'''Student:''' Barak Itkin + +Direct cloning of parts from one image to another, usually ends in bad results because of different lighting conditions and other settings (such as white-balance) which causes the color of the cloned part not to match the source image and look out of place. There are some techniques to solve this, by using poisson equations and some other methods. This suggestion allows a fast (realtime) solution for allowing to paste seamlessly parts from one image to another. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 GSoC page] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-seamless-clone GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone GIMP-repository branch (1)] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-seamless-clone2 GIMP-repository branch (2)] +* [http://www.youtube.com/watch?v=pqVMt-ReaDc A Youtube demo video] + +Integration status: work in progress. To be integrated in GIMP 2.10. + +Barak Itkin recently posted an update in [http://lightningismyname.blogspot.ru/2013/05/gimp-gsoc-2011-seamless-cloning-project.html his blog] to outline the changes to be made. + + +====Replace GimpSizeEntry widget==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Enrico Schröder + +The GimpSizeEntry widget in its current form, which is used across the user interface for entering values and their corresponding units (e.g. image dimensions, lengths, etc.), has a couple of issues both from a users and a developers standpoint. The project is to rewrite the widget being based on GtkEntry with the ability to directly enter and display the desired unit in the text field itself instead of in an external control. Simple mathematical terms for the input of values in different units will be possible using the existing parser (gimpeevl). + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GSoC page] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry Repository branch] + +Integration status: work in progress. To be integrated in GIMP 2.10. + + +====Warp tool for GIMP==== + +'''Mentor:''' Alexia Death + +'''Student:''' Michael Muré + +The goal is to implement a live on-canvas iWarp like tool. Behavior: The basic usecase of this tool would be: + +1. The user select the iwarp tool. Nothing is displayed on top of the image. + +2. If needed, the user select a particular behavior for the tool (drag,shrink, grow, whirl, pinch ..) + +3. The user do a stroke on the canvas. The image is updated accordingly. + +See also + + +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/michael_mure/5001 GSoC page] +* [http://gui.gimp.org/index.php/Warp_tool_specification Specification] +* [https://git.gnome.org/browse/gegl/log/?h=soc-2011-warp GEGL-repository branch] +* [https://git.gnome.org/browse/gimp/log/?h=soc-2011-warp GIMP-repository branch] + +Integration status: Integrated in GIMP 2.10. + + +==Projects in GSoC 2010== + +====HDR and matting operators for GEGL==== + +'''Mentor:''' Martin Nordholts + +'''Student:''' Danny Robson + +GEGL does not currently contain methods which assist in HDR workflows which have become quite popular. I propose to develop three native GEGL tone-mapping operations. + +I also propose to target an image matting operator, allowing the straightforward decomposition of an image into foreground and background components. I will implement the `matting laplacian'. + + +====Cage-based deformation tool==== + +'''Mentor:''' Kaja Liiv + +'''Student:''' Michael Mure + +Green Coordinates is a method allowing deformation of an image, by deforming the inside of a polyhedral cage. The technique was exposed in Siggraph 2008. Unlike the other classical method (mean value coordinates, harmonic coordinates, ..), it allows high quality deformation by preserving the shape. + +Basic behavior of the tool: + + +* you "put" a closed polygon on the image (not limited to 4 handles) +* you deform the cage, the image is deformed accordingly + +====Implement and add infrastructure for on-canvas tool drawing/options==== + +'''Mentor:''' Joao Bueno + +'''Student:''' Chen Yan + +The project is to implement and add infrastructure for on-canvas tool drawing/options. Gimp has many dockable dialogs. If some commonly used and simple interactions, with values and settings, can be presented, tracked, and modified directly on the image canvas, it would be very useful. It would save clicks and users' time. Reducing the number of opened dockable dialogs is advantageous, especially for Windows users, for many simple editing, drawing and options. + +
    + +==Projects finished in GSoC 2009== + +====Better nonlinear resampler with built-in antialiasing (GEGL)==== + +'''Mentor:''' Nicolas Robidoux + +'''Student:''' Adam Turcotte + +Port improvements to Nohalo Level 1 and port Snohalo Level 1 from VIPS to GEGL. Program Nohalo and Snohalo Levels 2 and 3 in demand-driven mode for GEGL with Dr. Robidoux. Test for bugs and optimize for speed. Merge the various methods so that levels are automatically chosen depending on requested quality level, and so Nohalo is selected instead of Snohalo when additional antialiasing is set to zero. Sample output images can be seen at [http://gsoc.rivetsforbreakfast.com/enlargements.html http://gsoc.rivetsforbreakfast.com/enlargements.html]. + + +====OpenGL GPU-based Buffer & Operations in GEGL==== + +'''Mentor:''' Martin Nordholts +'''Student:''' Jerson Michael Perpetua + +GEGL (Generic Graphics Library) is a new back-end to replace GIMP's old code for handling various image processing tasks. + +GPUs nowadays are capable of massively accelerating graphics tasks, there is an ongoing movement to harness this power in general computing. However, because of the nature of GPU parallelization, not all code can be executed in the GPU. GEGL's architecture of pixel operations yields itself to GPU parallelization, making it a good candidate for GPU acceleration. + + +====Fast Adaptive Resampler Tailored For Transformations Which Mostly Downsample (GEGL)==== + +'''Mentor:''' Nicolas Robidoux +'''Student:''' Eric Daoust + +I am proposing to implement better and faster downsampling and resampling in GEGL + + +====Improve Foreground Selection Tool==== + +'''Mentor:''' Gerald Friedland +'''Student:''' Jie Ding + +SIOX is the algorithm underlying GIMP's foreground selection. In current version, a pixel is either foreground or background. A Detail Refinement Brush will be offered to the user as a simple interactive drawing tool, with which the foreground selection could implement a soft segmentation. It would improve the performance of the tool for areas where background and foregound overlap, such as in fine-grained, highly-textured, or semi-transparent objects like hair, clouds, or iced objects. + + +====Proposal - Advanced GUI for brush dynamics (GIMP)==== + +'''Mentor:''' Kaja Liiv +'''Student:''' Zhenfeng Zhao + +This proposal presents the plan and goals to the project “Advanced GUI for brush dynamics”, and how my experience fits. With my graduate studies in image processing, and being Lead Developer of a local company (3-patent image manipulation R&D) I had outstanding skills and experiences. I am proficient in C, understand the tasks, and enjoy working virtually. + + +==Projects finished in GSoC 2008== + +====Improving the text-tool in GIMP==== + +'''Mentor:''' Daniel Eddeland +'''Student:''' William Skaggs + +"Although the text-tool in GIMP works right now, it could be even better and more convenient with more functionality. When editing text you type the text in a dialog instead of on the canvas itself. I found "on-canvas text editing" as one of the ideas listed on the GIMP GSoC ideas page, and thought it would be a good idea to implement, as it would make the text tool more ergonomic and also look a little better (less dialogs to keep track off = cleaner interface)." + + +====Enhance Python Scripting Interface Experience==== + +'''Mentor:''' João Sebastião de Oliveira Bueno +'''Student:''' Lars-Peter Clausen + +"The overall goal of this project is to enhance the python scripting interface experience for The GIMP. + +As part of this I'll creating binding for gimp objects and widgets that haven't a binding yet but would be useful to have in python scripts. I'll also in collaboration with the community identify other missing or nice to have aspects in the python scripting interface and then try add them." + + +====Tagging of GIMP Resources==== + +'''Mentor:''' Aurimas Juska +'''Student:''' Sven Neumann + +"Currently resources such as brushes, gradients, etc are presented to the user in a single list without a possibility to organize them in any way. This makes it impossible to deal with large number of resources efficiently, thus making the GIMP less attractive for both professional and casual users. + +Adding tags to resources is natural and convenient way for users to organize their collection of resources so they could quickly find the ones they want for the specific task and create their own collections easily." + + +====Operations in Frequency Domain==== + +'''Mentor: '''Øyvind Kolås +'''Student:''' Zhang Junbo + +"Many of the image processing operations in the spatial domain are very difficult or even impossible, but in the frequency domain it may be quite simple. But GEGL, the new framework of GIMP, has not support operations in frequency domain yet. Therefore, a collection of operations in frequency domain for GEGL is urgently needed. + +A good framework has been provided in GEGL. Operations(plug-ins) in frequency domain could be implemented modularly." + + +===GSoC 2007 - GIMP wasn't accepted =(=== + +==Projects finished in GSoC 2006== + +====JPEG2000 plug-in==== + +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example JPEG 2000. + + +====Vector layers and tools to manipulate them==== + +'''Mentor:''' Simon Budig +'''Student:''' Hendrik Boom + +Have Vector layers that are connected to (multiple) vectors objects (think paths) and get re-rendered when the vectors change. Make it possible to attach styles to the vectors and maybe add different types of vector shapes (rectangles, ellipses...). Make all this usable... + + +====Ruby binding for GIMP scripting==== + +'''Mentor:''' Kevin Cozens +'''Student:''' Scott Lembcke + +Ruby is an object-oriented language that is driven by the „principle of least surprise“ - it tries to avoid all the pitfalls and caveats other languages have. There is an ancient version of a GIMP binding, it would be interesting to have it resurrected (with as little undead side effects as possible + + +====Healing brush==== + +'''Mentor:''' Manish Singh +'''Student:''' Kevin Sookocheff + +Removing freckles or other spots from skin can be tedious - the clone tool helps, but sometimes it is hard to find the right spot to clone from. A "healing brush", as it is named in other programs, removes the spots by e.g. averaging the surrounding area; other approaches are possible as well. + + +====Vanishing point cloning==== + +'''Mentor:''' Manish Singh +'''Student:''' Pedro Alonso + +Photoshop got an interesting tool recently - similar to clone, but it applies a perspective transform to the texture. Think about changing or "repairing" a tiled floor of a hallway on a photo - it is easy to create a flat tile texture, but it has to be transformed correctly when applying it + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%22011%2Ideas-20161225100135-show.txt b/wiki/Hacking:GSoC%22011%2Ideas-20161225100135-show.txt new file mode 100644 index 0000000..651ef19 --- /dev/null +++ b/wiki/Hacking:GSoC%22011%2Ideas-20161225100135-show.txt @@ -0,0 +1,238 @@ + +'''WORK IN PROGRESS!''' + +This page is the official ideas list for GIMP (and GEGL's) application to Google Summer of Code 2011. + +GIMP is the Gnu Image Manipulation Program, and GEGL is a Graph based Image Processing Library. GEGL is being designed (mainly, but not only) to be GIMP's new core which will allow better parallelism, better memory management, non-destructive editing and higher bit depths. + +For more GEGL ideas, see [http://gegl.org/contribute.html http://gegl.org/contribute.html] + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC|Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at: [http://www.google-melange.com/document/show/gsoc_program/google/gsoc2011/timeline http://www.google-melange.com/document/show/gsoc_program/google/gsoc2011/timeline] + + +__TOC__ + +==Recommended== + +Ideas which are generally considered as good for GSoC this year, and are recommended for students. + +'''Note about mentors:''' some projects have mentors listed for them - these are projects where a specific mentor already agreed to take if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here, will be accepted, a mentor will be assigned for them. + + +===Replace the GimpSizeEntry widget=== + +'''Category:''' User Interface + +'''Potential Mentor:''' Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box. Right now the value and the unit are displayed in different fields - one in a combobox and one in a regular text entry. Doing things like 50px*3+3cm should be possible - that requires adding basic logic for math (which partially exists now) and merging the unit smartly into the text entry with the value. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Porting GIMP plugins to GEGL operations=== + +'''Category:''' Plug-Ins + +'''Potential Mentor:''' Mukund Sivaraman + +In short: There are many many GIMP plugins that would need eventually to be converted to GEGL operations, if we want to use them in future versions of GIMP. + +GIMP is being ported to use a new image processing core called [http://gegl.org/ GEGL], a graph based image processing library, which allows non-destructive editing, higher bit depths, smart job managements and memory management, and much more. Unfortunatly, GIMP's plugins use GIMP's own existing API which is not compatiable with GEGL's api for design reasons. Therefore, at least the core plugins should be ported to GEGL, which means porting the image processing logic and doing some adaptions to the logic. + +This is a very large undertaking as there are a large number of GIMP plug-ins, each doing something entirely different from another. Porting each plug-in is a relatively simple and straightforward task, but it requires a good command over the C language and ability to review and understand unelegant code. + +As this is a large task, this could be sub-divided into smaller tasks to be taken up by more than one student: each student ports 6-10 plug-ins to GEGL ops during the summer. + + +* We want to see a demonstration of the student's ability to review C code in the context of the GIMP plug-ins. +* The student should be able to work with computer graphics code. Most of the code in the plug-ins directory is raster graphics related with a bit of computational geometry. +* As part of this task, some of the plug-in code may have to be entirely rewritten. But this could be smaller and simpler in many cases than the existing GIMP plug-ins code, as GEGL ops are written using floating point in a well-defined colorspace. +* The student's work will include coding, writing testcases, profiling and optimizing performance, and checking for bugs. +* We are looking for students who are committed to finish their work and communicate eagerly with their mentor. We will assist as much as we can. Though the student is expected to have a background in C programming, we will teach the student how to use various programming tools if necessary. +* The student is asked to subscribe to [https://lists.xcf.berkeley.edu/mailman/listinfo/gimp-developer gimp-developer mailing list] and send the following: +** Your background as it applies to this task (please don't send any personal information) +** A code review and algorithm description of the following GIMP plug-ins: cubism, fractal trace, plasma. Extra points for cartoon and photocopy. +** A code review and algorithm description of the following GEGL op: gaussian blur +** Sample implementation of a new GEGL op. This could be anything of your choice, even Hello World. Please send it as a patch against GEGL master branch. +** Your background as it applies to this task (please don't send any personal information) +** A code review and algorithm description of the following GIMP plug-ins: cubism, fractal trace, plasma. Extra points for cartoon and photocopy. +** A code review and algorithm description of the following GEGL op: gaussian blur +** Sample implementation of a new GEGL op. This could be anything of your choice, even Hello World. Please send it as a patch against GEGL master branch. +* Your background as it applies to this task (please don't send any personal information) +* A code review and algorithm description of the following GIMP plug-ins: cubism, fractal trace, plasma. Extra points for cartoon and photocopy. +* A code review and algorithm description of the following GEGL op: gaussian blur +* Sample implementation of a new GEGL op. This could be anything of your choice, even Hello World. Please send it as a patch against GEGL master branch. + +If you need any help with any of these tasks, please ask on the gimp-developer mailing list, or in the #gimp channel on irc.gimp.org. + + +===Implement the free transform tool=== + +'''Category:''' Tools, User Interface + +The free-transform tool should a all-in-one transformation tool that will allow fast and easy transformation of images, with all kinds of affine transformations at once. For exact specifications, reasons which make this tool needed and more, see: [http://gui.gimp.org/index.php/Transformation_tool_specification http://gui.gimp.org/index.php/Transformation_tool_specification] + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Dynamically resized layers=== + +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===Support writing JavaScript plug-ins=== + +'''Category:''' Plug-Ins/Scripts + +'''Potential Mentor:''' Kevin Cozens(?) + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are current the most powerful ones. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. +It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: + + +* Good C knowledge +* Good JavaScript knowledge +* Good gObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + +===Brush selector widget=== + +'''Category:''' Tools, User-Interface + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +When you want to try a brush right now, you go to the canvas, paint on it, and undo that. No need to explain how wrong this is, both for user experience and for productivity. Right now we have options to adjust the size/aspect-ration (strech)/angle/color and some more parameters, which are not shown in the default brush thumbnail preview. + +We need to create a widget that previews a brush after applying all of these parameters. We may also want to consider including the "Brush Dynamics" in the preview; "Brush Dynamics" allow mapping parameteres such as speed, tablet pressure/title, velocity and more, to every painting parameter - this allow to simulate many kinds of painting. This should probably be included in the preview by showing a brush stroke which brings all these effects into consideration. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Slicing tool=== + +'''Potential mentor:''' João S. O. Bueno + +'''Category:''' Tools, User-Interface + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: + +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: + +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +===IWarp tool (aka Liquify)=== + +'''Category:''' Tools + +GIMP has a plugin with a small preview which allows to whirl/pinch/grow/shrink parts of the image. We want to create a live on-canvas tool for that operation, like the rest of the core tools. + +For details about the original plugin, see [http://docs.gimp.org/2.6/en/plug-in-iwarp.html http://docs.gimp.org/2.6/en/plug-in-iwarp.html] + +In order to implement this, in a way that will match the upcoming changes in the core, it will be implemented using a GEGL operation which does the actual image transformation. A big part of the infrastructure for a GEGL based tool, was written in the previous Google Summer of Code in which a cage transformation tool was implemented using a GEGL operation. + +Minimal Student Requirements: + + +* Good C knowledge +* Basic knowledge in image manipulation and/or filtering + + + + +===Adaptive Image Cloning (aka Seamless Cloning)=== + +'''Category:''' Tools + +'''Potential Mentor:''' Michael Natterer + +Direct cloning of parts from one image to another, usually ends in bad +results because of different lighting conditions and other settings +(such as white-balance) which causes the color of the cloned part not +to match the source image and look out of place. There are some +techniques to solve this, by using poisson equations and some other +methods. + +It differs from the existing heal tool, since it is meant for taking +one area from an image, and paste it smoothly in some other area. The +current algorithm implemented by the healing tool allows to remove +local irregularities (such as dots, hairs, etc.) very well, but +experiments of using it to do "adaptive cloning" of areas (for example +copying a person from one image to the other) do not produce good +results. + +Minimal Student Requirements: + + +* Good C knowledge +* Basic knowledge in image manipulation and/or filtering + +See [http://www.cs.huji.ac.il/~danix/mvclone/ http://www.cs.huji.ac.il/~danix/mvclone/] diff --git a/wiki/Hacking:GSoC%22014%2Ideas-20210818113443-show.txt b/wiki/Hacking:GSoC%22014%2Ideas-20210818113443-show.txt new file mode 100644 index 0000000..a75ebfa --- /dev/null +++ b/wiki/Hacking:GSoC%22014%2Ideas-20210818113443-show.txt @@ -0,0 +1,97 @@ + + +For this year's Google Summer of Code program we are deliberately focusing on core features with little-to-zero involvement of programming user interfaces. Here are some project ideas to get inspired from. + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC|Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at [http://www.google-melange.com/gsoc/events/google/gsoc2015 http://www.google-melange.com/gsoc/events/google/gsoc2015]. + + +__TOC__ + +=Improve on-canvas interaction for editing tools and selected GEGL operations= + +With upcoming v2.10, GIMP is moving towards tools that rely more on on-canvas interaction and less on numeric inputs. However there is a lot of room for further improvements. + +One such case is feathering which used to make smooth rather than sharp selections. Currently GIMP doesn't visualize the feathering of a selection, hence understanding its impact is only done by trial and error. GIMP needs an on-canvas cue to show exactly where the feathering ends and provide a simple control to drag for adjusting that feathering value visually. Both cue and control should be available for all selection tools. + +Another example is providing better user experience for creative image manipulation. Right now in GIMP most GEGL operations are controlled numerically from a floating dialog with various settings. However some of these operations would benefit from having on-canvas controls to help users make direct visual decisions on adjustment of the content. The on-canvas widgets would complement rather than replace numeric input to preserve the ability to make precise adjustments. + +Here are some examples: + + +* '''Vignette''' operation could have on-canvas ellipse-shaped (or rectangle-shaped — depending on custom settings) widgets to control size and softness of the darkening effect (see [http://www.darktable.org/usermanual/ch03s04s05.html.php darktable] for a reference); +* '''Lighting Effects''' operation (the [http://docs.gimp.org/2.8/en/plug-in-lighting.html existing filter] is yet to be ported to GEGL) could have on-canvas widgets to show where the light should fall on, and what the distance from the source of the light is. +* '''Motion Blur''' operations could have draggable on-canvas controls for setting the center of the blur and the angle. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) and basic Cairo programming. + +=Completing the GEGL port= + +One of the primary reasons why GIMP 2.10 hasn't been released yet is that file plugins (loaders/exporter) have to be ported to GEGL and GIO. Focusing a GSoC project on either of those tasks would immensely benefit the project. + +Please refer to the [[Hacking:Porting_file_plugins_to_GEGL_and_GIO]] page for status of file plugins. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with GIO + +=Improving GIMP for VFX and production of movies= + +Thanks to Mukund Sivamaran, GIMP 2.10 will be shipping with a very basic OpenEXR loader. But much more could be done: + + +* adding more user-accessible settings for the importer of EXR: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* exposure and gamma (reusable GEGL op is ready) +* un-premultiply option +* reading layers +* writing the currently missing code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* format and type +* compression +* handling alpha channel +* storage type +* image region +* exporting layers +* adding support for OpenEXR v2 specific features + +Additionally it would be useful to lay the foundation for [http://opencolorio.org/ OpenColorIO] support as complementary to LittleCMS-based color management support. OCIO is commonly used in the VFX industry. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=Name your own idea= + +We are looking for students who are passionate about GIMP and, therefore, have a good understanding of what it's capable of and what it's sorely missing. Therefore, we are mostly interested in working with students who can come up with a project idea of their own that matches GIMP's [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision product vision]. + +It could be implementing interesting new image processing algorithms or improving support for various file formats. Have a look at a [http://wiki.gimp.org/index.php/Hacking:GSoC/Future/Ideas past GSoC ideas list] for inspiration, think of what you really want GIMP to be able to do, figure out if you have the skills and the stamina to make it real, then talk to us. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%22015%2Ideas-20161023235701-show.txt b/wiki/Hacking:GSoC%22015%2Ideas-20161023235701-show.txt new file mode 100644 index 0000000..a75ebfa --- /dev/null +++ b/wiki/Hacking:GSoC%22015%2Ideas-20161023235701-show.txt @@ -0,0 +1,97 @@ + + +For this year's Google Summer of Code program we are deliberately focusing on core features with little-to-zero involvement of programming user interfaces. Here are some project ideas to get inspired from. + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC|Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at [http://www.google-melange.com/gsoc/events/google/gsoc2015 http://www.google-melange.com/gsoc/events/google/gsoc2015]. + + +__TOC__ + +=Improve on-canvas interaction for editing tools and selected GEGL operations= + +With upcoming v2.10, GIMP is moving towards tools that rely more on on-canvas interaction and less on numeric inputs. However there is a lot of room for further improvements. + +One such case is feathering which used to make smooth rather than sharp selections. Currently GIMP doesn't visualize the feathering of a selection, hence understanding its impact is only done by trial and error. GIMP needs an on-canvas cue to show exactly where the feathering ends and provide a simple control to drag for adjusting that feathering value visually. Both cue and control should be available for all selection tools. + +Another example is providing better user experience for creative image manipulation. Right now in GIMP most GEGL operations are controlled numerically from a floating dialog with various settings. However some of these operations would benefit from having on-canvas controls to help users make direct visual decisions on adjustment of the content. The on-canvas widgets would complement rather than replace numeric input to preserve the ability to make precise adjustments. + +Here are some examples: + + +* '''Vignette''' operation could have on-canvas ellipse-shaped (or rectangle-shaped — depending on custom settings) widgets to control size and softness of the darkening effect (see [http://www.darktable.org/usermanual/ch03s04s05.html.php darktable] for a reference); +* '''Lighting Effects''' operation (the [http://docs.gimp.org/2.8/en/plug-in-lighting.html existing filter] is yet to be ported to GEGL) could have on-canvas widgets to show where the light should fall on, and what the distance from the source of the light is. +* '''Motion Blur''' operations could have draggable on-canvas controls for setting the center of the blur and the angle. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) and basic Cairo programming. + +=Completing the GEGL port= + +One of the primary reasons why GIMP 2.10 hasn't been released yet is that file plugins (loaders/exporter) have to be ported to GEGL and GIO. Focusing a GSoC project on either of those tasks would immensely benefit the project. + +Please refer to the [[Hacking:Porting_file_plugins_to_GEGL_and_GIO]] page for status of file plugins. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with GIO + +=Improving GIMP for VFX and production of movies= + +Thanks to Mukund Sivamaran, GIMP 2.10 will be shipping with a very basic OpenEXR loader. But much more could be done: + + +* adding more user-accessible settings for the importer of EXR: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* exposure and gamma (reusable GEGL op is ready) +* un-premultiply option +* reading layers +* writing the currently missing code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* format and type +* compression +* handling alpha channel +* storage type +* image region +* exporting layers +* adding support for OpenEXR v2 specific features + +Additionally it would be useful to lay the foundation for [http://opencolorio.org/ OpenColorIO] support as complementary to LittleCMS-based color management support. OCIO is commonly used in the VFX industry. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=Name your own idea= + +We are looking for students who are passionate about GIMP and, therefore, have a good understanding of what it's capable of and what it's sorely missing. Therefore, we are mostly interested in working with students who can come up with a project idea of their own that matches GIMP's [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision product vision]. + +It could be implementing interesting new image processing algorithms or improving support for various file formats. Have a look at a [http://wiki.gimp.org/index.php/Hacking:GSoC/Future/Ideas past GSoC ideas list] for inspiration, think of what you really want GIMP to be able to do, figure out if you have the skills and the stamina to make it real, then talk to us. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2F2011%2FIdeas-20161225102144-edit.txt b/wiki/Hacking:GSoC%2F2011%2FIdeas-20161225102144-edit.txt new file mode 100644 index 0000000..8a74d05 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2011%2FIdeas-20161225102144-edit.txt @@ -0,0 +1,198 @@ +'''WORK IN PROGRESS!''' + +This page is the official ideas list for GIMP (and GEGL's) application to Google Summer of Code 2011. + +GIMP is the Gnu Image Manipulation Program, and GEGL is a Graph based Image Processing Library. GEGL is being designed (mainly, but not only) to be GIMP's new core which will allow better parallelism, better memory management, non-destructive editing and higher bit depths. + +For more GEGL ideas, see http://gegl.org/contribute.html + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at: http://www.google-melange.com/document/show/gsoc_program/google/gsoc2011/timeline +__TOC__ + +==Recommended== +Ideas which are generally considered as good for GSoC this year, and are recommended for students. + +'''Note about mentors:''' some projects have mentors listed for them - these are projects where a specific mentor already agreed to take if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here, will be accepted, a mentor will be assigned for them. + +===Replace the GimpSizeEntry widget=== + +'''Category:''' User Interface + +'''Potential Mentor:''' Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box. Right now the value and the unit are displayed in different fields - one in a combobox and one in a regular text entry. Doing things like 50px*3+3cm should be possible - that requires adding basic logic for math (which partially exists now) and merging the unit smartly into the text entry with the value. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Porting GIMP plugins to GEGL operations=== + +'''Category:''' Plug-Ins + +'''Potential Mentor:''' Mukund Sivaraman + +In short: There are many many GIMP plugins that would need eventually to be converted to GEGL operations, if we want to use them in future versions of GIMP. + +GIMP is being ported to use a new image processing core called [http://gegl.org/ GEGL], a graph based image processing library, which allows non-destructive editing, higher bit depths, smart job managements and memory management, and much more. Unfortunatly, GIMP's plugins use GIMP's own existing API which is not compatiable with GEGL's api for design reasons. Therefore, at least the core plugins should be ported to GEGL, which means porting the image processing logic and doing some adaptions to the logic. + +This is a very large undertaking as there are a large number of GIMP plug-ins, each doing something entirely different from another. Porting each plug-in is a relatively simple and straightforward task, but it requires a good command over the C language and ability to review and understand unelegant code. + +As this is a large task, this could be sub-divided into smaller tasks to be taken up by more than one student: each student ports 6-10 plug-ins to GEGL ops during the summer. + +* We want to see a demonstration of the student's ability to review C code in the context of the GIMP plug-ins. +* The student should be able to work with computer graphics code. Most of the code in the plug-ins directory is raster graphics related with a bit of computational geometry. +* As part of this task, some of the plug-in code may have to be entirely rewritten. But this could be smaller and simpler in many cases than the existing GIMP plug-ins code, as GEGL ops are written using floating point in a well-defined colorspace. +* The student's work will include coding, writing testcases, profiling and optimizing performance, and checking for bugs. +* We are looking for students who are committed to finish their work and communicate eagerly with their mentor. We will assist as much as we can. Though the student is expected to have a background in C programming, we will teach the student how to use various programming tools if necessary. +* The student is asked to subscribe to [https://lists.xcf.berkeley.edu/mailman/listinfo/gimp-developer gimp-developer mailing list] and send the following: +** Your background as it applies to this task (please don't send any personal information) +** A code review and algorithm description of the following GIMP plug-ins: cubism, fractal trace, plasma. Extra points for cartoon and photocopy. +** A code review and algorithm description of the following GEGL op: gaussian blur +** Sample implementation of a new GEGL op. This could be anything of your choice, even Hello World. Please send it as a patch against GEGL master branch. + +If you need any help with any of these tasks, please ask on the gimp-developer mailing list, or in the #gimp channel on irc.gimp.org. + +===Implement the free transform tool=== +'''Category:''' Tools, User Interface + +The free-transform tool should a all-in-one transformation tool that will allow fast and easy transformation of images, with all kinds of affine transformations at once. For exact specifications, reasons which make this tool needed and more, see: http://gui.gimp.org/index.php/Transformation_tool_specification + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Dynamically resized layers=== +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===Support writing JavaScript plug-ins=== +'''Category:''' Plug-Ins/Scripts + +'''Potential Mentor:''' Kevin Cozens(?) + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are current the most powerful ones. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. +It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: +* Good C knowledge +* Good JavaScript knowledge +* Good gObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + +===Brush selector widget=== + +'''Category:''' Tools, User-Interface + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +When you want to try a brush right now, you go to the canvas, paint on it, and undo that. No need to explain how wrong this is, both for user experience and for productivity. Right now we have options to adjust the size/aspect-ration (strech)/angle/color and some more parameters, which are not shown in the default brush thumbnail preview. + +We need to create a widget that previews a brush after applying all of these parameters. We may also want to consider including the "Brush Dynamics" in the preview; "Brush Dynamics" allow mapping parameteres such as speed, tablet pressure/title, velocity and more, to every painting parameter - this allow to simulate many kinds of painting. This should probably be included in the preview by showing a brush stroke which brings all these effects into consideration. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Slicing tool=== +'''Potential mentor:''' João S. O. Bueno + +'''Category:''' Tools, User-Interface + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +===IWarp tool (aka Liquify)=== + +'''Category:''' Tools + +GIMP has a plugin with a small preview which allows to whirl/pinch/grow/shrink parts of the image. We want to create a live on-canvas tool for that operation, like the rest of the core tools. + +For details about the original plugin, see http://docs.gimp.org/2.6/en/plug-in-iwarp.html + +In order to implement this, in a way that will match the upcoming changes in the core, it will be implemented using a GEGL operation which does the actual image transformation. A big part of the infrastructure for a GEGL based tool, was written in the previous Google Summer of Code in which a cage transformation tool was implemented using a GEGL operation. + +Minimal Student Requirements: +* Good C knowledge +* Basic knowledge in image manipulation and/or filtering + + +===Adaptive Image Cloning (aka Seamless Cloning)=== +'''Category:''' Tools + +'''Potential Mentor:''' Michael Natterer + +Direct cloning of parts from one image to another, usually ends in bad +results because of different lighting conditions and other settings +(such as white-balance) which causes the color of the cloned part not +to match the source image and look out of place. There are some +techniques to solve this, by using poisson equations and some other +methods. + +It differs from the existing heal tool, since it is meant for taking +one area from an image, and paste it smoothly in some other area. The +current algorithm implemented by the healing tool allows to remove +local irregularities (such as dots, hairs, etc.) very well, but +experiments of using it to do "adaptive cloning" of areas (for example +copying a person from one image to the other) do not produce good +results. + +Minimal Student Requirements: +* Good C knowledge +* Basic knowledge in image manipulation and/or filtering + +See http://www.cs.huji.ac.il/~danix/mvclone/ diff --git a/wiki/Hacking:GSoC%2F2011%2FIdeas-20210124020722-edit.txt b/wiki/Hacking:GSoC%2F2011%2FIdeas-20210124020722-edit.txt new file mode 100644 index 0000000..8a74d05 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2011%2FIdeas-20210124020722-edit.txt @@ -0,0 +1,198 @@ +'''WORK IN PROGRESS!''' + +This page is the official ideas list for GIMP (and GEGL's) application to Google Summer of Code 2011. + +GIMP is the Gnu Image Manipulation Program, and GEGL is a Graph based Image Processing Library. GEGL is being designed (mainly, but not only) to be GIMP's new core which will allow better parallelism, better memory management, non-destructive editing and higher bit depths. + +For more GEGL ideas, see http://gegl.org/contribute.html + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at: http://www.google-melange.com/document/show/gsoc_program/google/gsoc2011/timeline +__TOC__ + +==Recommended== +Ideas which are generally considered as good for GSoC this year, and are recommended for students. + +'''Note about mentors:''' some projects have mentors listed for them - these are projects where a specific mentor already agreed to take if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here, will be accepted, a mentor will be assigned for them. + +===Replace the GimpSizeEntry widget=== + +'''Category:''' User Interface + +'''Potential Mentor:''' Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box. Right now the value and the unit are displayed in different fields - one in a combobox and one in a regular text entry. Doing things like 50px*3+3cm should be possible - that requires adding basic logic for math (which partially exists now) and merging the unit smartly into the text entry with the value. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Porting GIMP plugins to GEGL operations=== + +'''Category:''' Plug-Ins + +'''Potential Mentor:''' Mukund Sivaraman + +In short: There are many many GIMP plugins that would need eventually to be converted to GEGL operations, if we want to use them in future versions of GIMP. + +GIMP is being ported to use a new image processing core called [http://gegl.org/ GEGL], a graph based image processing library, which allows non-destructive editing, higher bit depths, smart job managements and memory management, and much more. Unfortunatly, GIMP's plugins use GIMP's own existing API which is not compatiable with GEGL's api for design reasons. Therefore, at least the core plugins should be ported to GEGL, which means porting the image processing logic and doing some adaptions to the logic. + +This is a very large undertaking as there are a large number of GIMP plug-ins, each doing something entirely different from another. Porting each plug-in is a relatively simple and straightforward task, but it requires a good command over the C language and ability to review and understand unelegant code. + +As this is a large task, this could be sub-divided into smaller tasks to be taken up by more than one student: each student ports 6-10 plug-ins to GEGL ops during the summer. + +* We want to see a demonstration of the student's ability to review C code in the context of the GIMP plug-ins. +* The student should be able to work with computer graphics code. Most of the code in the plug-ins directory is raster graphics related with a bit of computational geometry. +* As part of this task, some of the plug-in code may have to be entirely rewritten. But this could be smaller and simpler in many cases than the existing GIMP plug-ins code, as GEGL ops are written using floating point in a well-defined colorspace. +* The student's work will include coding, writing testcases, profiling and optimizing performance, and checking for bugs. +* We are looking for students who are committed to finish their work and communicate eagerly with their mentor. We will assist as much as we can. Though the student is expected to have a background in C programming, we will teach the student how to use various programming tools if necessary. +* The student is asked to subscribe to [https://lists.xcf.berkeley.edu/mailman/listinfo/gimp-developer gimp-developer mailing list] and send the following: +** Your background as it applies to this task (please don't send any personal information) +** A code review and algorithm description of the following GIMP plug-ins: cubism, fractal trace, plasma. Extra points for cartoon and photocopy. +** A code review and algorithm description of the following GEGL op: gaussian blur +** Sample implementation of a new GEGL op. This could be anything of your choice, even Hello World. Please send it as a patch against GEGL master branch. + +If you need any help with any of these tasks, please ask on the gimp-developer mailing list, or in the #gimp channel on irc.gimp.org. + +===Implement the free transform tool=== +'''Category:''' Tools, User Interface + +The free-transform tool should a all-in-one transformation tool that will allow fast and easy transformation of images, with all kinds of affine transformations at once. For exact specifications, reasons which make this tool needed and more, see: http://gui.gimp.org/index.php/Transformation_tool_specification + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Dynamically resized layers=== +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===Support writing JavaScript plug-ins=== +'''Category:''' Plug-Ins/Scripts + +'''Potential Mentor:''' Kevin Cozens(?) + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are current the most powerful ones. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. +It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: +* Good C knowledge +* Good JavaScript knowledge +* Good gObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + +===Brush selector widget=== + +'''Category:''' Tools, User-Interface + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +When you want to try a brush right now, you go to the canvas, paint on it, and undo that. No need to explain how wrong this is, both for user experience and for productivity. Right now we have options to adjust the size/aspect-ration (strech)/angle/color and some more parameters, which are not shown in the default brush thumbnail preview. + +We need to create a widget that previews a brush after applying all of these parameters. We may also want to consider including the "Brush Dynamics" in the preview; "Brush Dynamics" allow mapping parameteres such as speed, tablet pressure/title, velocity and more, to every painting parameter - this allow to simulate many kinds of painting. This should probably be included in the preview by showing a brush stroke which brings all these effects into consideration. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Slicing tool=== +'''Potential mentor:''' João S. O. Bueno + +'''Category:''' Tools, User-Interface + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +===IWarp tool (aka Liquify)=== + +'''Category:''' Tools + +GIMP has a plugin with a small preview which allows to whirl/pinch/grow/shrink parts of the image. We want to create a live on-canvas tool for that operation, like the rest of the core tools. + +For details about the original plugin, see http://docs.gimp.org/2.6/en/plug-in-iwarp.html + +In order to implement this, in a way that will match the upcoming changes in the core, it will be implemented using a GEGL operation which does the actual image transformation. A big part of the infrastructure for a GEGL based tool, was written in the previous Google Summer of Code in which a cage transformation tool was implemented using a GEGL operation. + +Minimal Student Requirements: +* Good C knowledge +* Basic knowledge in image manipulation and/or filtering + + +===Adaptive Image Cloning (aka Seamless Cloning)=== +'''Category:''' Tools + +'''Potential Mentor:''' Michael Natterer + +Direct cloning of parts from one image to another, usually ends in bad +results because of different lighting conditions and other settings +(such as white-balance) which causes the color of the cloned part not +to match the source image and look out of place. There are some +techniques to solve this, by using poisson equations and some other +methods. + +It differs from the existing heal tool, since it is meant for taking +one area from an image, and paste it smoothly in some other area. The +current algorithm implemented by the healing tool allows to remove +local irregularities (such as dots, hairs, etc.) very well, but +experiments of using it to do "adaptive cloning" of areas (for example +copying a person from one image to the other) do not produce good +results. + +Minimal Student Requirements: +* Good C knowledge +* Basic knowledge in image manipulation and/or filtering + +See http://www.cs.huji.ac.il/~danix/mvclone/ diff --git a/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901202248-edit.txt b/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901202248-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901202248-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212233-show.txt b/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212233-show.txt new file mode 100644 index 0000000..493c9a0 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212233-show.txt @@ -0,0 +1,74 @@ + + +For this year's Google Summer of Code program we are deliberately focusing on core features with little-to-zero involvement of programming user interfaces. Here are some project ideas to get inspired from. + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC|Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at [http://www.google-melange.com/gsoc/events/google/gsoc2014 http://www.google-melange.com/gsoc/events/google/gsoc2014]. + + +=Completing the GEGL port= + +One of the primary reasons why GIMP 2.10 hasn't been released yet is that file plugins (loaders/exporter) have to be ported to GEGL and GIO. Focusing a GSoC project on either of those tasks would immensely benefit the project. + +Please refer to the [[Hacking:Porting_file_plugins_to_GEGL_and_GIO]] page for status of file plugins. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with GIO + +=Improving GIMP for VFX and production of movies= + +Thanks to Mukund Sivamaran, GIMP 2.10 will be shipping with a very basic OpenEXR loader. But much more could be done: + + +* adding more user-accessible settings for the importer of EXR: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* exposure and gamma (reusable GEGL op is ready) +* un-premultiply option +* reading layers +* writing the currently missing code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* format and type +* compression +* handling alpha channel +* storage type +* image region +* exporting layers +* adding support for OpenEXR v2 specific features + +Additionally it would be useful to lay the foundation for [http://opencolorio.org/ OpenColorIO] support as complementary to LittleCMS-based color management support. OCIO is commonly used in the VFX industry. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=Name your own idea= + +We are looking for students who are passionate about GIMP and, therefore, have a good understanding of what it's capable of and what it's sorely missing. Therefore, we are mostly interested in working with students who can come up with a project idea of their own that matches GIMP's [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision product vision]. + +It could be implementing interesting new image processing algorithms or improving support for various file formats. Have a look at a [http://wiki.gimp.org/index.php/Hacking:GSoC/Future/Ideas past GSoC ideas list] for inspiration, think of what you really want GIMP to be able to do, figure out if you have the skills and the stamina to make it real, then talk to us. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212825-history.txt b/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212825-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:GSoC%2F2014%2FIdeas-20140901212825-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2F2014%2FIdeas-20200804085807-edit.txt b/wiki/Hacking:GSoC%2F2014%2FIdeas-20200804085807-edit.txt new file mode 100644 index 0000000..857ad13 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2014%2FIdeas-20200804085807-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Hacking:GSoC/2015/Ideas]] diff --git a/wiki/Hacking:GSoC%2F2014%2FIdeas-20210506070749-edit.txt b/wiki/Hacking:GSoC%2F2014%2FIdeas-20210506070749-edit.txt new file mode 100644 index 0000000..857ad13 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2014%2FIdeas-20210506070749-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Hacking:GSoC/2015/Ideas]] diff --git a/wiki/Hacking:GSoC%2F2015%2FIdeas-20161024015614-edit.txt b/wiki/Hacking:GSoC%2F2015%2FIdeas-20161024015614-edit.txt new file mode 100644 index 0000000..76e60f5 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2015%2FIdeas-20161024015614-edit.txt @@ -0,0 +1,64 @@ +For this year's Google Summer of Code program we are deliberately focusing on core features with little-to-zero involvement of programming user interfaces. Here are some project ideas to get inspired from. + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at http://www.google-melange.com/gsoc/events/google/gsoc2015. + +=Improve on-canvas interaction for editing tools and selected GEGL operations= + +With upcoming v2.10, GIMP is moving towards tools that rely more on on-canvas interaction and less on numeric inputs. However there is a lot of room for further improvements. + +One such case is feathering which used to make smooth rather than sharp selections. Currently GIMP doesn't visualize the feathering of a selection, hence understanding its impact is only done by trial and error. GIMP needs an on-canvas cue to show exactly where the feathering ends and provide a simple control to drag for adjusting that feathering value visually. Both cue and control should be available for all selection tools. + +Another example is providing better user experience for creative image manipulation. Right now in GIMP most GEGL operations are controlled numerically from a floating dialog with various settings. However some of these operations would benefit from having on-canvas controls to help users make direct visual decisions on adjustment of the content. The on-canvas widgets would complement rather than replace numeric input to preserve the ability to make precise adjustments. + +Here are some examples: + +* '''Vignette''' operation could have on-canvas ellipse-shaped (or rectangle-shaped — depending on custom settings) widgets to control size and softness of the darkening effect (see [http://www.darktable.org/usermanual/ch03s04s05.html.php darktable] for a reference); +* '''Lighting Effects''' operation (the [http://docs.gimp.org/2.8/en/plug-in-lighting.html existing filter] is yet to be ported to GEGL) could have on-canvas widgets to show where the light should fall on, and what the distance from the source of the light is. +* '''Motion Blur''' operations could have draggable on-canvas controls for setting the center of the blur and the angle. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) and basic Cairo programming. + +=Completing the GEGL port= + +One of the primary reasons why GIMP 2.10 hasn't been released yet is that file plugins (loaders/exporter) have to be ported to GEGL and GIO. Focusing a GSoC project on either of those tasks would immensely benefit the project. + +Please refer to the [[Hacking:Porting_file_plugins_to_GEGL_and_GIO]] page for status of file plugins. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with GIO + +=Improving GIMP for VFX and production of movies= + +Thanks to Mukund Sivamaran, GIMP 2.10 will be shipping with a very basic OpenEXR loader. But much more could be done: + +* adding more user-accessible settings for the importer of EXR: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* writing the currently missing code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* adding support for OpenEXR v2 specific features + +Additionally it would be useful to lay the foundation for [http://opencolorio.org/ OpenColorIO] support as complementary to LittleCMS-based color management support. OCIO is commonly used in the VFX industry. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=Name your own idea= + +We are looking for students who are passionate about GIMP and, therefore, have a good understanding of what it's capable of and what it's sorely missing. Therefore, we are mostly interested in working with students who can come up with a project idea of their own that matches GIMP's [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision product vision]. + +It could be implementing interesting new image processing algorithms or improving support for various file formats. Have a look at a [http://wiki.gimp.org/index.php/Hacking:GSoC/Future/Ideas past GSoC ideas list] for inspiration, think of what you really want GIMP to be able to do, figure out if you have the skills and the stamina to make it real, then talk to us. diff --git a/wiki/Hacking:GSoC%2F2015%2FIdeas-20200806164711-edit.txt b/wiki/Hacking:GSoC%2F2015%2FIdeas-20200806164711-edit.txt new file mode 100644 index 0000000..76e60f5 --- /dev/null +++ b/wiki/Hacking:GSoC%2F2015%2FIdeas-20200806164711-edit.txt @@ -0,0 +1,64 @@ +For this year's Google Summer of Code program we are deliberately focusing on core features with little-to-zero involvement of programming user interfaces. Here are some project ideas to get inspired from. + +For history of GIMP and GSoC, along with past ideas, see [[Hacking:GSOC_Archive]], and for details about applications see [[Hacking:GSOC‎]] + +The GSoC timeline for this year can be found at http://www.google-melange.com/gsoc/events/google/gsoc2015. + +=Improve on-canvas interaction for editing tools and selected GEGL operations= + +With upcoming v2.10, GIMP is moving towards tools that rely more on on-canvas interaction and less on numeric inputs. However there is a lot of room for further improvements. + +One such case is feathering which used to make smooth rather than sharp selections. Currently GIMP doesn't visualize the feathering of a selection, hence understanding its impact is only done by trial and error. GIMP needs an on-canvas cue to show exactly where the feathering ends and provide a simple control to drag for adjusting that feathering value visually. Both cue and control should be available for all selection tools. + +Another example is providing better user experience for creative image manipulation. Right now in GIMP most GEGL operations are controlled numerically from a floating dialog with various settings. However some of these operations would benefit from having on-canvas controls to help users make direct visual decisions on adjustment of the content. The on-canvas widgets would complement rather than replace numeric input to preserve the ability to make precise adjustments. + +Here are some examples: + +* '''Vignette''' operation could have on-canvas ellipse-shaped (or rectangle-shaped — depending on custom settings) widgets to control size and softness of the darkening effect (see [http://www.darktable.org/usermanual/ch03s04s05.html.php darktable] for a reference); +* '''Lighting Effects''' operation (the [http://docs.gimp.org/2.8/en/plug-in-lighting.html existing filter] is yet to be ported to GEGL) could have on-canvas widgets to show where the light should fall on, and what the distance from the source of the light is. +* '''Motion Blur''' operations could have draggable on-canvas controls for setting the center of the blur and the angle. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) and basic Cairo programming. + +=Completing the GEGL port= + +One of the primary reasons why GIMP 2.10 hasn't been released yet is that file plugins (loaders/exporter) have to be ported to GEGL and GIO. Focusing a GSoC project on either of those tasks would immensely benefit the project. + +Please refer to the [[Hacking:Porting_file_plugins_to_GEGL_and_GIO]] page for status of file plugins. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with GIO + +=Improving GIMP for VFX and production of movies= + +Thanks to Mukund Sivamaran, GIMP 2.10 will be shipping with a very basic OpenEXR loader. But much more could be done: + +* adding more user-accessible settings for the importer of EXR: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* writing the currently missing code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* adding support for OpenEXR v2 specific features + +Additionally it would be useful to lay the foundation for [http://opencolorio.org/ OpenColorIO] support as complementary to LittleCMS-based color management support. OCIO is commonly used in the VFX industry. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=Name your own idea= + +We are looking for students who are passionate about GIMP and, therefore, have a good understanding of what it's capable of and what it's sorely missing. Therefore, we are mostly interested in working with students who can come up with a project idea of their own that matches GIMP's [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision product vision]. + +It could be implementing interesting new image processing algorithms or improving support for various file formats. Have a look at a [http://wiki.gimp.org/index.php/Hacking:GSoC/Future/Ideas past GSoC ideas list] for inspiration, think of what you really want GIMP to be able to do, figure out if you have the skills and the stamina to make it real, then talk to us. diff --git a/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901191025-edit.txt b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901191025-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901191025-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901193434-show.txt b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901193434-show.txt new file mode 100644 index 0000000..87415bb --- /dev/null +++ b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901193434-show.txt @@ -0,0 +1,360 @@ + + +You may also want to take a look at the [[Mindstrom:Misc_TODO%27s|Mindstrom:Misc TODO's]] and [http://gegl.org/contribute.html the GEGL contribution site] - some of the projects there are big, and can maybe be incorparated as a part of some GSoC student's work. + + + + +{| class="wikitable" +|- +|

    Contents

    + +* 1 IMPORTANT: Implement GEGL operations for GIMP +* 2 Slicing tool +* 3 Make GIMP more suitable for use in VFX pipelines +* 4 Port UI code to a non-low level language +* 5 Scripting line-by-line debugging support +* 6 Implement the combined selection tool +* 7 Dynamically resized layers +* 8 JavaScript scripting in the core and/or plug-ins - using GNOME Java Script infrastructure (GJS) +* 9 Make menus searchable +* 10 Implement and add infrastructure for on-canvas tool drawing/options +* 11 Replace the GimpSizeEntry widget +* 12 Brush selector wigdet +* 13 Basic GEGL based paint tool +** 14.1 Filetype registration +** 14.2 Test framework +** 14.3 Additional file format plug-ins +** 14.4 Unified UI for scripting +** 14.5 Unit testing framework +** 14.6 SVG brushes +** 14.7 Benchmarking +** 14.8 Font Selector Widget +** 14.1 Filetype registration +** 14.2 Test framework +** 14.3 Additional file format plug-ins +** 14.4 Unified UI for scripting +** 14.5 Unit testing framework +** 14.6 SVG brushes +** 14.7 Benchmarking +** 14.8 Font Selector Widget +* 14.1 Filetype registration +* 14.2 Test framework +* 14.3 Additional file format plug-ins +* 14.4 Unified UI for scripting +* 14.5 Unit testing framework +* 14.6 SVG brushes +* 14.7 Benchmarking +* 14.8 Font Selector Widget +|} + +=== IMPORTANT: Implement GEGL operations for GIMP === + +'''Category:''' GEGL, image processing + +The migration of GIMP to use GEGL has accelerated - for some GIMP functionality the main hurdle to migrate is having GEGL ops that can act as drop in replacement for the core processing functionality (some ops would be desired directly in GIMP others could likely go directly into GEGL.). + +For most code involved, porting to GEGL involves understanding what the current code does; and port or reimplement it as a floating point processing operation (floating point math often ends up shorter and more readable than the 8bit equivalents.) + +A list of currently missing : + + +* Implementations of layer modes - that behave exactly like the old ones. +* Stretch HSV +* Decompose/Compose +* Alien map +* Gradient map (needs gradient support) +* Palette map +* Rotate colors +* sample colorize +* channel mixer +* ... and many other things that currently exist in the Filters menu of GIMP. + +See [[Hacking:Porting filters to GEGL]] for details. + + +=== Slicing tool === + +'''Potential mentor:''' João S. O. Bueno, Alexia Death + +'''Category:''' Tools, User-Interface + +'''Proposed in:''' 2012, 2013 + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: + +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: + +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Note that it's arguable where a slice tool since be in GIMP, since according to the product vision GIMP "GIMP is a high-end application for producing icons, '''graphical __elements__ of web pages''' and art for''' user interface __elements__'''" and as it was pointed out, it's for designing elements and not the entire thing. +However, this is a highly requested feature, which should also be useful in other cases (example: artists might want to break their images into parts for printing on different canvases and for many other reasons). + +A discussion showed a consensus that this should be supported. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +=== Make GIMP more suitable for use in VFX pipelines === + +'''Category:''' Plug-Ins/Scripts + +'''Proposed in:''' 2013 + +Upcoming GIMP 2.10 finally provides 16/32bit precision per color channel. However, this is not sufficient to make GIMP play well with other tools like Blender. There is a number of things, one of them — implementing a new GEGL-based GIMP plug-in for working with OpenEXR images. That would involve: + + +* writing the code for importing EXR with settings: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* exposure and gamma (reusable GEGL op is ready) +* un-premultiply option +* reading layers +* writing the code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* format and type +* compression +* handling alpha channel +* storage type +* image region +* exporting layers + +Another potential task to solve is implementing a way to quickly export sets of layers to a file, which is useful for working on variants of textures. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +===Port UI code to a non-low level language=== + +'''Category:''' User Interface, Future + +Hacking UI code in C is a resource eater for us, we should use C for +quick and efficient pixel processing but not for creating buttons. It +would be interesting to make changes to the GIMP codebase that would +allow us for example write the Pointer Information Dialog in JavaScript, Python or probably most preferable: Vala. + + +=== Scripting line-by-line debugging support === + +'''Category:''' Plug-Ins/Scripts + +There are no debuggers for scripting in GIMP, and only tracing is supported. Support should be added to allow one to single-step line-by-line in a JavaScript script for example (if we take the JS scripting project) and if not, integrating a debugger for tinyscheme is also going to be very helpful as a massive part of GIMP's scripting is done in tinyscheme. + + +===Implement the combined selection tool=== + +'''Category:''' Tools, User Interface + +The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html a research] made by Voralberg students in 2010. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Dynamically resized layers=== + +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===JavaScript scripting in the core and/or plug-ins - using GNOME Java Script infrastructure (GJS)=== + +'''Category:''' Plug-Ins/Scripts + +'''Mentor:''' Martin Nordholts +'''Potential Mentor:''' Kevin Cozens + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python, Ruby, and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are currently the most powerful ones. The Ruby binding should be just as capable as the Python binding but it hasn't seen a lot of use and not many people may be aware of its existence. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: + + +* Good C knowledge +* Good JavaScript knowledge +* Good GObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + + +Optimal student requirements: + + +* Experience with JavaScript integration in applications +''[Editor's Note]: At least for scheme, there are no debuggers for scripting in GIMP, and only tracing is supported. It would be neat if as a part of this project, a javascript debugger will be integrated so scripts could be debugged in a sane way. Again, this is not a part of the original project suggestion, but this is something I thought that should be added.'' + + +=== Make menus searchable === + +'''Mentor:''' Martin Nordholts + +The amount of menu entries in GIMP - either from plug-ins, scripts or internal functions - is huge. The name of a particular function might be easier to remember than its menu location. Being able to search for the function and applying it to the image without having to go through the menus can help (similar to Emacs' M-x feature). + +... i.e. have a textbox, in te menu for example, and anything typed will be matched against all menu items and their blurbs and maybe something more (like procedures not registered in menus). + +Optimal student requirements: + + +* Experience with database algorithms and implementation issues + + + + +=== Implement and add infrastructure for on-canvas tool drawing/options === + +'''Mentor:''' Martin Nordholts + +Most of GIMP's tools do still require a dockable dialog for user interaction. Some of the values and settings that are changed there could be presented and modified directly on the image canvas (see for example the text tool of GIMP 2.7). + +Optimal student requirements: + + +* Good at high-level and architectural, API based thinking + +=== Replace the GimpSizeEntry widget === + +'''Mentor:''' Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box + +Optimal student requirements: + + +* Widget and interaction design experience or at least interest + +=== Brush selector wigdet === + +'''Mentor:''' Alexia Death + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +Optimal student requirements: + + +* Widget and interaction design experience or at least interest + +=== Basic GEGL based paint tool === + +'''Mentor:''' Alexia Death + +Basic paint tool that is capable of taking user input, converting it into something that gegl handles, creating paths that gegl renders keeping up with the painter as fast as possible. Integration with gimp is optional, but the tool's gegl core should have some ui and be capable of accepting both just parametric and parameters plus a gegl buffer input to render. + +Optimal student requirements + + +* Prior experience with gegl or with graph based rendering + +== Older Ideas for GSoC == + +'''Note:''' Ideas listed in this section may be 100% relevant, may be 50% or so relevant, and may be completly outdated. You may want to check if this idea is still relevant before suggesting to work on it. + + +=== Filetype registration === + +There is currently no way to register a file type to open with GIMP from within GIMP itself. On some desktop environments and platforms, this makes registering types to open with GIMP awkward. We need a configuration GUI within GIMP, which does show the available types and/or file extensions, and a means (a backend) to register them according to the platform/environment. The latter should probably be modular and extensible, because this is different on each of them. + + +=== Test framework === + +Tests have shown that it is possible to crash plug-ins when feeding them bogus data via the PDB API, for example when calling them from scripts (another interesting approach might be to run file loader plug-ins with [http://web.archive.org/ zzuf]). Needed: a test framework to find the bugs, and then time to fix them. + + +=== Additional file format plug-ins === + +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example MNG. The MNG save plug-in needs to be modified to save images in MNG-LC profile. Then a loader can be easily written to work similar to the GIF loader. It also needs support for JPEG chunks. + + +=== Unified UI for scripting === + +We have three major scripting interfaces, Script-Fu, [http://web.archive.org/ PyGimp] and Perl-Fu. All of them allow to create an interface for a script easily, just by registering a function with their respective parameters. However, all widgets look a bit different depending on the binding. + + +=== Unit testing framework === + +GIMP currently doesn't have a test framework that API changes or internal changes could be tested against. This is crucial to avoid regressions, especially with the major rewrite we will seen when GEGL is introduced. + + +=== SVG brushes === + +VBR brushes in GIMP - basic shapes like ellipses, rectangles and rhombuses; with additional spikes - are scalable. In SVN trunk, all brushes including the pixmap-based ones can at least be scaled down. We do not yet have means for more advanced brushes (think about a brush consisting of two disjoint circles) that can be scaled up in a lossless way. + +Using SVG files as brushes could help to solve this. + + +=== Benchmarking === + +In many cases, image manipulation is compute-intensive - many operations are loops which go over all pixels of an image. Sometimes, there are more efficient algorithms for a particular method. But does it have other drawback? Or is the time spent at an entirely different place, e.g. code that does check something on every loop while it would be sufficient to only do it once? Can it be changed safely? + + +=== Font Selector Widget === + +We need something better. Something that is reusable. Something to turn choosing fonts into a pleasure, rather than a pain. Something to leave the competition on the dust. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901194740-history.txt b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901194740-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20140901194740-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC%2FFuture%2FIdeas-20161024002752-edit.txt b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20161024002752-edit.txt new file mode 100644 index 0000000..1dcf151 --- /dev/null +++ b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20161024002752-edit.txt @@ -0,0 +1,246 @@ +You may also want to take a look at the [[Mindstrom:Misc TODO's]] and [http://gegl.org/contribute.html the GEGL contribution site] - some of the projects there are big, and can maybe be incorparated as a part of some GSoC student's work. + + + +=== IMPORTANT: Implement GEGL operations for GIMP === +'''Category:''' GEGL, image processing + +The migration of GIMP to use GEGL has accelerated - for some GIMP functionality the main hurdle to migrate is having GEGL ops that can act as drop in replacement for the core processing functionality (some ops would be desired directly in GIMP others could likely go directly into GEGL.). + +For most code involved, porting to GEGL involves understanding what the current code does; and port or reimplement it as a floating point processing operation (floating point math often ends up shorter and more readable than the 8bit equivalents.) + +A list of currently missing : +*Implementations of layer modes - that behave exactly like the old ones. +*Stretch HSV +*Decompose/Compose +*Alien map +*Gradient map (needs gradient support) +*Palette map +*Rotate colors +*sample colorize +*channel mixer +*... and many other things that currently exist in the Filters menu of GIMP. + +See [[Hacking:Porting filters to GEGL]] for details. + +=== Slicing tool === +'''Potential mentor:''' João S. O. Bueno, Alexia Death + +'''Category:''' Tools, User-Interface + +'''Proposed in:''' 2012, 2013 + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Note that it's arguable where a slice tool since be in GIMP, since according to the product vision GIMP "GIMP is a high-end application for producing icons, graphical elements of web pages and art for user interface elements" and as it was pointed out, it's for designing elements and not the entire thing. + +However, this is a highly requested feature, which should also be useful in other cases (example: artists might want to break their images into parts for printing on different canvases and for many other reasons). + +A discussion showed a consensus that this should be supported. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +=== Make GIMP more suitable for use in VFX pipelines === + +'''Category:''' Plug-Ins/Scripts + +'''Proposed in:''' 2013 + +Upcoming GIMP 2.10 finally provides 16/32bit precision per color channel. However, this is not sufficient to make GIMP play well with other tools like Blender. There is a number of things, one of them — implementing a new GEGL-based GIMP plug-in for working with OpenEXR images. That would involve: + +* writing the code for importing EXR with settings: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* writing the code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers + +Another potential task to solve is implementing a way to quickly export sets of layers to a file, which is useful for working on variants of textures. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +===Port UI code to a non-low level language=== +'''Category:''' User Interface, Future + +Hacking UI code in C is a resource eater for us, we should use C for +quick and efficient pixel processing but not for creating buttons. It +would be interesting to make changes to the GIMP codebase that would +allow us for example write the Pointer Information Dialog in JavaScript, Python or probably most preferable: Vala. + +=== Scripting line-by-line debugging support === +'''Category:''' Plug-Ins/Scripts + +There are no debuggers for scripting in GIMP, and only tracing is supported. Support should be added to allow one to single-step line-by-line in a JavaScript script for example (if we take the JS scripting project) and if not, integrating a debugger for tinyscheme is also going to be very helpful as a massive part of GIMP's scripting is done in tinyscheme. +===Implement the combined selection tool=== +'''Category:''' Tools, User Interface + +The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html a research] made by Voralberg students in 2010. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Dynamically resized layers=== +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===JavaScript scripting in the core and/or plug-ins - using GNOME Java Script infrastructure (GJS)=== +'''Category:''' Plug-Ins/Scripts + +Mentor: Martin Nordholts +'''Potential Mentor:''' Kevin Cozens + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python, Ruby, and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are currently the most powerful ones. The Ruby binding should be just as capable as the Python binding but it hasn't seen a lot of use and not many people may be aware of its existence. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: +* Good C knowledge +* Good JavaScript knowledge +* Good GObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + + +Optimal student requirements: +
      +
    • Experience with JavaScript integration in applications
    +[Editor's Note]: At least for scheme, there are no debuggers for scripting in GIMP, and only tracing is supported. It would be neat if as a part of this project, a javascript debugger will be integrated so scripts could be debugged in a sane way. Again, this is not a part of the original project suggestion, but this is something I thought that should be added. + +=== Implement and add infrastructure for on-canvas tool drawing/options === +Mentor: Martin Nordholts + +Most of GIMP's tools do still require a dockable dialog for user interaction. Some of the values and settings that are changed there could be presented and modified directly on the image canvas (see for example the text tool of GIMP 2.7). + +Optimal student requirements: +
      +
    • Good at high-level and architectural, API based thinking
    + +=== Replace the GimpSizeEntry widget === + +Mentor: Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box + +Optimal student requirements: +
      +
    • Widget and interaction design experience or at least interest
    + +=== Brush selector wigdet === +Mentor: Alexia Death + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +Optimal student requirements: +
      +
    • Widget and interaction design experience or at least interest
    + +=== Basic GEGL based paint tool === +Mentor: Alexia Death + +Basic paint tool that is capable of taking user input, converting it into something that gegl handles, creating paths that gegl renders keeping up with the painter as fast as possible. Integration with gimp is optional, but the tool's gegl core should have some ui and be capable of accepting both just parametric and parameters plus a gegl buffer input to render. + +Optimal student requirements +
      +
    • Prior experience with gegl or with graph based rendering
    + +== Older Ideas for GSoC == +Note: Ideas listed in this section may be 100% relevant, may be 50% or so relevant, and may be completly outdated. You may want to check if this idea is still relevant before suggesting to work on it. + +=== Filetype registration === +There is currently no way to register a file type to open with GIMP from within GIMP itself. On some desktop environments and platforms, this makes registering types to open with GIMP awkward. We need a configuration GUI within GIMP, which does show the available types and/or file extensions, and a means (a backend) to register them according to the platform/environment. The latter should probably be modular and extensible, because this is different on each of them. + +=== Test framework === +Tests have shown that it is possible to crash plug-ins when feeding them bogus data via the PDB API, for example when calling them from scripts (another interesting approach might be to run file loader plug-ins with [http://web.archive.org/web/20080225093418/http://sam.zoy.org/zzuf/ zzuf]). Needed: a test framework to find the bugs, and then time to fix them. + +=== Additional file format plug-ins === +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example MNG. The MNG save plug-in needs to be modified to save images in MNG-LC profile. Then a loader can be easily written to work similar to the GIF loader. It also needs support for JPEG chunks. + +=== Unified UI for scripting === +We have three major scripting interfaces, Script-Fu, [http://web.archive.org/web/20080225093418/http://wiki.gimp.org/gimp/PyGimp PyGimp] and Perl-Fu. All of them allow to create an interface for a script easily, just by registering a function with their respective parameters. However, all widgets look a bit different depending on the binding. + +=== Unit testing framework === +GIMP currently doesn't have a test framework that API changes or internal changes could be tested against. This is crucial to avoid regressions, especially with the major rewrite we will seen when GEGL is introduced. + +=== SVG brushes === +VBR brushes in GIMP - basic shapes like ellipses, rectangles and rhombuses; with additional spikes - are scalable. In SVN trunk, all brushes including the pixmap-based ones can at least be scaled down. We do not yet have means for more advanced brushes (think about a brush consisting of two disjoint circles) that can be scaled up in a lossless way. + +Using SVG files as brushes could help to solve this. + +=== Benchmarking === +In many cases, image manipulation is compute-intensive - many operations are loops which go over all pixels of an image. Sometimes, there are more efficient algorithms for a particular method. But does it have other drawback? Or is the time spent at an entirely different place, e.g. code that does check something on every loop while it would be sufficient to only do it once? Can it be changed safely? + +=== Font Selector Widget === +We need something better. Something that is reusable. Something to turn choosing fonts into a pleasure, rather than a pain. Something to leave the competition on the dust. diff --git a/wiki/Hacking:GSoC%2FFuture%2FIdeas-20200804084700-edit.txt b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20200804084700-edit.txt new file mode 100644 index 0000000..5b5ad77 --- /dev/null +++ b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20200804084700-edit.txt @@ -0,0 +1,233 @@ +You may also want to take a look at the [[Mindstrom:Misc TODO's]] and [http://gegl.org/contribute.html the GEGL contribution site] - some of the projects there are big, and can maybe be incorparated as a part of some GSoC student's work. + + + +=== IMPORTANT: Implement GEGL operations for GIMP === +'''Category:''' GEGL, image processing + +The migration of GIMP to use GEGL has accelerated - for some GIMP functionality the main hurdle to migrate is having GEGL ops that can act as drop in replacement for the core processing functionality (some ops would be desired directly in GIMP others could likely go directly into GEGL.). + +For most code involved, porting to GEGL involves understanding what the current code does; and port or reimplement it as a floating point processing operation (floating point math often ends up shorter and more readable than the 8bit equivalents.) + +See [[Hacking:Porting filters to GEGL]] for details. + +=== Slicing tool === +'''Potential mentor:''' João S. O. Bueno, Alexia Death + +'''Category:''' Tools, User-Interface + +'''Proposed in:''' 2012, 2013 + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Note that it's arguable where a slice tool since be in GIMP, since according to the product vision GIMP "GIMP is a high-end application for producing icons, graphical elements of web pages and art for user interface elements" and as it was pointed out, it's for designing elements and not the entire thing. + +However, this is a highly requested feature, which should also be useful in other cases (example: artists might want to break their images into parts for printing on different canvases and for many other reasons). + +A discussion showed a consensus that this should be supported. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +=== Make GIMP more suitable for use in VFX pipelines === + +'''Category:''' Plug-Ins/Scripts + +'''Proposed in:''' 2013 + +Upcoming GIMP 2.10 finally provides 16/32bit precision per color channel. However, this is not sufficient to make GIMP play well with other tools like Blender. There is a number of things, one of them — improving the existing GEGL-based GIMP plug-in for working with OpenEXR images. That would involve: + +* writing the code for importing EXR with settings: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* writing the code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers + +Another potential task to solve is implementing a way to quickly export sets of layers to a file, which is useful for working on variants of textures. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=== Scripting line-by-line debugging support === +'''Category:''' Plug-Ins/Scripts + +There are no debuggers for scripting in GIMP, and only tracing is supported. Support should be added to allow one to single-step line-by-line in a JavaScript script for example (if we take the JS scripting project) and if not, integrating a debugger for tinyscheme is also going to be very helpful as a massive part of GIMP's scripting is done in tinyscheme. + +===Dynamically resized layers=== +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===JavaScript scripting in the core and/or plug-ins - using GNOME Java Script infrastructure (GJS)=== +'''Category:''' Plug-Ins/Scripts + +Mentor: Martin Nordholts +'''Potential Mentor:''' Kevin Cozens + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python, Ruby, and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are currently the most powerful ones. The Ruby binding should be just as capable as the Python binding but it hasn't seen a lot of use and not many people may be aware of its existence. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: +* Good C knowledge +* Good JavaScript knowledge +* Good GObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + + +Optimal student requirements: +
      +
    • Experience with JavaScript integration in applications
    +[Editor's Note]: At least for scheme, there are no debuggers for scripting in GIMP, and only tracing is supported. It would be neat if as a part of this project, a javascript debugger will be integrated so scripts could be debugged in a sane way. Again, this is not a part of the original project suggestion, but this is something I thought that should be added. + +=== Implement and add infrastructure for on-canvas tool drawing/options === +Mentor: Martin Nordholts + +Most of GIMP's tools do still require a dockable dialog for user interaction. Some of the values and settings that are changed there could be presented and modified directly on the image canvas (see for example the text tool of GIMP 2.7). + +Optimal student requirements: +
      +
    • Good at high-level and architectural, API based thinking
    + +=== Brush selector wigdet === +Mentor: Alexia Death + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +Optimal student requirements: +
      +
    • Widget and interaction design experience or at least interest
    + +=== Basic GEGL based paint tool === +Mentor: Alexia Death + +Basic paint tool that is capable of taking user input, converting it into something that gegl handles, creating paths that gegl renders keeping up with the painter as fast as possible. Integration with gimp is optional, but the tool's gegl core should have some ui and be capable of accepting both just parametric and parameters plus a gegl buffer input to render. + +Optimal student requirements +
      +
    • Prior experience with gegl or with graph based rendering
    + +== Older Ideas for GSoC == +Note: Ideas listed in this section may be 100% relevant, may be 50% or so relevant, and may be completly outdated. You may want to check if this idea is still relevant before suggesting to work on it. + +=== Filetype registration === +There is currently no way to register a file type to open with GIMP from within GIMP itself. On some desktop environments and platforms, this makes registering types to open with GIMP awkward. We need a configuration GUI within GIMP, which does show the available types and/or file extensions, and a means (a backend) to register them according to the platform/environment. The latter should probably be modular and extensible, because this is different on each of them. + +=== Test framework === +Tests have shown that it is possible to crash plug-ins when feeding them bogus data via the PDB API, for example when calling them from scripts (another interesting approach might be to run file loader plug-ins with [http://web.archive.org/web/20080225093418/http://sam.zoy.org/zzuf/ zzuf]). Needed: a test framework to find the bugs, and then time to fix them. + +=== Additional file format plug-ins === +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example MNG. The MNG save plug-in needs to be modified to save images in MNG-LC profile. Then a loader can be easily written to work similar to the GIF loader. It also needs support for JPEG chunks. + +=== Unified UI for scripting === +We have three major scripting interfaces, Script-Fu, [http://web.archive.org/web/20080225093418/http://wiki.gimp.org/gimp/PyGimp PyGimp] and Perl-Fu. All of them allow to create an interface for a script easily, just by registering a function with their respective parameters. However, all widgets look a bit different depending on the binding. + +=== Unit testing framework === +GIMP currently doesn't have a test framework that API changes or internal changes could be tested against. This is crucial to avoid regressions, especially with the major rewrite we will seen when GEGL is introduced. + +=== SVG brushes === +VBR brushes in GIMP - basic shapes like ellipses, rectangles and rhombuses; with additional spikes - are scalable. In SVN trunk, all brushes including the pixmap-based ones can at least be scaled down. We do not yet have means for more advanced brushes (think about a brush consisting of two disjoint circles) that can be scaled up in a lossless way. + +Using SVG files as brushes could help to solve this. + +=== Benchmarking === +In many cases, image manipulation is compute-intensive - many operations are loops which go over all pixels of an image. Sometimes, there are more efficient algorithms for a particular method. But does it have other drawback? Or is the time spent at an entirely different place, e.g. code that does check something on every loop while it would be sufficient to only do it once? Can it be changed safely? + +=== Font Selector Widget === +We need something better. Something that is reusable. Something to turn choosing fonts into a pleasure, rather than a pain. Something to leave the competition on the dust. + +===Port UI code to a non-low level language=== +'''Category:''' User Interface, Future + +Hacking UI code in C is a resource eater for us, we should use C for quick and efficient pixel processing but not for creating buttons. It would be interesting to make changes to the GIMP codebase that would allow us for example write the Pointer Information Dialog in JavaScript, Python or probably most preferable: Vala. + + +=== Replace the GimpSizeEntry widget === + +Mentor: Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box + +Optimal student requirements: +
      +
    • Widget and interaction design experience or at least interest
    + +===Implement the combined selection tool=== +'''Category:''' Tools, User Interface + +The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html a research] made by Voralberg students in 2010. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming diff --git a/wiki/Hacking:GSoC%2FFuture%2FIdeas-20210515112335-edit.txt b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20210515112335-edit.txt new file mode 100644 index 0000000..5b5ad77 --- /dev/null +++ b/wiki/Hacking:GSoC%2FFuture%2FIdeas-20210515112335-edit.txt @@ -0,0 +1,233 @@ +You may also want to take a look at the [[Mindstrom:Misc TODO's]] and [http://gegl.org/contribute.html the GEGL contribution site] - some of the projects there are big, and can maybe be incorparated as a part of some GSoC student's work. + + + +=== IMPORTANT: Implement GEGL operations for GIMP === +'''Category:''' GEGL, image processing + +The migration of GIMP to use GEGL has accelerated - for some GIMP functionality the main hurdle to migrate is having GEGL ops that can act as drop in replacement for the core processing functionality (some ops would be desired directly in GIMP others could likely go directly into GEGL.). + +For most code involved, porting to GEGL involves understanding what the current code does; and port or reimplement it as a floating point processing operation (floating point math often ends up shorter and more readable than the 8bit equivalents.) + +See [[Hacking:Porting filters to GEGL]] for details. + +=== Slicing tool === +'''Potential mentor:''' João S. O. Bueno, Alexia Death + +'''Category:''' Tools, User-Interface + +'''Proposed in:''' 2012, 2013 + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Note that it's arguable where a slice tool since be in GIMP, since according to the product vision GIMP "GIMP is a high-end application for producing icons, graphical elements of web pages and art for user interface elements" and as it was pointed out, it's for designing elements and not the entire thing. + +However, this is a highly requested feature, which should also be useful in other cases (example: artists might want to break their images into parts for printing on different canvases and for many other reasons). + +A discussion showed a consensus that this should be supported. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +=== Make GIMP more suitable for use in VFX pipelines === + +'''Category:''' Plug-Ins/Scripts + +'''Proposed in:''' 2013 + +Upcoming GIMP 2.10 finally provides 16/32bit precision per color channel. However, this is not sufficient to make GIMP play well with other tools like Blender. There is a number of things, one of them — improving the existing GEGL-based GIMP plug-in for working with OpenEXR images. That would involve: + +* writing the code for importing EXR with settings: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* writing the code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers + +Another potential task to solve is implementing a way to quickly export sets of layers to a file, which is useful for working on variants of textures. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +=== Scripting line-by-line debugging support === +'''Category:''' Plug-Ins/Scripts + +There are no debuggers for scripting in GIMP, and only tracing is supported. Support should be added to allow one to single-step line-by-line in a JavaScript script for example (if we take the JS scripting project) and if not, integrating a debugger for tinyscheme is also going to be very helpful as a massive part of GIMP's scripting is done in tinyscheme. + +===Dynamically resized layers=== +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===JavaScript scripting in the core and/or plug-ins - using GNOME Java Script infrastructure (GJS)=== +'''Category:''' Plug-Ins/Scripts + +Mentor: Martin Nordholts +'''Potential Mentor:''' Kevin Cozens + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python, Ruby, and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are currently the most powerful ones. The Ruby binding should be just as capable as the Python binding but it hasn't seen a lot of use and not many people may be aware of its existence. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: +* Good C knowledge +* Good JavaScript knowledge +* Good GObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + + +Optimal student requirements: +
      +
    • Experience with JavaScript integration in applications
    +[Editor's Note]: At least for scheme, there are no debuggers for scripting in GIMP, and only tracing is supported. It would be neat if as a part of this project, a javascript debugger will be integrated so scripts could be debugged in a sane way. Again, this is not a part of the original project suggestion, but this is something I thought that should be added. + +=== Implement and add infrastructure for on-canvas tool drawing/options === +Mentor: Martin Nordholts + +Most of GIMP's tools do still require a dockable dialog for user interaction. Some of the values and settings that are changed there could be presented and modified directly on the image canvas (see for example the text tool of GIMP 2.7). + +Optimal student requirements: +
      +
    • Good at high-level and architectural, API based thinking
    + +=== Brush selector wigdet === +Mentor: Alexia Death + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +Optimal student requirements: +
      +
    • Widget and interaction design experience or at least interest
    + +=== Basic GEGL based paint tool === +Mentor: Alexia Death + +Basic paint tool that is capable of taking user input, converting it into something that gegl handles, creating paths that gegl renders keeping up with the painter as fast as possible. Integration with gimp is optional, but the tool's gegl core should have some ui and be capable of accepting both just parametric and parameters plus a gegl buffer input to render. + +Optimal student requirements +
      +
    • Prior experience with gegl or with graph based rendering
    + +== Older Ideas for GSoC == +Note: Ideas listed in this section may be 100% relevant, may be 50% or so relevant, and may be completly outdated. You may want to check if this idea is still relevant before suggesting to work on it. + +=== Filetype registration === +There is currently no way to register a file type to open with GIMP from within GIMP itself. On some desktop environments and platforms, this makes registering types to open with GIMP awkward. We need a configuration GUI within GIMP, which does show the available types and/or file extensions, and a means (a backend) to register them according to the platform/environment. The latter should probably be modular and extensible, because this is different on each of them. + +=== Test framework === +Tests have shown that it is possible to crash plug-ins when feeding them bogus data via the PDB API, for example when calling them from scripts (another interesting approach might be to run file loader plug-ins with [http://web.archive.org/web/20080225093418/http://sam.zoy.org/zzuf/ zzuf]). Needed: a test framework to find the bugs, and then time to fix them. + +=== Additional file format plug-ins === +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example MNG. The MNG save plug-in needs to be modified to save images in MNG-LC profile. Then a loader can be easily written to work similar to the GIF loader. It also needs support for JPEG chunks. + +=== Unified UI for scripting === +We have three major scripting interfaces, Script-Fu, [http://web.archive.org/web/20080225093418/http://wiki.gimp.org/gimp/PyGimp PyGimp] and Perl-Fu. All of them allow to create an interface for a script easily, just by registering a function with their respective parameters. However, all widgets look a bit different depending on the binding. + +=== Unit testing framework === +GIMP currently doesn't have a test framework that API changes or internal changes could be tested against. This is crucial to avoid regressions, especially with the major rewrite we will seen when GEGL is introduced. + +=== SVG brushes === +VBR brushes in GIMP - basic shapes like ellipses, rectangles and rhombuses; with additional spikes - are scalable. In SVN trunk, all brushes including the pixmap-based ones can at least be scaled down. We do not yet have means for more advanced brushes (think about a brush consisting of two disjoint circles) that can be scaled up in a lossless way. + +Using SVG files as brushes could help to solve this. + +=== Benchmarking === +In many cases, image manipulation is compute-intensive - many operations are loops which go over all pixels of an image. Sometimes, there are more efficient algorithms for a particular method. But does it have other drawback? Or is the time spent at an entirely different place, e.g. code that does check something on every loop while it would be sufficient to only do it once? Can it be changed safely? + +=== Font Selector Widget === +We need something better. Something that is reusable. Something to turn choosing fonts into a pleasure, rather than a pain. Something to leave the competition on the dust. + +===Port UI code to a non-low level language=== +'''Category:''' User Interface, Future + +Hacking UI code in C is a resource eater for us, we should use C for quick and efficient pixel processing but not for creating buttons. It would be interesting to make changes to the GIMP codebase that would allow us for example write the Pointer Information Dialog in JavaScript, Python or probably most preferable: Vala. + + +=== Replace the GimpSizeEntry widget === + +Mentor: Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box + +Optimal student requirements: +
      +
    • Widget and interaction design experience or at least interest
    + +===Implement the combined selection tool=== +'''Category:''' Tools, User Interface + +The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html a research] made by Voralberg students in 2010. + +Minimal Student Requirements: +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming diff --git a/wiki/Hacking:GSoC%2Future%2Ideas-20170710184350-show.txt b/wiki/Hacking:GSoC%2Future%2Ideas-20170710184350-show.txt new file mode 100644 index 0000000..abbf6cf --- /dev/null +++ b/wiki/Hacking:GSoC%2Future%2Ideas-20170710184350-show.txt @@ -0,0 +1,304 @@ + + +You may also want to take a look at the [[Mindstrom:Misc_TODO%27s|Mindstrom:Misc TODO's]] and [http://gegl.org/contribute.html the GEGL contribution site] - some of the projects there are big, and can maybe be incorparated as a part of some GSoC student's work. + + + + + +__TOC__ + +===IMPORTANT: Implement GEGL operations for GIMP=== + +'''Category:''' GEGL, image processing + +The migration of GIMP to use GEGL has accelerated - for some GIMP functionality the main hurdle to migrate is having GEGL ops that can act as drop in replacement for the core processing functionality (some ops would be desired directly in GIMP others could likely go directly into GEGL.). + +For most code involved, porting to GEGL involves understanding what the current code does; and port or reimplement it as a floating point processing operation (floating point math often ends up shorter and more readable than the 8bit equivalents.) + +A list of currently missing : + + +* Implementations of layer modes - that behave exactly like the old ones. +* Stretch HSV +* Decompose/Compose +* Alien map +* Gradient map (needs gradient support) +* Palette map +* Rotate colors +* sample colorize +* channel mixer +* ... and many other things that currently exist in the Filters menu of GIMP. + +See [[Hacking:Porting filters to GEGL]] for details. + + +===Slicing tool=== + +'''Potential mentor:''' João S. O. Bueno, Alexia Death + +'''Category:''' Tools, User-Interface + +'''Proposed in:''' 2012, 2013 + +''Note: this project, although very essential, requires complete UI specs which are not yet present, and therefore is considered less likely to be done, at least untill we have decent UI specs.'' + +One of the most requested features by web designers and/or interface +designers, is the addition of a slice tool. Currently slicing images +inside GIMP can only be done in grids (using guides and the guillotine +action) and you can't split just one rectangle in the middle. + +For example, the following slice can not be achieved: + +
    +-----------------------------------
    +|            |                    |
    +|            |                    |
    +|            |--------------------|
    +|            |                    |
    +-------------|                    |
    +|            |                    |
    +-----------------------------------
    +
    + +A more advanced version will take the slicing idea to a new place, allowing to create general rectangles: + +
    +-------------------------------------
    +|          ---------------   ----   |
    +|          |             |   |  |   |
    +|          |             |   ----   |
    +|          ---------------          |
    +|                               +---+--+
    +|                               |   |  |
    +--------------------------------+----  |
    +                                +------+
    +
    + +And why stop at rectangles? Maybe allow custom shapes using custom paths? Further ideas were suggested in the mailing list, at [http://old.nabble.com/Re%3A-Google-Summer-of-Code-2011---Project-Ideas-Suggestions-p31045609.html this post].. + +Note that it's arguable where a slice tool since be in GIMP, since according to the product vision GIMP "GIMP is a high-end application for producing icons, '''graphical __elements__ of web pages''' and art for''' user interface __elements__'''" and as it was pointed out, it's for designing elements and not the entire thing. +However, this is a highly requested feature, which should also be useful in other cases (example: artists might want to break their images into parts for printing on different canvases and for many other reasons). + +A discussion showed a consensus that this should be supported. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject knowledge in high level and experience in User Interface programming + +===Make GIMP more suitable for use in VFX pipelines=== + +'''Category:''' Plug-Ins/Scripts + +'''Proposed in:''' 2013 + +Upcoming GIMP 2.10 finally provides 16/32bit precision per color channel. However, this is not sufficient to make GIMP play well with other tools like Blender. There is a number of things, one of them — implementing a new GEGL-based GIMP plug-in for working with OpenEXR images. That would involve: + + +* writing the code for importing EXR with settings: +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +** exposure and gamma (reusable GEGL op is ready) +** un-premultiply option +** reading layers +* exposure and gamma (reusable GEGL op is ready) +* un-premultiply option +* reading layers +* writing the code for exporting EXR with settings: +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +** format and type +** compression +** handling alpha channel +** storage type +** image region +** exporting layers +* format and type +* compression +* handling alpha channel +* storage type +* image region +* exporting layers + +Another potential task to solve is implementing a way to quickly export sets of layers to a file, which is useful for working on variants of textures. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended — some knowledge of GIMP's internals (core/tools/etc.) +* Highly recommended — being familiar with VFX workflows, OpenEXR + +===Port UI code to a non-low level language=== + +'''Category:''' User Interface, Future + +Hacking UI code in C is a resource eater for us, we should use C for +quick and efficient pixel processing but not for creating buttons. It +would be interesting to make changes to the GIMP codebase that would +allow us for example write the Pointer Information Dialog in JavaScript, Python or probably most preferable: Vala. + + +===Scripting line-by-line debugging support=== + +'''Category:''' Plug-Ins/Scripts + +There are no debuggers for scripting in GIMP, and only tracing is supported. Support should be added to allow one to single-step line-by-line in a JavaScript script for example (if we take the JS scripting project) and if not, integrating a debugger for tinyscheme is also going to be very helpful as a massive part of GIMP's scripting is done in tinyscheme. + + +===Implement the combined selection tool=== + +'''Category:''' Tools, User Interface + +The combined selection tool should be an all-in-one tool for selecting regions based on [http://blog.mmiworks.net/2011/08/teaching-interaction-10.html a research] made by Voralberg students in 2010. + +Minimal Student Requirements: + + +* Good C knowledge +* Gtk+/GObject basic knowledge and/or at least some interest in User Interface programming + +===Dynamically resized layers=== + +'''Category:''' Tools, User Interface, Core + +'''Potential Mentor:''' Martin Nordholts + +Allow layers to be resized dynamically as the user paints on them, and save the user the burden of managing layer sizes + +Right now layers have to be manually resized, which is unefficient and non-useable. The first and most common problem is painting and discovering that you reached the end of the layer in the middle of your brush stroke. Another common inefficiency is simply saving large layers which is a waste of memory (RAM and disk space). No need to mention it's annoying to manage the layer size manually, and trying to crop one layer which results cropping the whole image if you don't notice the UI options correctly. + +Minimal Student Requirements: + + +* Good C knowledge +* Highly recommended - some knowledge of GIMP's internals (core/tools/etc.) +* Being a bit familiar with GIMP as a user, as this project touches several areas + +===JavaScript scripting in the core and/or plug-ins - using GNOME Java Script infrastructure (GJS)=== + +'''Category:''' Plug-Ins/Scripts + +'''Mentor:''' Martin Nordholts +'''Potential Mentor:''' Kevin Cozens + +GIMP scripts and plug-ins can be written in Scheme, Perl, Python, Ruby, and C. Scheme is always available, but limited in its application in regard on image manipulation. Additionally, as a list-processing language, it may appear as weird to most users. Its main purpose is scripting workflows for repetitive work. + +The Perl binding is currently the least supported one and not available on platforms other than Unix. The Python binding and the C libraries are currently the most powerful ones. The Ruby binding should be just as capable as the Python binding but it hasn't seen a lot of use and not many people may be aware of its existence. + +Javascript could take over Scheme's role as the general purpose scripting language for GIMP. It should be based on GNOME Java Script infrastructure (GJS). + +Minimal Student Requirements: + + +* Good C knowledge +* Good JavaScript knowledge +* Good GObject knowlege +* Some basic experience with GIMP's PDB (as a plugin/script writer) + + +Optimal student requirements: + + +* Experience with JavaScript integration in applications +''[Editor's Note]: At least for scheme, there are no debuggers for scripting in GIMP, and only tracing is supported. It would be neat if as a part of this project, a javascript debugger will be integrated so scripts could be debugged in a sane way. Again, this is not a part of the original project suggestion, but this is something I thought that should be added.'' + + +===Implement and add infrastructure for on-canvas tool drawing/options=== + +'''Mentor:''' Martin Nordholts + +Most of GIMP's tools do still require a dockable dialog for user interaction. Some of the values and settings that are changed there could be presented and modified directly on the image canvas (see for example the text tool of GIMP 2.7). + +Optimal student requirements: + + +* Good at high-level and architectural, API based thinking + +===Replace the GimpSizeEntry widget=== + +'''Mentor:''' Martin Nordholts + +Right now both the code and the UI is a mess. The unit should for example be in the text entry itself instead of in a combo box + +Optimal student requirements: + + +* Widget and interaction design experience or at least interest + +===Brush selector wigdet=== + +'''Mentor:''' Alexia Death + +More precisely one that is also capable for brush transform input (size/angle/aspect ratio). + +Optimal student requirements: + + +* Widget and interaction design experience or at least interest + +===Basic GEGL based paint tool=== + +'''Mentor:''' Alexia Death + +Basic paint tool that is capable of taking user input, converting it into something that gegl handles, creating paths that gegl renders keeping up with the painter as fast as possible. Integration with gimp is optional, but the tool's gegl core should have some ui and be capable of accepting both just parametric and parameters plus a gegl buffer input to render. + +Optimal student requirements + + +* Prior experience with gegl or with graph based rendering + +==Older Ideas for GSoC== + +'''Note:''' Ideas listed in this section may be 100% relevant, may be 50% or so relevant, and may be completly outdated. You may want to check if this idea is still relevant before suggesting to work on it. + + +===Filetype registration=== + +There is currently no way to register a file type to open with GIMP from within GIMP itself. On some desktop environments and platforms, this makes registering types to open with GIMP awkward. We need a configuration GUI within GIMP, which does show the available types and/or file extensions, and a means (a backend) to register them according to the platform/environment. The latter should probably be modular and extensible, because this is different on each of them. + + +===Test framework=== + +Tests have shown that it is possible to crash plug-ins when feeding them bogus data via the PDB API, for example when calling them from scripts (another interesting approach might be to run file loader plug-ins with [http://web.archive.org/ zzuf]). Needed: a test framework to find the bugs, and then time to fix them. + + +===Additional file format plug-ins=== + +There is a number of file formats that GIMP should support, but doesn't or at least doesn't support fully, for example MNG. The MNG save plug-in needs to be modified to save images in MNG-LC profile. Then a loader can be easily written to work similar to the GIF loader. It also needs support for JPEG chunks. + + +===Unified UI for scripting=== + +We have three major scripting interfaces, Script-Fu, [http://web.archive.org/ PyGimp] and Perl-Fu. All of them allow to create an interface for a script easily, just by registering a function with their respective parameters. However, all widgets look a bit different depending on the binding. + + +===Unit testing framework=== + +GIMP currently doesn't have a test framework that API changes or internal changes could be tested against. This is crucial to avoid regressions, especially with the major rewrite we will seen when GEGL is introduced. + + +===SVG brushes=== + +VBR brushes in GIMP - basic shapes like ellipses, rectangles and rhombuses; with additional spikes - are scalable. In SVN trunk, all brushes including the pixmap-based ones can at least be scaled down. We do not yet have means for more advanced brushes (think about a brush consisting of two disjoint circles) that can be scaled up in a lossless way. + +Using SVG files as brushes could help to solve this. + + +===Benchmarking=== + +In many cases, image manipulation is compute-intensive - many operations are loops which go over all pixels of an image. Sometimes, there are more efficient algorithms for a particular method. But does it have other drawback? Or is the time spent at an entirely different place, e.g. code that does check something on every loop while it would be sufficient to only do it once? Can it be changed safely? + + +===Font Selector Widget=== + +We need something better. Something that is reusable. Something to turn choosing fonts into a pleasure, rather than a pain. Something to leave the competition on the dust. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC-20200923035123-edit.txt b/wiki/Hacking:GSoC-20200923035123-edit.txt new file mode 100644 index 0000000..6884845 --- /dev/null +++ b/wiki/Hacking:GSoC-20200923035123-edit.txt @@ -0,0 +1,38 @@ +GSoC is Google-s way of supporting open source. They offer to pay to students for work done in open source projects. As a rule GIMP participates in this project. This is true for 2011 as well. + +Take a look at: +* [[Hacking:GSoC/2013/Ideas]] - Ideas for GSoC 2013 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + +== How do participate == + +* '''Get GIMP''' +**At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* '''Introduce your project''' +**Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* '''Socialize and communicate''' +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* '''Get familiarized with GIMP and/or GEGL code''' +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) + +'''If you have done this, you are ready to file the application.''' + +People who haven't done the above don't have much of a chance of getting accepted. People who have done all this compete against each other for the limited resource of willing mentors and slots. + +== General student requirements for GIMP related GSoC == + +What we look for in a student is initiative, a strong understanding of either gimp or the project or both and '''communication'''. + +
      +
    • Knowledge and expirience of coding. C is the preferable language.
    • +
    • Experience with GTK+, glib and gobject is a plus
    • +
    • If you are implementing a graphical algorithm, then some knowledge of the algorithm, or at least about general computer graphics/image manipulation, is obvoiusly required
    + +== Recommended == +Ideas which are generally considered as good for GSoC this year, and are recommended for students. Note that students are strongly encouraged to come up with their own project - this list is not exhaustive. A submission to gsoc which is just a copy-and paste job of one of these suggestions is not likely to be accepted. + +'''Note about mentors:''' Some projects have mentors listed for them. These are projects where a specific mentor has already agreed to work with a student if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here will be accepted, a mentor will be assigned for them. + +'''Note about tasks:''' Some ideas here may already be claimed by a potential student. If a claim is listed here it's solid enough that, unless the person claiming it gives it up, it wont go to another. diff --git a/wiki/Hacking:GSoC-20210512205259-edit.txt b/wiki/Hacking:GSoC-20210512205259-edit.txt new file mode 100644 index 0000000..6884845 --- /dev/null +++ b/wiki/Hacking:GSoC-20210512205259-edit.txt @@ -0,0 +1,38 @@ +GSoC is Google-s way of supporting open source. They offer to pay to students for work done in open source projects. As a rule GIMP participates in this project. This is true for 2011 as well. + +Take a look at: +* [[Hacking:GSoC/2013/Ideas]] - Ideas for GSoC 2013 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + +== How do participate == + +* '''Get GIMP''' +**At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* '''Introduce your project''' +**Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* '''Socialize and communicate''' +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* '''Get familiarized with GIMP and/or GEGL code''' +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) + +'''If you have done this, you are ready to file the application.''' + +People who haven't done the above don't have much of a chance of getting accepted. People who have done all this compete against each other for the limited resource of willing mentors and slots. + +== General student requirements for GIMP related GSoC == + +What we look for in a student is initiative, a strong understanding of either gimp or the project or both and '''communication'''. + +
      +
    • Knowledge and expirience of coding. C is the preferable language.
    • +
    • Experience with GTK+, glib and gobject is a plus
    • +
    • If you are implementing a graphical algorithm, then some knowledge of the algorithm, or at least about general computer graphics/image manipulation, is obvoiusly required
    + +== Recommended == +Ideas which are generally considered as good for GSoC this year, and are recommended for students. Note that students are strongly encouraged to come up with their own project - this list is not exhaustive. A submission to gsoc which is just a copy-and paste job of one of these suggestions is not likely to be accepted. + +'''Note about mentors:''' Some projects have mentors listed for them. These are projects where a specific mentor has already agreed to work with a student if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here will be accepted, a mentor will be assigned for them. + +'''Note about tasks:''' Some ideas here may already be claimed by a potential student. If a claim is listed here it's solid enough that, unless the person claiming it gives it up, it wont go to another. diff --git a/wiki/Hacking:GSoC-20210818022312-show.txt b/wiki/Hacking:GSoC-20210818022312-show.txt new file mode 100644 index 0000000..77cdc7f --- /dev/null +++ b/wiki/Hacking:GSoC-20210818022312-show.txt @@ -0,0 +1,55 @@ + + +GSoC is Google-s way of supporting open source. They offer to pay to students for work done in open source projects. As a rule GIMP participates in this project. This is true for 2011 as well. + +Take a look at: + + +* [https://wiki.gimp.org/index.php?title=Hacking:GSoC/2013/Ideas&action=edit&redlink=1 Hacking:GSoC/2013/Ideas] - Ideas for GSoC 2013 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +==How do participate== + +* '''Get GIMP''' +** At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +** At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* '''Introduce your project''' +** Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +** Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* '''Socialize and communicate''' +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* '''Get familiarized with GIMP and/or GEGL code''' +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) +* Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) +'''If you have done this, you are ready to file the application.''' + +People who haven't done the above don't have much of a chance of getting accepted. People who have done all this compete against each other for the limited resource of willing mentors and slots. + + +==General student requirements for GIMP related GSoC== + +What we look for in a student is initiative, a strong understanding of either gimp or the project or both and '''communication'''. + + +* Knowledge and expirience of coding. C is the preferable language. +* Experience with GTK+, glib and gobject is a plus +* If you are implementing a graphical algorithm, then some knowledge of the algorithm, or at least about general computer graphics/image manipulation, is obvoiusly required + +==Recommended== + +Ideas which are generally considered as good for GSoC this year, and are recommended for students. Note that students are strongly encouraged to come up with their own project - this list is not exhaustive. A submission to gsoc which is just a copy-and paste job of one of these suggestions is not likely to be accepted. + +'''Note about mentors:''' Some projects have mentors listed for them. These are projects where a specific mentor has already agreed to work with a student if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here will be accepted, a mentor will be assigned for them. + +'''Note about tasks:''' Some ideas here may already be claimed by a potential student. If a claim is listed here it's solid enough that, unless the person claiming it gives it up, it wont go to another. + + \ No newline at end of file diff --git a/wiki/Hacking:GSoC-20210818022507-show.txt b/wiki/Hacking:GSoC-20210818022507-show.txt new file mode 100644 index 0000000..742cef4 --- /dev/null +++ b/wiki/Hacking:GSoC-20210818022507-show.txt @@ -0,0 +1,55 @@ + + +GSoC is Google-s way of supporting open source. They offer to pay to students for work done in open source projects. As a rule GIMP participates in this project. This is true for 2011 as well. + +Take a look at: + + +* [http://wiki.gimp.org/index.php?title=Hacking:GSoC/2013/Ideas&action=edit&redlink=1 Hacking:GSoC/2013/Ideas] - Ideas for GSoC 2013 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +==How do participate== + +* '''Get GIMP''' +** At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +** At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* At least build gimp code base from GIT before proposing your project. This is important. People who skip this step generally fail. +* '''Introduce your project''' +** Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +** Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* Post you idea/project to GIMP developer mailing list. This is so you might find a developer interested in mentoring you and explain the details too long for an IRC conversation. We expect you to understand what you are proposing well enough to explain it to us. So do your research. +* '''Socialize and communicate''' +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +** Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* Join #gimp in gimpnet IRC network to discuss your idea with developers and get a primary approval from your mentor to be. +* '''Get familiarized with GIMP and/or GEGL code''' +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) +** Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) +* Read the [[Hacking:Developer_FAQ|developer's FAQ]], build all code, study it, ask questions, submit a patch for a couple of minor issues (discuss it first) +'''If you have done this, you are ready to file the application.''' + +People who haven't done the above don't have much of a chance of getting accepted. People who have done all this compete against each other for the limited resource of willing mentors and slots. + + +==General student requirements for GIMP related GSoC== + +What we look for in a student is initiative, a strong understanding of either gimp or the project or both and '''communication'''. + + +* Knowledge and expirience of coding. C is the preferable language. +* Experience with GTK+, glib and gobject is a plus +* If you are implementing a graphical algorithm, then some knowledge of the algorithm, or at least about general computer graphics/image manipulation, is obvoiusly required + +==Recommended== + +Ideas which are generally considered as good for GSoC this year, and are recommended for students. Note that students are strongly encouraged to come up with their own project - this list is not exhaustive. A submission to gsoc which is just a copy-and paste job of one of these suggestions is not likely to be accepted. + +'''Note about mentors:''' Some projects have mentors listed for them. These are projects where a specific mentor has already agreed to work with a student if the project is accepted. However, this does not mean that other projects have no mentor! In case projects other than the ones who have a mentor listed here will be accepted, a mentor will be assigned for them. + +'''Note about tasks:''' Some ideas here may already be claimed by a potential student. If a claim is listed here it's solid enough that, unless the person claiming it gives it up, it wont go to another. + + \ No newline at end of file diff --git a/wiki/Hacking:How_to_write_a_GIMP_plug-in-20150906163752-show.txt b/wiki/Hacking:How_to_write_a_GIMP_plug-in-20150906163752-show.txt new file mode 100644 index 0000000..aceebb4 --- /dev/null +++ b/wiki/Hacking:How_to_write_a_GIMP_plug-in-20150906163752-show.txt @@ -0,0 +1,1289 @@ + + +Written by Dave Neary. + + +__TOC__ + + + + + +=Essentials= + +In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors. + + +==Introduction== + +New developers are often intimidated by The GIMP size and its reputation. They think that writing a plug-in would be a difficult task. The goal of these articles is to dumb this feeling down, by showing how easily one can make a C plug-in. + +In this part, I present a plug-in's basic elements. We will see how to install a plug-in and how to get data from an image and directly manipulate it. + + + + + +==Architecture== + +[[File:Architecture.png|Architecture]] + + +The GIMP script interface is centered on the Procedural database (PDB). At startup, The GIMP looks into a predefined set of places for scripts and plug-ins, and asks each new script to identify itself. + +The plug-in declares itself to the PDB at that time, and passes informations like the position it wishes to get in the menu hierarchy, input parameters, and output parameters. + +When a script or a plug-in wants to use our plug-in, it gets through the PDB, which manages communicating parameters in one direction and the other in a transparent way. + +Internal functions that wish to get exposed to plug-ins have to be packaged first in the core, that will register them in the PDB, and secondly in the libgimp that will allow the function to be called as a normal one. + +This was the introduction - now, we will look closer at our first plug-in, a "Hello, world!". + + + + + +==Compiling the plug-in== + +To be able to compile simple plug-ins for The GIMP, one needs libgimp headers, as well as an associated utility named gimptool. + +With that utility, one can install a plug-in either in a private directory (~/.gimp-2.0/plug-ins), or in the global plug-in directory. + +Syntax is + +
        
    +       gimptool-2.0 --install plugin.c or gimptool-2.0 --install-admin plugin.c
    +
    + +This utility, with other options, can also be used to install scripts, or uninstall plug-ins. + + + + + +==Behaviour== + +A GIMP plug-in can typically behave three different ways. It can take image data, modify it, and send back the modified image, like edge detection. It can generate an image and send it back, like some script-fus, or file reading plug-ins like jpeg. Or it can get an image, and process it without modifying its data, like a file saver plug-in. + + + + + +==Essentials== +
    +      #include 
    +
    + +This header makes all basic plug-in elements available to us. + +
        
    +      GimpPlugInInfo PLUG_IN_INFO = {
    +        init,
    +        quit,
    +        query,
    +        run
    +      };
    +
    + +This structure has to have that name. It contains four pointers to functions, which will be called at set times of the plug-in life. init and quit are optional, and thus can hold NULL values, but the last two functions, query and run, are mandatory. + +The '''init()''' function is called each time The GIMP starts up. This function is not typically used. Some plug-ins use it to make a secondary search that is not done by the core. This function is not used by any standard GIMP plug-in, but could be useful for example for a plug-in that would like to register some procedure conditionally on some files presence. + +The '''quit()''' function is not used much either. It is called when The GIMP is about to be closed, to allow it to free some resources. It is used in the script-fu plug-in. + +The '''query()''' function is called the first time the plug-in is present, and then each time the plug-in changes. + +The '''run()''' function is the plug-in's centrepiece. It is called when the plug-in is asked to run. It gets the plug-in name (as a plug-in can register several procedures), input parameters, and a pointer to output parameters, then determines if it is launched in a interactive way or by a script, and does all the plug-in processing. Its prototype is + +
        
    +      void run (const gchar      *name,
    +                gint              nparams,
    +                const GimpParam  *param,
    +                gint             *nreturn_vals,
    +                GimpParam       **return_vals);
    +
    + + + + +==MAIN ()== + +MAIN is a C macro that holds a bit of dark magic to initialise arguments. It also calls the appropriate PLUG_IN_INFO function depending on the timing. Your plug-in needs it. + + +==The query() function== + +query() deals with the procedure registration and input arguments definition. These informations are saved to speed up startup time, and refreshed only when the plug-in is modified. + +For our "Hello, world!" plug-in, the query function will look like this: + +
        
    +      static void
    +      query (void)
    +        {
    +          static GimpParamDef args[] = {
    +            {
    +              GIMP_PDB_INT32,
    +              "run-mode",
    +              "Run mode"
    +            },
    +            {
    +              GIMP_PDB_IMAGE,
    +              "image",
    +              "Input image"
    +            },
    +            {
    +              GIMP_PDB_DRAWABLE,
    +              "drawable",
    +              "Input drawable"
    +            }
    +          };
    +
    +          gimp_install_procedure (
    +            "plug-in-hello",
    +            "Hello, world!",
    +            "Displays \"Hello, world!\" in a dialog",
    +            "David Neary",
    +            "Copyright David Neary",
    +            "2004",
    +            "_Hello world...",
    +            "RGB*, GRAY*",
    +            GIMP_PLUGIN,
    +            G_N_ELEMENTS (args), 0,
    +            args, NULL);
    +
    +            gimp_plugin_menu_register ("plug-in-hello",
    +                                       "/Filters/Misc"); 
    +        }
    +
    + +GimpParamDef contains three things - the parameter type, its name, and a string describing the parameter. + +gimp_install_procedure declares the procedure name, some description and help strings, menu path where the plug-in should sit, image types handled by the plug-in, and at the end, input and output parameters number, as well as the parameters descriptors. + +"RGB*, GRAY*" declares the image types handled. It can be RGB, INDEXED or GRAY, with or without Alpha. So "RGB*, GRAY*" describes RGB, RGBA, GRAY or GRAY image type. + +GIMP_PLUGIN declares this procedure to be external, and not to be executed in The GIMP core. + +By adding a stub run function now, we can check that our plug-in has all the essential elements, and test that it registers itself in the PDB with the "Xtns->Plug-in Details" plug-in. + +[[File:Plug-in-details.png|Plug-in details]] + +Plug-in details + +[[File:Plug-in-menu.png|Our plug-in is in the menus]] + +Our plug-in is in the menus + + +==The run() function== + +The other required function for PLUG_IN_INFO is run. The core of the plug-in stands there. + +Output values (return_vals in the prototype) must have at least one value associated - the plug-in status. Typically, this parameter will hold "GIMP_PDB_SUCCESS". + + + + + +==Run-modes== + +One can run a plug-in in several different ways, it can be run from a GIMP menu if The GIMP is run interactively, or from a script or a batch, or from the "Filters->Repeat Last" shortcut. + +The "run_mode" input parameter can hold one of these values: "GIMP_RUN_INTERACTIVE", "GIMP_RUN_NONINTERACTIVE" or "GIMP_RUN_WITH_LAST_VALS". + +"GIMP_RUN_INTERACTIVE" is typically the only case where one creates an options dialog. Otherwise, one directly calls the processing with values from input parameters or from memory. + +For our test plug-in, we will simply display a dialog containing a "Hello, world!" message. Thankfully, this is really easy with GTK+. Our run function could be: + +
        
    +      static void
    +      run (const gchar      *name,
    +           gint              nparams,
    +           const GimpParam  *param,
    +           gint             *nreturn_vals,
    +           GimpParam       **return_vals)
    +      {
    +        static GimpParam  values[1];
    +        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +        GimpRunMode       run_mode;
    +
    +        /* Setting mandatory output values */
    +        *nreturn_vals = 1;
    +        *return_vals  = values;
    +
    +        values[0].type = GIMP_PDB_STATUS;
    +        values[0].data.d_status = status;
    +
    +        /* Getting run_mode - we won't display a dialog if 
    +         * we are in NONINTERACTIVE mode */
    +        run_mode = param[0].data.d_int32;
    +
    +        if (run_mode != GIMP_RUN_NONINTERACTIVE)
    +          g_message("Hello, world!\n");
    +      }
    +
    + + +Now, when we run our plug-in, there is action: + +[[File:Hello.png|Hello, world!]] + +Have a look at the full hello.c plug-in code. + +Next part +In the next part we will go on, making a more useful plug-in that will get its hands on image data. We will see how to use The GIMP image architecture to make the plug-in perform better, processing the image tile by tile. + + +=Processing images= + +==Introduction== + +The algorithm we are going to implement is a simple blur. It is included in The GIMP as "Filters->Blur->Blur" with default parameters. + +That algorithm is very simple. Each pixel in our image is replaced by a mean value of its neighbours. For example, if we look at the simplest case where the neighbourhood is 3x3 (see figure 1), in that case the center value will be replaced with 5, the mean of the 9 numbers in its neighbourhood. + +With this method, edge differences are splatted, giving a blurred result. One can choose another radius, using a (2r + 1) x (2r + 1) matrix. + + +==Image structure== + +Last month, we wrote a run() function that did nothing useful. Let's look again at run() prototype: + +
        
    +      static void run (const gchar     *name,
    +                       gint             nparams,
    +                       const GimpParam *param,
    +                       gint            *nreturn_vals,
    +                       GimpParam      **return_vals);
    +
    + +We saw that for a filter (i.e. a plug-in that modifies the image), the first three input parameters were the run mode, an identifier for the image, and another one for the active drawable (layer or mask). + +A GIMP image is a structure that contains, among others, guides, layers, layer masks, and any data associated to the image. The word "drawable" is often used in GIMP internal structures. A "drawable" is an object where you can get, and sometimes modify, raw data. So : layers, layer masks, selections are all "drawables". + +[[File:GimpImage.png|Drawables]] + +Drawables + + +==Accessing the data== + +To get a GimpDrawable from its identifier, we need the gimp_drawable_get() function: + +
        
    +      GimpDrawable *gimp_drawable_get (gint32 drawable_id);
    +
    + +From this structure, one can access drawable data through a GimpPixelRgn structure, and one can check the drawable type (RGB, gray level). The full listing of functions available for a GimpDrawable can be found in the API. + +Two very important functions for plug-ins are gimp_drawable_mask_bounds() and gimp_pixel_rgn_init(). The first gives the active selection limits on the drawable, and the second initialises the GimpPixelRgn we will use to access the data. + +As soon as we have a well initialised GimpPixelRgn, we can access the image data in several different ways, by pixel, by rectangle, by row or by column. The best method will depend on the algorithm one plans to use. Moreover, The GIMP uses a tile-based architecture, and loading or unloading data is expensive, so we should not use it more than necessary. + +[[File:Tiles.png|Tiles]] + +Tiles + +The main functions to get and set image data are: + +
        
    +      void gimp_pixel_rgn_get_pixel (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y);
    +      void gimp_pixel_rgn_get_row   (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width);
    +      void gimp_pixel_rgn_get_col   (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          height);
    +      void gimp_pixel_rgn_get_rect  (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width,
    +                                     gint          height);
    +      void gimp_pixel_rgn_set_pixel (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y);
    +      void gimp_pixel_rgn_set_row   (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width);
    +      void gimp_pixel_rgn_set_col   (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          height);
    +      void gimp_pixel_rgn_set_rect  (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width,
    +                                     gint          height);
    +
    + +There is also another way to access image data (it's even used more often), that allows to manage data at the tile level. We will look at it in detail later. + + +==Updating the image== + +At last, a plug-in that has modified a drawable data must flush it to send data to the core, and to tell the application that the display must be updated. This is done with the following function: + +
        
    +      gimp_displays_flush ();
    +      gimp_drawable_detach (drawable);
    +
    + +==Implementing blur()== + +To be able to try out several different processing methods, we will delegate the job to a blur() function. Our run() is below. + +
        
    +      static void
    +      run (const gchar      *name,
    +           gint              nparams,
    +           const GimpParam  *param,
    +           gint             *nreturn_vals,
    +           GimpParam       **return_vals)
    +      {
    +        static GimpParam  values[1];
    +        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +        GimpRunMode       run_mode;
    +        GimpDrawable     *drawable;
    +
    +        /* Setting mandatory output values */
    +        *nreturn_vals = 1;
    +        *return_vals  = values;
    +
    +        values[0].type = GIMP_PDB_STATUS;
    +        values[0].data.d_status = status;
    +
    +        /* Getting run_mode - we won't display a dialog if 
    +         * we are in NONINTERACTIVE mode */
    +        run_mode = param[0].data.d_int32;
    +
    +        /*  Get the specified drawable  */
    +        drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +        gimp_progress_init ("My Blur...");
    +
    +        /* Let's time blur
    +         *
    +         *   GTimer timer = g_timer_new time ();
    +         */
    +
    +        blur (drawable);
    +
    +        /*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
    +         *   g_timer_destroy (timer);
    +         */
    +
    +        gimp_displays_flush ();
    +        gimp_drawable_detach (drawable);
    +      }
    +
    + +There are a few lines here that need to be explained a bit more. The call to gimp_progress_init() initialises a progress measurement for our plug-in. Later, if we call gimp_progress_update(double percent), the percentage given as an input parameter will be shown graphically. The run_mode tells us whether the plug-in was launched in a way such as we can display a graphical interface or not. Possible values are GIMP_RUN_INTERACTIVE, GIMP_RUN_NONINTERACTIVE or GIMP_RUN_WITH_LAST_VALS, which mean the plug-in was executed from The GIMP, from a script, or from the "Repeat last filter" menu entry. + +Regarding the blur algorithm itself, the first version using gimp_pixel_rgn_(get|set)_pixel() is found below. Some functions in it have not been explained yet. + +gimp_drawable_mask_bounds() allows calculation of the filter's effect limits, excluding any region that is not in the active selection. Limiting the processing this way allows an important performance improvement. + +gimp_pixel_rgn_init() takes as input parameters the drawable, its limits for the processing, and two booleans that significantly modify the behaviour of the resulting GimpPixelRgn. The first one tells that "set" operations must be done on shadow tiles, in order to leave original data as is until gimp_drawable_merge_shadow() is called, when all modified data will be merged. The second one tells that modified tiles should be tagged "dirty" and sent to the core to be merged. Most of the time, to read data, one uses FALSE and FALSE for these two parameters, and to write data, one uses TRUE and TRUE. Other combinations are possible but seldom used. + +
        
    +      static void
    +      blur (GimpDrawable *drawable)
    +      {
    +        gint         i, j, k, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar       output[4];
    +
    +        /* Gets upper left and lower right coordinates,
    +         * and layers number in the image */
    +        gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                   &x1, &y1,
    +                                   &x2, &y2);
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        /* Initialises two PixelRgns, one to read original data,
    +         * and the other to write output data. That second one will
    +         * be merged at the end by the call to
    +         * gimp_drawable_merge_shadow() */
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1, 
    +                             TRUE, TRUE);
    +
    +        for (i = x1; i < x2; i++)
    +          {
    +            for (j = y1; j < y2; j++)
    +              {
    +                guchar pixel[9][4];
    +
    +                /* Get nine pixels */
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[0],
    +                                          MAX (i - 1, x1),
    +                                          MAX (j - 1, y1));
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[1],
    +                                          MAX (i - 1, x1),
    +                                          j);
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[2],
    +                                          MAX (i - 1, x1),
    +                                          MIN (j + 1, y2 - 1));
    +
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[3],
    +                                          i,
    +                                          MAX (j - 1, y1));
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[4],
    +                                          i,
    +                                          j);
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[5],
    +                                          i,
    +                                          MIN (j + 1, y2 - 1));
    +
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[6],
    +                                          MIN (i + 1, x2 - 1),
    +                                          MAX (j - 1, y1));
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[7],
    +                                          MIN (i + 1, x2 - 1),
    +                                          j);
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[8],
    +                                          MIN (i + 1, x2 - 1),
    +                                          MIN (j + 1, y2 - 1));
    +
    +                /* For each layer, compute the average of the
    +                 * nine */
    +                for (k = 0; k < channels; k++)
    +                  {
    +                    int tmp, sum = 0;
    +                    for (tmp = 0; tmp < 9; tmp++)
    +                      sum += pixel[tmp][k];
    +                    output[k] = sum / 9;
    +                  }
    +
    +                gimp_pixel_rgn_set_pixel (&rgn_out,
    +                                          output,
    +                                          i, j);
    +              }
    +
    +            if (i % 10 == 0)
    +              gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1));
    +          }
    +
    +        /*  Update the modified region */
    +        gimp_drawable_flush (drawable);
    +        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +        gimp_drawable_update (drawable->drawable_id,
    +                              x1, y1,
    +                              x2 - x1, y2 - y1);
    +      }
    +
    + +==Row processing== + +Our function has a bug drawback: performance. On a 300x300 selection, with the timing code uncommented, blur() took 12 minutes on my K6-2 350MHz, well loaded with other stuff. To compare, on the same selection, Gaussian blur took 3 seconds. + +If we modify our function to rather use gimp_pixel_rgn_(get|set)_row() the result is far better. We reduce the timing for the 300x300 selection from 760 seconds to 6 seconds. blur() V2 is below: + +
        
    +      static void
    +      blur (GimpDrawable *drawable)
    +      {
    +        gint         i, j, k, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar      *row1, *row2, *row3;
    +        guchar      *outrow;
    +
    +        gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                   &x1, &y1,
    +                                   &x2, &y2);
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1,
    +                             TRUE, TRUE);
    +
    +        /* Initialise enough memory for row1, row2, row3, outrow */
    +        row1 = g_new (guchar, channels * (x2 - x1));
    +        row2 = g_new (guchar, channels * (x2 - x1));
    +        row3 = g_new (guchar, channels * (x2 - x1));
    +        outrow = g_new (guchar, channels * (x2 - x1));
    +
    +        for (i = y1; i < y2; i++)
    +          {
    +            /* Get row i-1, i, i+1 */
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row1,
    +                                    x1, MAX (y1, i - 1),
    +                                    x2 - x1);
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row2,
    +                                    x1, i,
    +                                    x2 - x1);
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row3,
    +                                    x1, MIN (y2 - 1, i + 1),
    +                                    x2 - x1);
    +
    +            for (j = x1; j < x2; j++)
    +              {
    +                /* For each layer, compute the average of the nine
    +                 * pixels */
    +                for (k = 0; k < channels; k++)
    +                  {
    +                    int sum = 0;
    +                    sum = row1[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                          row1[channels * (j - x1) + k]                        +
    +                          row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
    +                          row2[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                          row2[channels * (j - x1) + k]                        +
    +                          row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
    +                          row3[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                          row3[channels * (j - x1) + k]                        +
    +                          row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k];
    +                    outrow[channels * (j - x1) + k] = sum / 9;
    +                  }
    +
    +             }
    +
    +             gimp_pixel_rgn_set_row (&rgn_out,
    +                                     outrow,
    +                                     x1, i,
    +                                     x2 - x1);
    +
    +             if (i % 10 == 0)
    +                  gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1));
    +        }
    +
    +        g_free (row1);
    +        g_free (row2);
    +        g_free (row3);
    +        g_free (outrow);
    +
    +        gimp_drawable_flush (drawable);
    +        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +        gimp_drawable_update (drawable->drawable_id,
    +                              x1, y1,
    +                              x2 - x1, y2 - y1);
    +      }
    +
    + +Have a look at the [[Hacking:slow_plug-in|slow]] or [[Hacking:fast_plug-in|fast]] blur complete code. + + + +Next part + +In next part, we will see how to process the image tile by tile. We will also have a look at preferences, by modifying our algorithm so it can take an input parameter. + + +=Tile processing, input parameters= + +In the second part, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. + + +==Introduction== + +Let's have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer's pixel value with the average value in the neighbourhood. + +It's a bit more complex than that - we have to be careful near image borders for example, but this algorithm makes a blur effect that is not so bad in general. + +But until now, we wrote the algorithm for a 3x3 neighbourhood. Time has come to generalise this part and to introduce the radius as a parameter. + +First, a word on tiles. + + +==Tile management== + +A tile is an image data block with a 64x64 size. Usually, tiles are sent to the plug-in on demand one by one, by shared memory. Of course this process needs huge resources and should be avoided. + +Usually, one doesn't need any particular cache, each tile is sent when one needs it and freed when one asks for another one. Nevertheless, we can tell our plug-in to keep a tile cache to avoid this constant round trip, by calling the function: + +
        
    +      gimp_tile_cache_ntiles (gulong ntiles);
    +
    + +In the second part example, we called gimp_pixel_rgn_get_row() and gimp_pixel_rgn_set_row() but without using any cache. + +The number of tiles in a tile row will be the layer width divided by the tile width, plus one. So, for a layer width of 65, we will cache two tiles. As we usually also process shadow tiles, we can double that number to compute the ideal cache size for our plug-in. + +
      
    +      gimp_tile_cache_ntiles (2 * (drawable->width / 
    +                              gimp_tile_width () + 1));
    +
    + +With the cache, our slow plug-in becomes fast. On a 300x300 selection, our last blur took 3 seconds, but on a 2000x1500 selection it was much slower - 142 seconds. + +Adding the above line of code, things are getting better: 11 seconds. We still lose transition time when we reach tile borders, we can go down to 10 seconds when multiplying by 4 instead of 2 (meaning we cache two tiles rows), but the more tiles we cache, the more hard disk access we make, which reduce the time gain at a point. + + +==Algorithm generalisation== + +We can modify the algorithm to take a parameter into account: radius. With a radius of 3, the neighbourhood of a pixel will be 7x7, instead of 3x3 with a radius of 1. To achieve this I modify the previous algorithm: + + +* allocate space for 2r+1 tile rows +* initialise this rows array, taking care of borders +* for each tile row +: +** for each pixel in the tile row +*** compute the neighbourhood average, taking care of borders +** compute the neighbourhood average, taking care of borders +** get a new tile row and cycle rows +* : +** compute the neighbourhood average, taking care of borders +** for each pixel in the tile row +*** compute the neighbourhood average, taking care of borders +** compute the neighbourhood average, taking care of borders +** get a new tile row and cycle rows +* for each pixel in the tile row +** compute the neighbourhood average, taking care of borders +* compute the neighbourhood average, taking care of borders +* get a new tile row and cycle rows +** compute the neighbourhood average, taking care of borders +* compute the neighbourhood average, taking care of borders + +This algorithm is more complex than the last one, because the average computing will be a O(r²) algorithm. + +The modified code to get this behaviour is below. Most of the work is done in the process_row function. init_mem and shuffle are there to keep the blur code clean and small. + +
    +      static void blur        (GimpDrawable *drawable);
    +
    +      static void init_mem    (guchar     ***row,
    +                               guchar      **outrow,
    +                               gint          num_bytes);
    +      static void process_row (guchar      **row,
    +                               guchar       *outrow,
    +                               gint          x1,
    +                               gint          y1,
    +                               gint          width,
    +                               gint          height,
    +                               gint          channels,
    +                               gint          i);
    +      static void shuffle     (GimpPixelRgn *rgn_in,
    +                               guchar      **row,
    +                               gint          x1,
    +                               gint          y1,
    +                               gint          width,
    +                               gint          height,
    +                               gint          ypos);
    +
    +      /* The radius is still a constant, we'll change that when the
    +       * graphical interface will be built. */
    +      static gint radius = 3;
    +      ...
    +
    +      static void
    +      blur (GimpDrawable *drawable)
    +      {
    +        gint         i, ii, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar     **row;
    +        guchar      *outrow;
    +        gint         width, height;
    +
    +        gimp_progress_init ("My Blur...");
    +
    +        /* Gets upper left and lower right coordinates,
    +         * and layers number in the image */
    +        gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                   &x1, &y1,
    +                                   &x2, &y2);
    +        width  = x2 - x1;
    +        height = y2 - y1;
    +
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        /* Allocate a big enough tile cache */
    +        gimp_tile_cache_ntiles (2 * (drawable->width /
    +                                     gimp_tile_width () + 1));
    +
    +        /* Initialises two PixelRgns, one to read original data,
    +         * and the other to write output data. That second one will
    +         * be merged at the end by the call to
    +         * gimp_drawable_merge_shadow() */
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             TRUE, TRUE);
    +
    +        /* Allocate memory for input and output tile rows */
    +        init_mem (&row, &outrow, width * channels);
    +
    +        for (ii = -radius; ii <= radius; ii++)
    +          {
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row[radius + ii],
    +                                    x1, y1 + CLAMP (ii, 0, height - 1), 
    +                                    width);
    +          }
    +
    +        for (i = 0; i < height; i++)
    +          {
    +            /* To be done for each tile row */
    +            process_row (row,
    +                         outrow,
    +                         x1, y1,
    +                         width, height,
    +                         channels,
    +                         i);
    +            gimp_pixel_rgn_set_row (&rgn_out,
    +                                    outrow,
    +                                    x1, i + y1,
    +                                    width);
    +            /* shift tile rows to insert the new one at the end */
    +            shuffle (&rgn_in,
    +                     row,
    +                     x1, y1,
    +                     width, height,
    +                     i);
    +            if (i % 10 == 0)
    +              gimp_progress_update ((gdouble) i / (gdouble) height);
    +          }
    +
    +        /* We could also put that in a separate function but it's
    +         * rather simple */
    +        for (ii = 0; ii < 2 * radius + 1; ii++)
    +          g_free (row[ii]);
    +
    +        g_free (row);
    +        g_free (outrow);
    +
    +        /*  Update the modified region */
    +        gimp_drawable_flush (drawable);
    +        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +        gimp_drawable_update (drawable->drawable_id,
    +                              x1, y1,
    +                              width, height);
    +      }
    +
    +      static void
    +      init_mem (guchar ***row,
    +                guchar  **outrow,
    +                gint      num_bytes)
    +      {
    +        gint i;
    +
    +        /* Allocate enough memory for row and outrow */
    +        *row = g_new (char *, (2 * radius + 1));
    +
    +        for (i = -radius; i <= radius; i++)
    +          (*row)[i + radius] = g_new (guchar, num_bytes);
    +
    +        *outrow = g_new (guchar, num_bytes);
    +      }
    +
    +      static void
    +      process_row (guchar **row,
    +                   guchar  *outrow,
    +                   gint     x1,
    +                   gint     y1,
    +                   gint     width,
    +                   gint     height,
    +                   gint     channels,
    +                   gint     i)
    +      {
    +        gint j;
    +
    +        for (j = 0; j < width; j++)
    +          {
    +            gint k, ii, jj;
    +            gint left = (j - radius),
    +                 right = (j + radius);
    +
    +            /* For each layer, compute the average of the
    +             * (2r+1)x(2r+1) pixels */
    +            for (k = 0; k < channels; k++)
    +              {
    +                gint sum = 0;
    +
    +                for (ii = 0; ii < 2 * radius + 1; ii++)
    +                  for (jj = left; jj <= right; jj++)
    +                    sum += row[ii][channels * CLAMP (jj, 0, width - 1) + k];
    +
    +                outrow[channels * j + k] =
    +                  sum / (4 * radius * radius + 4 * radius + 1);
    +              }
    +          }
    +      }
    +
    +      static void
    +      shuffle (GimpPixelRgn *rgn_in,
    +               guchar      **row,
    +               gint          x1,
    +               gint          y1,
    +               gint          width,
    +               gint          height,
    +               gint          ypos)
    +      {
    +        gint    i;
    +        guchar *tmp_row;
    +
    +        /* Get tile row (i + radius + 1) into row[0] */
    +        gimp_pixel_rgn_get_row (rgn_in,
    +                                row[0],
    +                                x1, MIN (ypos + radius + y1, y1 + height - 1),
    +                                width);
    +
    +        /* Permute row[i] with row[i-1] and row[0] with row[2r] */
    +        tmp_row = row[0];
    +        for (i = 1; i < 2 * radius + 1; i++)
    +          row[i - 1] = row[i];
    +        row[2 * radius] = tmp_row;
    +      }
    +
    + +==Adding a graphical interface and saving parameters== + +To let the user modify the radius, or let a non-interactive script give it as a parameter, we now need to get back to our run() function and settle some simple things. + +First we create a structure to allow saving and returning options. Usually one does this even for plug-ins with only one parameter. + +
        
    +      typedef struct
    +      {
    +        gint radius;
    +      } MyBlurVals;
    +
    +
    +      /* Set up default values for options */
    +      static MyBlurVals bvals =
    +      {
    +        3  /* radius */
    +      };
    +
    + +Next, we modify the run() function so that execution modes are taken into account. In interactive mode and repeat last filter mode, we try to get the last values used by the gimp_get_data() function, which takes a unique data identifier as its first input parameter. Usually, one uses the procedure's name. + +Finally, in interactive mode, we add a few lines that will build the graphical interface allowing options modification. + +
        
    +      static void
    +      run (const gchar      *name,
    +           gint              nparams,
    +           const GimpParam  *param,
    +           gint             *nreturn_vals,
    +           GimpParam       **return_vals)
    +      {
    +        static GimpParam  values[1];
    +        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +        GimpRunMode       run_mode;
    +        GimpDrawable     *drawable;
    +
    +        /* Setting mandatory output values */
    +        *nreturn_vals = 1;
    +        *return_vals  = values;
    +
    +        values[0].type = GIMP_PDB_STATUS;
    +        values[0].data.d_status = status;
    +
    +        /* Getting run_mode - we won't display a dialog if 
    +         * we are in NONINTERACTIVE mode */
    +        run_mode = param[0].data.d_int32;
    +
    +        /*  Get the specified drawable  */
    +        drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +        switch (run_mode)
    +          {
    +          case GIMP_RUN_INTERACTIVE:
    +            /* Get options last values if needed */
    +            gimp_get_data ("plug-in-myblur", &bvals);
    +
    +            /* Display the dialog */
    +            if (! blur_dialog (drawable))
    +              return;
    +            break;
    +
    +          case GIMP_RUN_NONINTERACTIVE:
    +            if (nparams != 4)
    +              status = GIMP_PDB_CALLING_ERROR;
    +            if (status == GIMP_PDB_SUCCESS)
    +              bvals.radius = param[3].data.d_int32;
    +            break;
    +
    +          case GIMP_RUN_WITH_LAST_VALS:
    +            /*  Get options last values if needed  */
    +            gimp_get_data ("plug-in-myblur", &bvals);
    +            break;
    +
    +          default:
    +            break;
    +          }
    +
    +        blur (drawable);
    +
    +        gimp_displays_flush ();
    +        gimp_drawable_detach (drawable);
    +
    +        /*  Finally, set options in the core  */
    +        if (run_mode == GIMP_RUN_INTERACTIVE)
    +          gimp_set_data ("plug-in-myblur", &bvals, sizeof (MyBlurVals));
    +
    +        return;
    +      }
    +
    + +==The graphical interface== + +I won't detail GTK+ programming as this is done very well in other places. Our first try will be very simple. We will use the utility widget of GIMP, the GimpDialog, to create a window with a header, a numeric control of type GtkSpinButton (associated with a GtkAdjustment) and its label, nicely framed in a GtkFrame. + +In the following parts, in order to show how easy one can do such things, I will add a preview in the dialog to show real time effects of the parameters. + +Our final dialog will look like this (tree generated with Glade): + +[[File:Glade-tree.png|Glade tree]] + +Glade tree + +In The GIMP 2.2, there is a number of widgets that come bundled with parameters that allow a coherent behaviour, consistent with GNOME Human Interface Guidelines. GimpPreview also appeared in 2.2. Let's make a first try without it: + +[[File:Blur_dialog1.png|Blur dialog]] + +Blur dialog + +
        
    +      static gboolean
    +      blur_dialog (GimpDrawable *drawable)
    +      {
    +        GtkWidget *dialog;
    +        GtkWidget *main_vbox;
    +        GtkWidget *main_hbox;
    +        GtkWidget *frame;
    +        GtkWidget *radius_label;
    +        GtkWidget *alignment;
    +        GtkWidget *spinbutton;
    +        GtkObject *spinbutton_adj;
    +        GtkWidget *frame_label;
    +        gboolean   run;
    +
    +        gimp_ui_init ("myblur", FALSE);
    +
    +        dialog = gimp_dialog_new ("My blur", "myblur",
    +                                  NULL, 0,
    +                                  gimp_standard_help_func, "plug-in-myblur",
    +
    +                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    +                                  GTK_STOCK_OK,     GTK_RESPONSE_OK,
    +
    +                                  NULL);
    +
    +        main_vbox = gtk_vbox_new (FALSE, 6);
    +        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
    +        gtk_widget_show (main_vbox);
    +
    +        frame = gtk_frame_new (NULL);
    +        gtk_widget_show (frame);
    +        gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
    +        gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
    +
    +        alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
    +        gtk_widget_show (alignment);
    +        gtk_container_add (GTK_CONTAINER (frame), alignment);
    +        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6);
    +
    +        main_hbox = gtk_hbox_new (FALSE, 0);
    +        gtk_widget_show (main_hbox);
    +        gtk_container_add (GTK_CONTAINER (alignment), main_hbox);
    +
    +        radius_label = gtk_label_new_with_mnemonic ("_Radius:");
    +        gtk_widget_show (radius_label);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6);
    +        gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT);
    +
    +        spinbutton_adj = gtk_adjustment_new (3, 1, 16, 1, 5, 5);
    +        spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
    +        gtk_widget_show (spinbutton);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 6);
    +        gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
    +
    +        frame_label = gtk_label_new ("Modify radius");
    +        gtk_widget_show (frame_label);
    +        gtk_frame_set_label_widget (GTK_FRAME (frame), frame_label);
    +        gtk_label_set_use_markup (GTK_LABEL (frame_label), TRUE);
    +
    +        g_signal_connect (spinbutton_adj, "value_changed",
    +                          G_CALLBACK (gimp_int_adjustment_update),
    +                          &bvals.radius);
    +        gtk_widget_show (dialog);
    +
    +        run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
    +
    +        gtk_widget_destroy (dialog);
    +
    +        return run;
    +      }
    +
    + +==Adding a GimpPreview== + +Adding a GimpPreview is quite easy. First we create a GtkWidget with gimp_drawable_preview_new(), then we attach an invalidated signal to it, which will call the blur function to update the preview. We also add a second parameter to MyBlurVals to remember the activation state of the preview. + +A method to update easily the preview is to add a preview parameter in the blur function, and if preview is not NULL, to take GimpPreview limits. So when we call blur from run(), we set the preview parameter to NULL. + +To take GimpPreview limits, we use gimp_preview_get_position() and gimp_preview_get_size(), so we can generate only what will be displayed. + +To achieve this the right way we'll tune some of the code - we don't need to update the progress bar while generating the preview, and we should tell at GimpPixelRgn init time that the tiles should not be sent back to the core. + +Finally, we display the updated preview with the gimp_drawable_preview_draw_region() function. We get a dialog box that shows us in real time the plug-in effects. Moreover, thanks to the GIMP core, our plug-in already takes selections into account. + +[[File:Blur_dialog2.png|Blur dialog, improved]] + +Blur dialog, improved + +[[File:Blur_select.png|Blur a selection]] + +Blur a selection + +Here are the two functions in their last version: + +
        
    +      static void
    +      blur (GimpDrawable *drawable,
    +            GimpPreview  *preview)
    +      {
    +        gint         i, ii, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar     **row;
    +        guchar      *outrow;
    +        gint         width, height;
    +
    +        if (!preview)
    +          gimp_progress_init ("My Blur...");
    +
    +        /* Gets upper left and lower right coordinates,
    +         * and layers number in the image */
    +        if (preview)
    +        {
    +          gimp_preview_get_position (preview, &x1, &y1);
    +          gimp_preview_get_size (preview, &width, &height);
    +          x2 = x1 + width;
    +          y2 = y1 + height;
    +        }
    +        else
    +        {
    +          gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                     &x1, &y1,
    +                                     &x2, &y2);
    +          width = x2 - x1;
    +          height = y2 - y1;
    +        }
    +
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        /* Allocate a big enough tile cache */
    +        gimp_tile_cache_ntiles (2 * (drawable->width / 
    +                                     gimp_tile_width () + 1));
    +
    +        /* Initialises two PixelRgns, one to read original data,
    +         * and the other to write output data. That second one will
    +         * be merged at the end by the call to
    +         * gimp_drawable_merge_shadow() */
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             preview == NULL, TRUE);
    +
    +        /* Allocate memory for input and output tile rows */
    +        init_mem (&row, &outrow, width * channels);
    +        
    +        for (ii = -bvals.radius; ii <= bvals.radius; ii++)
    +          {
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row[bvals.radius + ii],
    +                                    x1, y1 + CLAMP (ii, 0, height - 1), 
    +                                    width);
    +          }
    +
    +        for (i = 0; i < height; i++)
    +          {
    +            /* To be done for each tile row */
    +            process_row (row,
    +                         outrow,
    +                         x1, y1,
    +                         width, height,
    +                         channels,
    +                         i);
    +            gimp_pixel_rgn_set_row (&rgn_out,
    +                                    outrow,
    +                                    x1, i + y1,
    +                                    width);
    +            /* shift tile rows to insert the new one at the end */
    +            shuffle (&rgn_in,
    +                     row,
    +                     x1, y1,
    +                     width, height,
    +                     i);
    +            if (i % 10 == 0 && !preview)
    +              gimp_progress_update ((gdouble) i / (gdouble) height);
    +          }
    +
    +        for (ii = 0; ii < 2 * bvals.radius + 1; ii++)
    +          g_free (row[ii]);
    +
    +        g_free (row);
    +        g_free (outrow);
    +
    +        /*  Update the modified region  */
    +        if (preview)
    +          {
    +            gimp_drawable_preview_draw_region (GIMP_DRAWABLE_PREVIEW (preview),
    +                                               &rgn_out);
    +          }
    +        else
    +          {
    +            gimp_drawable_flush (drawable);
    +            gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +            gimp_drawable_update (drawable->drawable_id,
    +                                  x1, y1,
    +                                  width, height);
    +          }
    +      }
    +
    +      static gboolean
    +      blur_dialog (GimpDrawable *drawable)
    +      {
    +        GtkWidget *dialog;
    +        GtkWidget *main_vbox;
    +        GtkWidget *main_hbox;
    +        GtkWidget *preview;
    +        GtkWidget *frame;
    +        GtkWidget *radius_label;
    +        GtkWidget *alignment;
    +        GtkWidget *spinbutton;
    +        GtkObject *spinbutton_adj;
    +        GtkWidget *frame_label;
    +        gboolean   run;
    +
    +        gimp_ui_init ("myblur", FALSE);
    +
    +        dialog = gimp_dialog_new ("My blur", "myblur",
    +                                  NULL, 0,
    +                                  gimp_standard_help_func, "plug-in-myblur",
    +
    +                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    +                                  GTK_STOCK_OK,     GTK_RESPONSE_OK,
    +
    +                                  NULL);
    +
    +        main_vbox = gtk_vbox_new (FALSE, 6);
    +        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
    +        gtk_widget_show (main_vbox);
    +
    +        preview = gimp_drawable_preview_new (drawable, &bvals.preview);
    +        gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0);
    +        gtk_widget_show (preview);
    +
    +        frame = gimp_frame_new ("Blur radius");
    +        gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
    +        gtk_widget_show (frame);
    +
    +        alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
    +        gtk_widget_show (alignment);
    +        gtk_container_add (GTK_CONTAINER (frame), alignment);
    +        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6);
    +
    +        main_hbox = gtk_hbox_new (FALSE, 12);
    +        gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
    +        gtk_widget_show (main_hbox);
    +        gtk_container_add (GTK_CONTAINER (alignment), main_hbox);
    +
    +        radius_label = gtk_label_new_with_mnemonic ("_Radius:");
    +        gtk_widget_show (radius_label);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6);
    +        gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT);
    +
    +        spinbutton = gimp_spin_button_new (&spinbutton_adj, bvals.radius, 
    +                                           1, 32, 1, 1, 1, 5, 0);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 0);
    +        gtk_widget_show (spinbutton);
    +
    +        g_signal_connect_swapped (preview, "invalidated",
    +                                  G_CALLBACK (blur),
    +                                  drawable);
    +        g_signal_connect_swapped (spinbutton_adj, "value_changed",
    +                                  G_CALLBACK (gimp_preview_invalidate),
    +                                  preview);
    +
    +        blur (drawable, GIMP_PREVIEW (preview));
    +
    +        g_signal_connect (spinbutton_adj, "value_changed",
    +                          G_CALLBACK (gimp_int_adjustment_update),
    +                          &bvals.radius);
    +        gtk_widget_show (dialog);
    +
    +        run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
    +
    +        gtk_widget_destroy (dialog);
    +
    +        return run;
    +      }
    +
    + +Have a look at the tiled, UI or preview blur complete code. + + +==Conclusion== + +In these articles, we saw basic concepts for several aspects of a GIMP plug-in. We messed with image data treatment through a simple algorithm, and followed a path that showed us how to avoid performance problems. Finally, we generalised the algorithm and added parameters to it, and we used some GIMP widgets to make a nice user interface. + + +==Thanks== + +Thanks to my wife Anne and to David Odin (preview master) for helping me while I was writing this article. + + + +[[File:Somerights20.gif|Creative Commons License]] + +This work is licensed under a [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License]. + + \ No newline at end of file diff --git a/wiki/Hacking:How_to_write_a_GIMP_plug-in-20150910163259-edit.txt b/wiki/Hacking:How_to_write_a_GIMP_plug-in-20150910163259-edit.txt new file mode 100644 index 0000000..907e53a --- /dev/null +++ b/wiki/Hacking:How_to_write_a_GIMP_plug-in-20150910163259-edit.txt @@ -0,0 +1,1214 @@ +Written by [mailto:bolsh@NOSPAM.gimp.org Dave Neary]. + +__TOC__ + + +=Essentials= +In this article, I present GIMP plug-ins basics and introduce the libgimp API. I will also show how to use the PDB to make our plug-in available to other script authors. + +==Introduction== + +New developers are often intimidated by The GIMP size and its reputation. They think that writing a plug-in would be a difficult task. The goal of these articles is to dumb this feeling down, by showing how easily one can make a C plug-in. + +In this part, I present a plug-in's basic elements. We will see how to install a plug-in and how to get data from an image and directly manipulate it. + + +==Architecture== + +[[File:Architecture.png|257px|Architecture]] + + +The GIMP script interface is centered on the Procedural database (PDB). At startup, The GIMP looks into a predefined set of places for scripts and plug-ins, and asks each new script to identify itself. + +The plug-in declares itself to the PDB at that time, and passes informations like the position it wishes to get in the menu hierarchy, input parameters, and output parameters. + +When a script or a plug-in wants to use our plug-in, it gets through the PDB, which manages communicating parameters in one direction and the other in a transparent way. + +Internal functions that wish to get exposed to plug-ins have to be packaged first in the core, that will register them in the PDB, and secondly in the libgimp that will allow the function to be called as a normal one. + +This was the introduction - now, we will look closer at our first plug-in, a "Hello, world!". + + +==Compiling the plug-in== + +To be able to compile simple plug-ins for The GIMP, one needs libgimp headers, as well as an associated utility named gimptool. + +With that utility, one can install a plug-in either in a private directory (~/.gimp-2.0/plug-ins), or in the global plug-in directory. + +Syntax is +
        
    +       gimptool-2.0 --install plugin.c or gimptool-2.0 --install-admin plugin.c
    +
    + +This utility, with other options, can also be used to install scripts, or uninstall plug-ins. + + +==Behaviour== + +A GIMP plug-in can typically behave three different ways. It can take image data, modify it, and send back the modified image, like edge detection. It can generate an image and send it back, like some script-fus, or file reading plug-ins like jpeg. Or it can get an image, and process it without modifying its data, like a file saver plug-in. + + +==Essentials== +
    +      #include 
    +
    + +This header makes all basic plug-in elements available to us. + +
        
    +      GimpPlugInInfo PLUG_IN_INFO = {
    +        init,
    +        quit,
    +        query,
    +        run
    +      };
    +
    + +This structure has to have that name. It contains four pointers to functions, which will be called at set times of the plug-in life. init and quit are optional, and thus can hold NULL values, but the last two functions, query and run, are mandatory. + +The '''init()''' function is called each time The GIMP starts up. This function is not typically used. Some plug-ins use it to make a secondary search that is not done by the core. This function is not used by any standard GIMP plug-in, but could be useful for example for a plug-in that would like to register some procedure conditionally on some files presence. + +The '''quit()''' function is not used much either. It is called when The GIMP is about to be closed, to allow it to free some resources. It is used in the script-fu plug-in. + +The '''query()''' function is called the first time the plug-in is present, and then each time the plug-in changes. + +The '''run()''' function is the plug-in's centrepiece. It is called when the plug-in is asked to run. It gets the plug-in name (as a plug-in can register several procedures), input parameters, and a pointer to output parameters, then determines if it is launched in a interactive way or by a script, and does all the plug-in processing. Its prototype is +
        
    +      void run (const gchar      *name,
    +                gint              nparams,
    +                const GimpParam  *param,
    +                gint             *nreturn_vals,
    +                GimpParam       **return_vals);
    +
    + + +==MAIN ()== + +MAIN is a C macro that holds a bit of dark magic to initialise arguments. It also calls the appropriate PLUG_IN_INFO function depending on the timing. Your plug-in needs it. + +==The query() function== + +query() deals with the procedure registration and input arguments definition. These informations are saved to speed up startup time, and refreshed only when the plug-in is modified. + +For our "Hello, world!" plug-in, the query function will look like this: +
        
    +      static void
    +      query (void)
    +        {
    +          static GimpParamDef args[] = {
    +            {
    +              GIMP_PDB_INT32,
    +              "run-mode",
    +              "Run mode"
    +            },
    +            {
    +              GIMP_PDB_IMAGE,
    +              "image",
    +              "Input image"
    +            },
    +            {
    +              GIMP_PDB_DRAWABLE,
    +              "drawable",
    +              "Input drawable"
    +            }
    +          };
    +
    +          gimp_install_procedure (
    +            "plug-in-hello",
    +            "Hello, world!",
    +            "Displays \"Hello, world!\" in a dialog",
    +            "David Neary",
    +            "Copyright David Neary",
    +            "2004",
    +            "_Hello world...",
    +            "RGB*, GRAY*",
    +            GIMP_PLUGIN,
    +            G_N_ELEMENTS (args), 0,
    +            args, NULL);
    +
    +            gimp_plugin_menu_register ("plug-in-hello",
    +                                       "/Filters/Misc"); 
    +        }
    +
    + +GimpParamDef contains three things - the parameter type, its name, and a string describing the parameter. + +gimp_install_procedure declares the procedure name, some description and help strings, menu path where the plug-in should sit, image types handled by the plug-in, and at the end, input and output parameters number, as well as the parameters descriptors. + +"RGB*, GRAY*" declares the image types handled. It can be RGB, INDEXED or GRAY, with or without Alpha. So "RGB*, GRAY*" describes RGB, RGBA, GRAY or GRAY image type. + +GIMP_PLUGIN declares this procedure to be external, and not to be executed in The GIMP core. + +By adding a stub run function now, we can check that our plug-in has all the essential elements, and test that it registers itself in the PDB with the "Xtns->Plug-in Details" plug-in. + +[[File:plug-in-details.png|315px|Plug-in details]] + +Plug-in details + +[[File:plug-in-menu.png|381px|Our plug-in is in the menus]] + +Our plug-in is in the menus + +==The run() function== + +The other required function for PLUG_IN_INFO is run. The core of the plug-in stands there. + +Output values (return_vals in the prototype) must have at least one value associated - the plug-in status. Typically, this parameter will hold "GIMP_PDB_SUCCESS". + + +==Run-modes== + +One can run a plug-in in several different ways, it can be run from a GIMP menu if The GIMP is run interactively, or from a script or a batch, or from the "Filters->Repeat Last" shortcut. + +The "run_mode" input parameter can hold one of these values: "GIMP_RUN_INTERACTIVE", "GIMP_RUN_NONINTERACTIVE" or "GIMP_RUN_WITH_LAST_VALS". + +"GIMP_RUN_INTERACTIVE" is typically the only case where one creates an options dialog. Otherwise, one directly calls the processing with values from input parameters or from memory. + +For our test plug-in, we will simply display a dialog containing a "Hello, world!" message. Thankfully, this is really easy with GTK+. Our run function could be: +
        
    +      static void
    +      run (const gchar      *name,
    +           gint              nparams,
    +           const GimpParam  *param,
    +           gint             *nreturn_vals,
    +           GimpParam       **return_vals)
    +      {
    +        static GimpParam  values[1];
    +        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +        GimpRunMode       run_mode;
    +
    +        /* Setting mandatory output values */
    +        *nreturn_vals = 1;
    +        *return_vals  = values;
    +
    +        values[0].type = GIMP_PDB_STATUS;
    +        values[0].data.d_status = status;
    +
    +        /* Getting run_mode - we won't display a dialog if 
    +         * we are in NONINTERACTIVE mode */
    +        run_mode = param[0].data.d_int32;
    +
    +        if (run_mode != GIMP_RUN_NONINTERACTIVE)
    +          g_message("Hello, world!\n");
    +      }
    +
    + + +Now, when we run our plug-in, there is action: + +[[File:hello.png|Hello, world!]] + +Have a look at the full hello.c plug-in code. + +Next part +In the next part we will go on, making a more useful plug-in that will get its hands on image data. We will see how to use The GIMP image architecture to make the plug-in perform better, processing the image tile by tile. + +=Processing images= + +==Introduction== + +The algorithm we are going to implement is a simple blur. It is included in The GIMP as "Filters->Blur->Blur" with default parameters. + +That algorithm is very simple. Each pixel in our image is replaced by a mean value of its neighbours. For example, if we look at the simplest case where the neighbourhood is 3x3 (see figure 1), in that case the center value will be replaced with 5, the mean of the 9 numbers in its neighbourhood. + +With this method, edge differences are splatted, giving a blurred result. One can choose another radius, using a (2r + 1) x (2r + 1) matrix. + +==Image structure== + +Last month, we wrote a run() function that did nothing useful. Let's look again at run() prototype: +
        
    +      static void run (const gchar     *name,
    +                       gint             nparams,
    +                       const GimpParam *param,
    +                       gint            *nreturn_vals,
    +                       GimpParam      **return_vals);
    +
    + +We saw that for a filter (i.e. a plug-in that modifies the image), the first three input parameters were the run mode, an identifier for the image, and another one for the active drawable (layer or mask). + +A GIMP image is a structure that contains, among others, guides, layers, layer masks, and any data associated to the image. The word "drawable" is often used in GIMP internal structures. A "drawable" is an object where you can get, and sometimes modify, raw data. So : layers, layer masks, selections are all "drawables". + +[[File:GimpImage.png|194px|Drawables]] + +Drawables + +==Accessing the data== + +To get a GimpDrawable from its identifier, we need the gimp_drawable_get() function: +
        
    +      GimpDrawable *gimp_drawable_get (gint32 drawable_id);
    +
    + +From this structure, one can access drawable data through a GimpPixelRgn structure, and one can check the drawable type (RGB, gray level). The full listing of functions available for a GimpDrawable can be found in the API. + +Two very important functions for plug-ins are gimp_drawable_mask_bounds() and gimp_pixel_rgn_init(). The first gives the active selection limits on the drawable, and the second initialises the GimpPixelRgn we will use to access the data. + +As soon as we have a well initialised GimpPixelRgn, we can access the image data in several different ways, by pixel, by rectangle, by row or by column. The best method will depend on the algorithm one plans to use. Moreover, The GIMP uses a tile-based architecture, and loading or unloading data is expensive, so we should not use it more than necessary. + +[[File:tiles.png|323px|Tiles]] + +Tiles + +The main functions to get and set image data are: +
        
    +      void gimp_pixel_rgn_get_pixel (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y);
    +      void gimp_pixel_rgn_get_row   (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width);
    +      void gimp_pixel_rgn_get_col   (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          height);
    +      void gimp_pixel_rgn_get_rect  (GimpPixelRgn *pr,
    +                                     guchar       *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width,
    +                                     gint          height);
    +      void gimp_pixel_rgn_set_pixel (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y);
    +      void gimp_pixel_rgn_set_row   (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width);
    +      void gimp_pixel_rgn_set_col   (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          height);
    +      void gimp_pixel_rgn_set_rect  (GimpPixelRgn *pr,
    +                                     const guchar *buf,
    +                                     gint          x,
    +                                     gint          y,
    +                                     gint          width,
    +                                     gint          height);
    +
    + +There is also another way to access image data (it's even used more often), that allows to manage data at the tile level. We will look at it in detail later. + +==Updating the image== + +At last, a plug-in that has modified a drawable data must flush it to send data to the core, and to tell the application that the display must be updated. This is done with the following function: +
        
    +      gimp_displays_flush ();
    +      gimp_drawable_detach (drawable);
    +
    + +==Implementing blur()== + +To be able to try out several different processing methods, we will delegate the job to a blur() function. Our run() is below. +
        
    +      static void
    +      run (const gchar      *name,
    +           gint              nparams,
    +           const GimpParam  *param,
    +           gint             *nreturn_vals,
    +           GimpParam       **return_vals)
    +      {
    +        static GimpParam  values[1];
    +        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +        GimpRunMode       run_mode;
    +        GimpDrawable     *drawable;
    +
    +        /* Setting mandatory output values */
    +        *nreturn_vals = 1;
    +        *return_vals  = values;
    +
    +        values[0].type = GIMP_PDB_STATUS;
    +        values[0].data.d_status = status;
    +
    +        /* Getting run_mode - we won't display a dialog if 
    +         * we are in NONINTERACTIVE mode */
    +        run_mode = param[0].data.d_int32;
    +
    +        /*  Get the specified drawable  */
    +        drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +        gimp_progress_init ("My Blur...");
    +
    +        /* Let's time blur
    +         *
    +         *   GTimer timer = g_timer_new time ();
    +         */
    +
    +        blur (drawable);
    +
    +        /*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
    +         *   g_timer_destroy (timer);
    +         */
    +
    +        gimp_displays_flush ();
    +        gimp_drawable_detach (drawable);
    +      }
    +
    + +There are a few lines here that need to be explained a bit more. The call to gimp_progress_init() initialises a progress measurement for our plug-in. Later, if we call gimp_progress_update(double percent), the percentage given as an input parameter will be shown graphically. The run_mode tells us whether the plug-in was launched in a way such as we can display a graphical interface or not. Possible values are GIMP_RUN_INTERACTIVE, GIMP_RUN_NONINTERACTIVE or GIMP_RUN_WITH_LAST_VALS, which mean the plug-in was executed from The GIMP, from a script, or from the "Repeat last filter" menu entry. + +Regarding the blur algorithm itself, the first version using gimp_pixel_rgn_(get|set)_pixel() is found below. Some functions in it have not been explained yet. + +gimp_drawable_mask_bounds() allows calculation of the filter's effect limits, excluding any region that is not in the active selection. Limiting the processing this way allows an important performance improvement. + +gimp_pixel_rgn_init() takes as input parameters the drawable, its limits for the processing, and two booleans that significantly modify the behaviour of the resulting GimpPixelRgn. The first one tells that "set" operations must be done on shadow tiles, in order to leave original data as is until gimp_drawable_merge_shadow() is called, when all modified data will be merged. The second one tells that modified tiles should be tagged "dirty" and sent to the core to be merged. Most of the time, to read data, one uses FALSE and FALSE for these two parameters, and to write data, one uses TRUE and TRUE. Other combinations are possible but seldom used. +
        
    +      static void
    +      blur (GimpDrawable *drawable)
    +      {
    +        gint         i, j, k, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar       output[4];
    +
    +        /* Gets upper left and lower right coordinates,
    +         * and layers number in the image */
    +        gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                   &x1, &y1,
    +                                   &x2, &y2);
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        /* Initialises two PixelRgns, one to read original data,
    +         * and the other to write output data. That second one will
    +         * be merged at the end by the call to
    +         * gimp_drawable_merge_shadow() */
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1, 
    +                             TRUE, TRUE);
    +
    +        for (i = x1; i < x2; i++)
    +          {
    +            for (j = y1; j < y2; j++)
    +              {
    +                guchar pixel[9][4];
    +
    +                /* Get nine pixels */
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[0],
    +                                          MAX (i - 1, x1),
    +                                          MAX (j - 1, y1));
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[1],
    +                                          MAX (i - 1, x1),
    +                                          j);
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[2],
    +                                          MAX (i - 1, x1),
    +                                          MIN (j + 1, y2 - 1));
    +
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[3],
    +                                          i,
    +                                          MAX (j - 1, y1));
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[4],
    +                                          i,
    +                                          j);
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[5],
    +                                          i,
    +                                          MIN (j + 1, y2 - 1));
    +
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[6],
    +                                          MIN (i + 1, x2 - 1),
    +                                          MAX (j - 1, y1));
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[7],
    +                                          MIN (i + 1, x2 - 1),
    +                                          j);
    +                gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                          pixel[8],
    +                                          MIN (i + 1, x2 - 1),
    +                                          MIN (j + 1, y2 - 1));
    +
    +                /* For each layer, compute the average of the
    +                 * nine */
    +                for (k = 0; k < channels; k++)
    +                  {
    +                    int tmp, sum = 0;
    +                    for (tmp = 0; tmp < 9; tmp++)
    +                      sum += pixel[tmp][k];
    +                    output[k] = sum / 9;
    +                  }
    +
    +                gimp_pixel_rgn_set_pixel (&rgn_out,
    +                                          output,
    +                                          i, j);
    +              }
    +
    +            if (i % 10 == 0)
    +              gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1));
    +          }
    +
    +        /*  Update the modified region */
    +        gimp_drawable_flush (drawable);
    +        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +        gimp_drawable_update (drawable->drawable_id,
    +                              x1, y1,
    +                              x2 - x1, y2 - y1);
    +      }
    +
    + +==Row processing== + +Our function has a bug drawback: performance. On a 300x300 selection, with the timing code uncommented, blur() took 12 minutes on my K6-2 350MHz, well loaded with other stuff. To compare, on the same selection, Gaussian blur took 3 seconds. + +If we modify our function to rather use gimp_pixel_rgn_(get|set)_row() the result is far better. We reduce the timing for the 300x300 selection from 760 seconds to 6 seconds. blur() V2 is below: +
        
    +      static void
    +      blur (GimpDrawable *drawable)
    +      {
    +        gint         i, j, k, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar      *row1, *row2, *row3;
    +        guchar      *outrow;
    +
    +        gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                   &x1, &y1,
    +                                   &x2, &y2);
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             x2 - x1, y2 - y1,
    +                             TRUE, TRUE);
    +
    +        /* Initialise enough memory for row1, row2, row3, outrow */
    +        row1 = g_new (guchar, channels * (x2 - x1));
    +        row2 = g_new (guchar, channels * (x2 - x1));
    +        row3 = g_new (guchar, channels * (x2 - x1));
    +        outrow = g_new (guchar, channels * (x2 - x1));
    +
    +        for (i = y1; i < y2; i++)
    +          {
    +            /* Get row i-1, i, i+1 */
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row1,
    +                                    x1, MAX (y1, i - 1),
    +                                    x2 - x1);
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row2,
    +                                    x1, i,
    +                                    x2 - x1);
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row3,
    +                                    x1, MIN (y2 - 1, i + 1),
    +                                    x2 - x1);
    +
    +            for (j = x1; j < x2; j++)
    +              {
    +                /* For each layer, compute the average of the nine
    +                 * pixels */
    +                for (k = 0; k < channels; k++)
    +                  {
    +                    int sum = 0;
    +                    sum = row1[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                          row1[channels * (j - x1) + k]                        +
    +                          row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
    +                          row2[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                          row2[channels * (j - x1) + k]                        +
    +                          row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
    +                          row3[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                          row3[channels * (j - x1) + k]                        +
    +                          row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k];
    +                    outrow[channels * (j - x1) + k] = sum / 9;
    +                  }
    +
    +             }
    +
    +             gimp_pixel_rgn_set_row (&rgn_out,
    +                                     outrow,
    +                                     x1, i,
    +                                     x2 - x1);
    +
    +             if (i % 10 == 0)
    +                  gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1));
    +        }
    +
    +        g_free (row1);
    +        g_free (row2);
    +        g_free (row3);
    +        g_free (outrow);
    +
    +        gimp_drawable_flush (drawable);
    +        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +        gimp_drawable_update (drawable->drawable_id,
    +                              x1, y1,
    +                              x2 - x1, y2 - y1);
    +      }
    +
    + +Have a look at the [[Hacking:slow plug-in|slow]] or [[Hacking:fast plug-in|fast]] blur complete code. + + +Next part + +In next part, we will see how to process the image tile by tile. We will also have a look at preferences, by modifying our algorithm so it can take an input parameter. + +=Tile processing, input parameters= +In the second part, I told you about manipulating image data by pixel or row. This time, I will go farther and process data by tile, which will improve our plug-in performance. I will also update our algorithm to take larger radius into account, and build a graphical interface to allow changing that parameter. + +==Introduction== + +Let's have a look at our simple algorithm: for each pixel, generate a (2r+1)x(2r+1) neighbourhood and for each layer, replace the layer's pixel value with the average value in the neighbourhood. + +It's a bit more complex than that - we have to be careful near image borders for example, but this algorithm makes a blur effect that is not so bad in general. + +But until now, we wrote the algorithm for a 3x3 neighbourhood. Time has come to generalise this part and to introduce the radius as a parameter. + +First, a word on tiles. + +==Tile management== + +A tile is an image data block with a 64x64 size. Usually, tiles are sent to the plug-in on demand one by one, by shared memory. Of course this process needs huge resources and should be avoided. + +Usually, one doesn't need any particular cache, each tile is sent when one needs it and freed when one asks for another one. Nevertheless, we can tell our plug-in to keep a tile cache to avoid this constant round trip, by calling the function: +
        
    +      gimp_tile_cache_ntiles (gulong ntiles);
    +
    + +In the second part example, we called gimp_pixel_rgn_get_row() and gimp_pixel_rgn_set_row() but without using any cache. + +The number of tiles in a tile row will be the layer width divided by the tile width, plus one. So, for a layer width of 65, we will cache two tiles. As we usually also process shadow tiles, we can double that number to compute the ideal cache size for our plug-in. +
      
    +      gimp_tile_cache_ntiles (2 * (drawable->width / 
    +                              gimp_tile_width () + 1));
    +
    + +With the cache, our slow plug-in becomes fast. On a 300x300 selection, our last blur took 3 seconds, but on a 2000x1500 selection it was much slower - 142 seconds. + +Adding the above line of code, things are getting better: 11 seconds. We still lose transition time when we reach tile borders, we can go down to 10 seconds when multiplying by 4 instead of 2 (meaning we cache two tiles rows), but the more tiles we cache, the more hard disk access we make, which reduce the time gain at a point. + +==Algorithm generalisation== + +We can modify the algorithm to take a parameter into account: radius. With a radius of 3, the neighbourhood of a pixel will be 7x7, instead of 3x3 with a radius of 1. To achieve this I modify the previous algorithm: + +* allocate space for 2r+1 tile rows +* initialise this rows array, taking care of borders +* for each tile row +*:* for each pixel in the tile row +*:*:* compute the neighbourhood average, taking care of borders +*:* get a new tile row and cycle rows + +This algorithm is more complex than the last one, because the average computing will be a O(r²) algorithm. + +The modified code to get this behaviour is below. Most of the work is done in the process_row function. init_mem and shuffle are there to keep the blur code clean and small. +
    +      static void blur        (GimpDrawable *drawable);
    +
    +      static void init_mem    (guchar     ***row,
    +                               guchar      **outrow,
    +                               gint          num_bytes);
    +      static void process_row (guchar      **row,
    +                               guchar       *outrow,
    +                               gint          x1,
    +                               gint          y1,
    +                               gint          width,
    +                               gint          height,
    +                               gint          channels,
    +                               gint          i);
    +      static void shuffle     (GimpPixelRgn *rgn_in,
    +                               guchar      **row,
    +                               gint          x1,
    +                               gint          y1,
    +                               gint          width,
    +                               gint          height,
    +                               gint          ypos);
    +
    +      /* The radius is still a constant, we'll change that when the
    +       * graphical interface will be built. */
    +      static gint radius = 3;
    +      ...
    +
    +      static void
    +      blur (GimpDrawable *drawable)
    +      {
    +        gint         i, ii, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar     **row;
    +        guchar      *outrow;
    +        gint         width, height;
    +
    +        gimp_progress_init ("My Blur...");
    +
    +        /* Gets upper left and lower right coordinates,
    +         * and layers number in the image */
    +        gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                   &x1, &y1,
    +                                   &x2, &y2);
    +        width  = x2 - x1;
    +        height = y2 - y1;
    +
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        /* Allocate a big enough tile cache */
    +        gimp_tile_cache_ntiles (2 * (drawable->width /
    +                                     gimp_tile_width () + 1));
    +
    +        /* Initialises two PixelRgns, one to read original data,
    +         * and the other to write output data. That second one will
    +         * be merged at the end by the call to
    +         * gimp_drawable_merge_shadow() */
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             TRUE, TRUE);
    +
    +        /* Allocate memory for input and output tile rows */
    +        init_mem (&row, &outrow, width * channels);
    +
    +        for (ii = -radius; ii <= radius; ii++)
    +          {
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row[radius + ii],
    +                                    x1, y1 + CLAMP (ii, 0, height - 1), 
    +                                    width);
    +          }
    +
    +        for (i = 0; i < height; i++)
    +          {
    +            /* To be done for each tile row */
    +            process_row (row,
    +                         outrow,
    +                         x1, y1,
    +                         width, height,
    +                         channels,
    +                         i);
    +            gimp_pixel_rgn_set_row (&rgn_out,
    +                                    outrow,
    +                                    x1, i + y1,
    +                                    width);
    +            /* shift tile rows to insert the new one at the end */
    +            shuffle (&rgn_in,
    +                     row,
    +                     x1, y1,
    +                     width, height,
    +                     i);
    +            if (i % 10 == 0)
    +              gimp_progress_update ((gdouble) i / (gdouble) height);
    +          }
    +
    +        /* We could also put that in a separate function but it's
    +         * rather simple */
    +        for (ii = 0; ii < 2 * radius + 1; ii++)
    +          g_free (row[ii]);
    +
    +        g_free (row);
    +        g_free (outrow);
    +
    +        /*  Update the modified region */
    +        gimp_drawable_flush (drawable);
    +        gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +        gimp_drawable_update (drawable->drawable_id,
    +                              x1, y1,
    +                              width, height);
    +      }
    +
    +      static void
    +      init_mem (guchar ***row,
    +                guchar  **outrow,
    +                gint      num_bytes)
    +      {
    +        gint i;
    +
    +        /* Allocate enough memory for row and outrow */
    +        *row = g_new (char *, (2 * radius + 1));
    +
    +        for (i = -radius; i <= radius; i++)
    +          (*row)[i + radius] = g_new (guchar, num_bytes);
    +
    +        *outrow = g_new (guchar, num_bytes);
    +      }
    +
    +      static void
    +      process_row (guchar **row,
    +                   guchar  *outrow,
    +                   gint     x1,
    +                   gint     y1,
    +                   gint     width,
    +                   gint     height,
    +                   gint     channels,
    +                   gint     i)
    +      {
    +        gint j;
    +
    +        for (j = 0; j < width; j++)
    +          {
    +            gint k, ii, jj;
    +            gint left = (j - radius),
    +                 right = (j + radius);
    +
    +            /* For each layer, compute the average of the
    +             * (2r+1)x(2r+1) pixels */
    +            for (k = 0; k < channels; k++)
    +              {
    +                gint sum = 0;
    +
    +                for (ii = 0; ii < 2 * radius + 1; ii++)
    +                  for (jj = left; jj <= right; jj++)
    +                    sum += row[ii][channels * CLAMP (jj, 0, width - 1) + k];
    +
    +                outrow[channels * j + k] =
    +                  sum / (4 * radius * radius + 4 * radius + 1);
    +              }
    +          }
    +      }
    +
    +      static void
    +      shuffle (GimpPixelRgn *rgn_in,
    +               guchar      **row,
    +               gint          x1,
    +               gint          y1,
    +               gint          width,
    +               gint          height,
    +               gint          ypos)
    +      {
    +        gint    i;
    +        guchar *tmp_row;
    +
    +        /* Get tile row (i + radius + 1) into row[0] */
    +        gimp_pixel_rgn_get_row (rgn_in,
    +                                row[0],
    +                                x1, MIN (ypos + radius + y1, y1 + height - 1),
    +                                width);
    +
    +        /* Permute row[i] with row[i-1] and row[0] with row[2r] */
    +        tmp_row = row[0];
    +        for (i = 1; i < 2 * radius + 1; i++)
    +          row[i - 1] = row[i];
    +        row[2 * radius] = tmp_row;
    +      }
    +
    + +==Adding a graphical interface and saving parameters== + +To let the user modify the radius, or let a non-interactive script give it as a parameter, we now need to get back to our run() function and settle some simple things. + +First we create a structure to allow saving and returning options. Usually one does this even for plug-ins with only one parameter. +
        
    +      typedef struct
    +      {
    +        gint radius;
    +      } MyBlurVals;
    +
    +
    +      /* Set up default values for options */
    +      static MyBlurVals bvals =
    +      {
    +        3  /* radius */
    +      };
    +
    + +Next, we modify the run() function so that execution modes are taken into account. In interactive mode and repeat last filter mode, we try to get the last values used by the gimp_get_data() function, which takes a unique data identifier as its first input parameter. Usually, one uses the procedure's name. + +Finally, in interactive mode, we add a few lines that will build the graphical interface allowing options modification. +
        
    +      static void
    +      run (const gchar      *name,
    +           gint              nparams,
    +           const GimpParam  *param,
    +           gint             *nreturn_vals,
    +           GimpParam       **return_vals)
    +      {
    +        static GimpParam  values[1];
    +        GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +        GimpRunMode       run_mode;
    +        GimpDrawable     *drawable;
    +
    +        /* Setting mandatory output values */
    +        *nreturn_vals = 1;
    +        *return_vals  = values;
    +
    +        values[0].type = GIMP_PDB_STATUS;
    +        values[0].data.d_status = status;
    +
    +        /* Getting run_mode - we won't display a dialog if 
    +         * we are in NONINTERACTIVE mode */
    +        run_mode = param[0].data.d_int32;
    +
    +        /*  Get the specified drawable  */
    +        drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +        switch (run_mode)
    +          {
    +          case GIMP_RUN_INTERACTIVE:
    +            /* Get options last values if needed */
    +            gimp_get_data ("plug-in-myblur", &bvals);
    +
    +            /* Display the dialog */
    +            if (! blur_dialog (drawable))
    +              return;
    +            break;
    +
    +          case GIMP_RUN_NONINTERACTIVE:
    +            if (nparams != 4)
    +              status = GIMP_PDB_CALLING_ERROR;
    +            if (status == GIMP_PDB_SUCCESS)
    +              bvals.radius = param[3].data.d_int32;
    +            break;
    +
    +          case GIMP_RUN_WITH_LAST_VALS:
    +            /*  Get options last values if needed  */
    +            gimp_get_data ("plug-in-myblur", &bvals);
    +            break;
    +
    +          default:
    +            break;
    +          }
    +
    +        blur (drawable);
    +
    +        gimp_displays_flush ();
    +        gimp_drawable_detach (drawable);
    +
    +        /*  Finally, set options in the core  */
    +        if (run_mode == GIMP_RUN_INTERACTIVE)
    +          gimp_set_data ("plug-in-myblur", &bvals, sizeof (MyBlurVals));
    +
    +        return;
    +      }
    +
    + +==The graphical interface== + +I won't detail GTK+ programming as this is done very well in other places. Our first try will be very simple. We will use the utility widget of GIMP, the GimpDialog, to create a window with a header, a numeric control of type GtkSpinButton (associated with a GtkAdjustment) and its label, nicely framed in a GtkFrame. + +In the following parts, in order to show how easy one can do such things, I will add a preview in the dialog to show real time effects of the parameters. + +Our final dialog will look like this (tree generated with Glade): + +[[File:glade-tree.png|112px|Glade tree]] + +Glade tree + +In The GIMP 2.2, there is a number of widgets that come bundled with parameters that allow a coherent behaviour, consistent with GNOME Human Interface Guidelines. GimpPreview also appeared in 2.2. Let's make a first try without it: + +[[File:blur_dialog1.png|Blur dialog]] + +Blur dialog +
        
    +      static gboolean
    +      blur_dialog (GimpDrawable *drawable)
    +      {
    +        GtkWidget *dialog;
    +        GtkWidget *main_vbox;
    +        GtkWidget *main_hbox;
    +        GtkWidget *frame;
    +        GtkWidget *radius_label;
    +        GtkWidget *alignment;
    +        GtkWidget *spinbutton;
    +        GtkObject *spinbutton_adj;
    +        GtkWidget *frame_label;
    +        gboolean   run;
    +
    +        gimp_ui_init ("myblur", FALSE);
    +
    +        dialog = gimp_dialog_new ("My blur", "myblur",
    +                                  NULL, 0,
    +                                  gimp_standard_help_func, "plug-in-myblur",
    +
    +                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    +                                  GTK_STOCK_OK,     GTK_RESPONSE_OK,
    +
    +                                  NULL);
    +
    +        main_vbox = gtk_vbox_new (FALSE, 6);
    +        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
    +        gtk_widget_show (main_vbox);
    +
    +        frame = gtk_frame_new (NULL);
    +        gtk_widget_show (frame);
    +        gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
    +        gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
    +
    +        alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
    +        gtk_widget_show (alignment);
    +        gtk_container_add (GTK_CONTAINER (frame), alignment);
    +        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6);
    +
    +        main_hbox = gtk_hbox_new (FALSE, 0);
    +        gtk_widget_show (main_hbox);
    +        gtk_container_add (GTK_CONTAINER (alignment), main_hbox);
    +
    +        radius_label = gtk_label_new_with_mnemonic ("_Radius:");
    +        gtk_widget_show (radius_label);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6);
    +        gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT);
    +
    +        spinbutton_adj = gtk_adjustment_new (3, 1, 16, 1, 5, 5);
    +        spinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (spinbutton_adj), 1, 0);
    +        gtk_widget_show (spinbutton);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 6);
    +        gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
    +
    +        frame_label = gtk_label_new ("Modify radius");
    +        gtk_widget_show (frame_label);
    +        gtk_frame_set_label_widget (GTK_FRAME (frame), frame_label);
    +        gtk_label_set_use_markup (GTK_LABEL (frame_label), TRUE);
    +
    +        g_signal_connect (spinbutton_adj, "value_changed",
    +                          G_CALLBACK (gimp_int_adjustment_update),
    +                          &bvals.radius);
    +        gtk_widget_show (dialog);
    +
    +        run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
    +
    +        gtk_widget_destroy (dialog);
    +
    +        return run;
    +      }
    +
    + +==Adding a GimpPreview== + +Adding a GimpPreview is quite easy. First we create a GtkWidget with gimp_drawable_preview_new(), then we attach an invalidated signal to it, which will call the blur function to update the preview. We also add a second parameter to MyBlurVals to remember the activation state of the preview. + +A method to update easily the preview is to add a preview parameter in the blur function, and if preview is not NULL, to take GimpPreview limits. So when we call blur from run(), we set the preview parameter to NULL. + +To take GimpPreview limits, we use gimp_preview_get_position() and gimp_preview_get_size(), so we can generate only what will be displayed. + +To achieve this the right way we'll tune some of the code - we don't need to update the progress bar while generating the preview, and we should tell at GimpPixelRgn init time that the tiles should not be sent back to the core. + +Finally, we display the updated preview with the gimp_drawable_preview_draw_region() function. We get a dialog box that shows us in real time the plug-in effects. Moreover, thanks to the GIMP core, our plug-in already takes selections into account. + +[[File:blur_dialog2.png|147px|Blur dialog, improved]] + +Blur dialog, improved + +[[File:blur_select.png|243px|Blur a selection]] + +Blur a selection + +Here are the two functions in their last version: +
        
    +      static void
    +      blur (GimpDrawable *drawable,
    +            GimpPreview  *preview)
    +      {
    +        gint         i, ii, channels;
    +        gint         x1, y1, x2, y2;
    +        GimpPixelRgn rgn_in, rgn_out;
    +        guchar     **row;
    +        guchar      *outrow;
    +        gint         width, height;
    +
    +        if (!preview)
    +          gimp_progress_init ("My Blur...");
    +
    +        /* Gets upper left and lower right coordinates,
    +         * and layers number in the image */
    +        if (preview)
    +        {
    +          gimp_preview_get_position (preview, &x1, &y1);
    +          gimp_preview_get_size (preview, &width, &height);
    +          x2 = x1 + width;
    +          y2 = y1 + height;
    +        }
    +        else
    +        {
    +          gimp_drawable_mask_bounds (drawable->drawable_id,
    +                                     &x1, &y1,
    +                                     &x2, &y2);
    +          width = x2 - x1;
    +          height = y2 - y1;
    +        }
    +
    +        channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +        /* Allocate a big enough tile cache */
    +        gimp_tile_cache_ntiles (2 * (drawable->width / 
    +                                     gimp_tile_width () + 1));
    +
    +        /* Initialises two PixelRgns, one to read original data,
    +         * and the other to write output data. That second one will
    +         * be merged at the end by the call to
    +         * gimp_drawable_merge_shadow() */
    +        gimp_pixel_rgn_init (&rgn_in,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             FALSE, FALSE);
    +        gimp_pixel_rgn_init (&rgn_out,
    +                             drawable,
    +                             x1, y1,
    +                             width, height, 
    +                             preview == NULL, TRUE);
    +
    +        /* Allocate memory for input and output tile rows */
    +        init_mem (&row, &outrow, width * channels);
    +        
    +        for (ii = -bvals.radius; ii <= bvals.radius; ii++)
    +          {
    +            gimp_pixel_rgn_get_row (&rgn_in,
    +                                    row[bvals.radius + ii],
    +                                    x1, y1 + CLAMP (ii, 0, height - 1), 
    +                                    width);
    +          }
    +
    +        for (i = 0; i < height; i++)
    +          {
    +            /* To be done for each tile row */
    +            process_row (row,
    +                         outrow,
    +                         x1, y1,
    +                         width, height,
    +                         channels,
    +                         i);
    +            gimp_pixel_rgn_set_row (&rgn_out,
    +                                    outrow,
    +                                    x1, i + y1,
    +                                    width);
    +            /* shift tile rows to insert the new one at the end */
    +            shuffle (&rgn_in,
    +                     row,
    +                     x1, y1,
    +                     width, height,
    +                     i);
    +            if (i % 10 == 0 && !preview)
    +              gimp_progress_update ((gdouble) i / (gdouble) height);
    +          }
    +
    +        for (ii = 0; ii < 2 * bvals.radius + 1; ii++)
    +          g_free (row[ii]);
    +
    +        g_free (row);
    +        g_free (outrow);
    +
    +        /*  Update the modified region  */
    +        if (preview)
    +          {
    +            gimp_drawable_preview_draw_region (GIMP_DRAWABLE_PREVIEW (preview),
    +                                               &rgn_out);
    +          }
    +        else
    +          {
    +            gimp_drawable_flush (drawable);
    +            gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +            gimp_drawable_update (drawable->drawable_id,
    +                                  x1, y1,
    +                                  width, height);
    +          }
    +      }
    +
    +      static gboolean
    +      blur_dialog (GimpDrawable *drawable)
    +      {
    +        GtkWidget *dialog;
    +        GtkWidget *main_vbox;
    +        GtkWidget *main_hbox;
    +        GtkWidget *preview;
    +        GtkWidget *frame;
    +        GtkWidget *radius_label;
    +        GtkWidget *alignment;
    +        GtkWidget *spinbutton;
    +        GtkObject *spinbutton_adj;
    +        GtkWidget *frame_label;
    +        gboolean   run;
    +
    +        gimp_ui_init ("myblur", FALSE);
    +
    +        dialog = gimp_dialog_new ("My blur", "myblur",
    +                                  NULL, 0,
    +                                  gimp_standard_help_func, "plug-in-myblur",
    +
    +                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    +                                  GTK_STOCK_OK,     GTK_RESPONSE_OK,
    +
    +                                  NULL);
    +
    +        main_vbox = gtk_vbox_new (FALSE, 6);
    +        gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
    +        gtk_widget_show (main_vbox);
    +
    +        preview = gimp_drawable_preview_new (drawable, &bvals.preview);
    +        gtk_box_pack_start (GTK_BOX (main_vbox), preview, TRUE, TRUE, 0);
    +        gtk_widget_show (preview);
    +
    +        frame = gimp_frame_new ("Blur radius");
    +        gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
    +        gtk_widget_show (frame);
    +
    +        alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
    +        gtk_widget_show (alignment);
    +        gtk_container_add (GTK_CONTAINER (frame), alignment);
    +        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 6, 6, 6, 6);
    +
    +        main_hbox = gtk_hbox_new (FALSE, 12);
    +        gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
    +        gtk_widget_show (main_hbox);
    +        gtk_container_add (GTK_CONTAINER (alignment), main_hbox);
    +
    +        radius_label = gtk_label_new_with_mnemonic ("_Radius:");
    +        gtk_widget_show (radius_label);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), radius_label, FALSE, FALSE, 6);
    +        gtk_label_set_justify (GTK_LABEL (radius_label), GTK_JUSTIFY_RIGHT);
    +
    +        spinbutton = gimp_spin_button_new (&spinbutton_adj, bvals.radius, 
    +                                           1, 32, 1, 1, 1, 5, 0);
    +        gtk_box_pack_start (GTK_BOX (main_hbox), spinbutton, FALSE, FALSE, 0);
    +        gtk_widget_show (spinbutton);
    +
    +        g_signal_connect_swapped (preview, "invalidated",
    +                                  G_CALLBACK (blur),
    +                                  drawable);
    +        g_signal_connect_swapped (spinbutton_adj, "value_changed",
    +                                  G_CALLBACK (gimp_preview_invalidate),
    +                                  preview);
    +
    +        blur (drawable, GIMP_PREVIEW (preview));
    +
    +        g_signal_connect (spinbutton_adj, "value_changed",
    +                          G_CALLBACK (gimp_int_adjustment_update),
    +                          &bvals.radius);
    +        gtk_widget_show (dialog);
    +
    +        run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
    +
    +        gtk_widget_destroy (dialog);
    +
    +        return run;
    +      }
    +
    + +Have a look at the tiled, UI or preview blur complete code. + +==Conclusion== + +In these articles, we saw basic concepts for several aspects of a GIMP plug-in. We messed with image data treatment through a simple algorithm, and followed a path that showed us how to avoid performance problems. Finally, we generalised the algorithm and added parameters to it, and we used some GIMP widgets to make a nice user interface. + +==Thanks== + +Thanks to my wife Anne and to David Odin (preview master) for helping me while I was writing this article. + + +[[File:somerights20.gif | Creative Commons License]] + +This work is licensed under a [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License]. diff --git a/wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2007-20161024015943-show.txt b/wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2007-20161024015943-show.txt new file mode 100644 index 0000000..e554da9 --- /dev/null +++ b/wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2007-20161024015943-show.txt @@ -0,0 +1,31 @@ + +[http://libregraphicsmeeting.org/2007/ Homepage] +[http://libregraphicsmeeting.org/2007/program.html Program] +[http://libregraphicsmeeting.org/2007/audio.rss Audio podcast feed] +[http://libregraphicsmeeting.org/2007/video.rss Video podcast feed] + + +==GIMP and GEGL topics== + +* Judith Beaudoin: A GIMP overview +* Peter Sikking and Kamila Giedrojć: OpenUsability - Project overview and first results from the OpenUsability GIMP redesign project +* Karine Delvare: Contributing to an Open Source project, taking GIMP as an example. +* Prof. Michael Terry: Ingimp: An instrumented version of GIMP to automatically collect usability data +* Cédric Gemy: Working with Open Standards and FLOSS (Inkscape, Gimp, Blender, Scribus) +* Jakub Steiner: Photo management and editing with F-Spot and GIMP +* Øyvind Kolås: GEGL – a graph based image processing and compositing engine. A presentation of capabilities, data model, public API and an overview of opportunities for internal optimisations and enhancements + +==Other topics== + +* Benoit St-André: Contributing without coding +* Harrisson and Femke Snelting: Relaying Systems – Why designers should be interested in FLOSS +* Hubert Figuière: Digital Photography with libre Software: RAW, metadata, workflow and asset management +* Alexandre Robin: Our first year of graphic design ... 100 % open source +* Ted Gould: Introduction to the SVG format +* Cyrille Berger: OpenRaster: a new file format to fully share complex raster graphics between applications +* Nicolas Spalinger: The Open Font License, purpose, achievements, future +* David Maxwell: Static Analysis results on graphics software + +Other topics were open standards, XSL-FO, Inkscape, Blender, Scribus, Krita, sK1, OpenClipart etc. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr-20150911044159-edit.txt b/wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr-20150911044159-edit.txt new file mode 100644 index 0000000..72e2953 --- /dev/null +++ b/wiki/Hacking:LGM_2007_Libre_Graphics_Meeting,_Montr-20150911044159-edit.txt @@ -0,0 +1,28 @@ +[http://libregraphicsmeeting.org/2007/ Homepage] + +[http://libregraphicsmeeting.org/2007/program.html Program] + +[http://libregraphicsmeeting.org/2007/audio.rss Audio podcast feed] + +[http://libregraphicsmeeting.org/2007/video.rss Video podcast feed] + +==GIMP and GEGL topics== +* Judith Beaudoin: A GIMP overview +* Peter Sikking and Kamila Giedrojć: OpenUsability - Project overview and first results from the OpenUsability GIMP redesign project +* Karine Delvare: Contributing to an Open Source project, taking GIMP as an example. +* Prof. Michael Terry: Ingimp: An instrumented version of GIMP to automatically collect usability data +* Cédric Gemy: Working with Open Standards and FLOSS (Inkscape, Gimp, Blender, Scribus) +* Jakub Steiner: Photo management and editing with F-Spot and GIMP +* Øyvind Kolås: GEGL – a graph based image processing and compositing engine. A presentation of capabilities, data model, public API and an overview of opportunities for internal optimisations and enhancements + +==Other topics== +* Benoit St-André: Contributing without coding +* Harrisson and Femke Snelting: Relaying Systems – Why designers should be interested in FLOSS +* Hubert Figuière: Digital Photography with libre Software: RAW, metadata, workflow and asset management +* Alexandre Robin: Our first year of graphic design ... 100 % open source +* Ted Gould: Introduction to the SVG format +* Cyrille Berger: OpenRaster: a new file format to fully share complex raster graphics between applications +* Nicolas Spalinger: The Open Font License, purpose, achievements, future +* David Maxwell: Static Analysis results on graphics software + +Other topics were open standards, XSL-FO, Inkscape, Blender, Scribus, Krita, sK1, OpenClipart etc. diff --git a/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20161024010128-show.txt b/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20161024010128-show.txt new file mode 100644 index 0000000..ae50d84 --- /dev/null +++ b/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20161024010128-show.txt @@ -0,0 +1,31 @@ + +[http://libregraphicsmeeting.org/2008/index.php?lang=en Homepage] +[http://www.libregraphicsmeeting.org/2008/index.php?lang=en&action=program Program] + + +==GIMP and GEGL topics== + +* Øyvind Kolås: Extending GEGL with new operations and an introduction to GeglBuffers, the functionality offered by them and their underlying mechanisms +* Peter Sikking: GIMP: a new simple interface for a complex application +* Michael Terry: ingimp 1 Year Later: Initial Data Analyses and Lessons Learned +* Joao S. O. Bueno: Python: Binding the Libre Universe Together - scripting in GIMP and other Graphic program +* Cédric Gémy: Live creation of a magazin using Inkscape+Gimp+Blender+Scribus +* Mariusz Ufnal: GIMP workshop + +==Other topics== + +* Carl Worth: What cairo has to offer now (with 1.6.0) and where it's going,(colour management, extended PDF capability, hardware acceleration, etc.) +* Chris Lilley: What is happening with SVG +* Harrisson, Pierre Huyghebaert, Femke Snelting, Nicolas Malevé: Designing with free software +* Dave Crossland: Font Software Freedom +* Michael Dominic Kostrzewa: Programmers hell: working with the UI designer +* Peter Linnell, Cyrille Berger, Kai-Uwe Behrmann: BoF: OpenICC - goals, themes and results +* Kai-Uwe Behrmann: Introduction to the Oyranos colour management system +* Emanuele Tamponi: A realistic color model for representing pigment +* Udi Fuchs: UFRaw +* Dave Coffin: Presenation about DCRaw +* Liam Quin: Proposal, shared type/text specification for the desktop + +More topics were other graphics software, natural media painting simulation etc. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20210206164023-show.txt b/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20210206164023-show.txt new file mode 100644 index 0000000..ae50d84 --- /dev/null +++ b/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc%C5%82aw,_Poland,_2008-20210206164023-show.txt @@ -0,0 +1,31 @@ + +[http://libregraphicsmeeting.org/2008/index.php?lang=en Homepage] +[http://www.libregraphicsmeeting.org/2008/index.php?lang=en&action=program Program] + + +==GIMP and GEGL topics== + +* Øyvind Kolås: Extending GEGL with new operations and an introduction to GeglBuffers, the functionality offered by them and their underlying mechanisms +* Peter Sikking: GIMP: a new simple interface for a complex application +* Michael Terry: ingimp 1 Year Later: Initial Data Analyses and Lessons Learned +* Joao S. O. Bueno: Python: Binding the Libre Universe Together - scripting in GIMP and other Graphic program +* Cédric Gémy: Live creation of a magazin using Inkscape+Gimp+Blender+Scribus +* Mariusz Ufnal: GIMP workshop + +==Other topics== + +* Carl Worth: What cairo has to offer now (with 1.6.0) and where it's going,(colour management, extended PDF capability, hardware acceleration, etc.) +* Chris Lilley: What is happening with SVG +* Harrisson, Pierre Huyghebaert, Femke Snelting, Nicolas Malevé: Designing with free software +* Dave Crossland: Font Software Freedom +* Michael Dominic Kostrzewa: Programmers hell: working with the UI designer +* Peter Linnell, Cyrille Berger, Kai-Uwe Behrmann: BoF: OpenICC - goals, themes and results +* Kai-Uwe Behrmann: Introduction to the Oyranos colour management system +* Emanuele Tamponi: A realistic color model for representing pigment +* Udi Fuchs: UFRaw +* Dave Coffin: Presenation about DCRaw +* Liam Quin: Proposal, shared type/text specification for the desktop + +More topics were other graphics software, natural media painting simulation etc. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc-20150910192647-edit.txt b/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc-20150910192647-edit.txt new file mode 100644 index 0000000..67ade84 --- /dev/null +++ b/wiki/Hacking:LGM_2008_Libre_Graphics_Meeting,_Wroc-20150910192647-edit.txt @@ -0,0 +1,26 @@ +[http://libregraphicsmeeting.org/2008/index.php?lang=en Homepage] + +[http://www.libregraphicsmeeting.org/2008/index.php?lang=en&action=program Program] + +==GIMP and GEGL topics== +* Øyvind Kolås: Extending GEGL with new operations and an introduction to GeglBuffers, the functionality offered by them and their underlying mechanisms +* Peter Sikking: GIMP: a new simple interface for a complex application +* Michael Terry: ingimp 1 Year Later: Initial Data Analyses and Lessons Learned +* Joao S. O. Bueno: Python: Binding the Libre Universe Together - scripting in GIMP and other Graphic program +* Cédric Gémy: Live creation of a magazin using Inkscape+Gimp+Blender+Scribus +* Mariusz Ufnal: GIMP workshop + +==Other topics== +* Carl Worth: What cairo has to offer now (with 1.6.0) and where it's going,(colour management, extended PDF capability, hardware acceleration, etc.) +* Chris Lilley: What is happening with SVG +* Harrisson, Pierre Huyghebaert, Femke Snelting, Nicolas Malevé: Designing with free software +* Dave Crossland: Font Software Freedom +* Michael Dominic Kostrzewa: Programmers hell: working with the UI designer +* Peter Linnell, Cyrille Berger, Kai-Uwe Behrmann: BoF: OpenICC - goals, themes and results +* Kai-Uwe Behrmann: Introduction to the Oyranos colour management system +* Emanuele Tamponi: A realistic color model for representing pigment +* Udi Fuchs: UFRaw +* Dave Coffin: Presenation about DCRaw +* Liam Quin: Proposal, shared type/text specification for the desktop + +More topics were other graphics software, natural media painting simulation etc. diff --git a/wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2009-20161009100056-show.txt b/wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2009-20161009100056-show.txt new file mode 100644 index 0000000..c02b091 --- /dev/null +++ b/wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2009-20161009100056-show.txt @@ -0,0 +1,18 @@ + +[http://libregraphicsmeeting.org/2009/ Homepage] +[http://libregraphicsmeeting.org/2009/program.php Program] + + +==GIMP and GEGL topics== + +* Michael Terry: ingimp: A Smorgasbord of Usability, Adaptive UIs, and Visually Arresting Graphic Design for 2009 +* Peter Sikking: GIMP UI: taking some big issues by the horns +* Øyvind Kolås: Stopmotion + +==Other topics== + +* Andrew Mihal: Nona-GPU: Image Remapping on the Graphics Processor + +More topics where graphics FOSS, CSS, fonts etc. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr-20150911044733-edit.txt b/wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr-20150911044733-edit.txt new file mode 100644 index 0000000..9cea36b --- /dev/null +++ b/wiki/Hacking:LGM_2009_Libre_Graphics_Meeting,_Montr-20150911044733-edit.txt @@ -0,0 +1,13 @@ +[http://libregraphicsmeeting.org/2009/ Homepage] + +[http://libregraphicsmeeting.org/2009/program.php Program] + +==GIMP and GEGL topics== +* Michael Terry: ingimp: A Smorgasbord of Usability, Adaptive UIs, and Visually Arresting Graphic Design for 2009 +* Peter Sikking: GIMP UI: taking some big issues by the horns +* Øyvind Kolås: Stopmotion + +==Other topics== +* Andrew Mihal: Nona-GPU: Image Remapping on the Graphics Processor + +More topics where graphics FOSS, CSS, fonts etc. diff --git a/wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20150911054012-edit.txt b/wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20150911054012-edit.txt new file mode 100644 index 0000000..8696dc4 --- /dev/null +++ b/wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20150911054012-edit.txt @@ -0,0 +1,11 @@ +[http://libregraphicsmeeting.org/2010/ Homepage] + +[http://libregraphicsmeeting.org/2010/program.php Program] + +[http://www.youtube.com/playlist?list=PL927C3C7CD4DE9E08 Videos] +==GIMP and GEGL topics== +* Peter Sikking: A first outline for a UI for a fully GEGLed GIMP [http://www.youtube.com/watch?v=D-kbH_ZVMmk&list=PL927C3C7CD4DE9E08&index=3 Video] +* Akkana Peck: Writing GIMP scripts and plugins [http://www.youtube.com/watch?v=anVRFuxqrgo&list=PL927C3C7CD4DE9E08&index=4 Video] + +==Other topics== +Colour management, fonts, graphics tools etc. diff --git a/wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20161024013724-show.txt b/wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20161024013724-show.txt new file mode 100644 index 0000000..03ab604 --- /dev/null +++ b/wiki/Hacking:LGM_2010_Libre_Graphics_Meeting,_Brussels,_Belgium,_2010-20161024013724-show.txt @@ -0,0 +1,16 @@ + +[http://libregraphicsmeeting.org/2010/ Homepage] +[http://libregraphicsmeeting.org/2010/program.php Program] +[http://www.youtube.com/playlist?list=PL927C3C7CD4DE9E08 Videos] + + +==GIMP and GEGL topics== + +* Peter Sikking: A first outline for a UI for a fully GEGLed GIMP [http://www.youtube.com/watch?v=D-kbH_ZVMmk&list=PL927C3C7CD4DE9E08&index=3 Video] +* Akkana Peck: Writing GIMP scripts and plugins [http://www.youtube.com/watch?v=anVRFuxqrgo&list=PL927C3C7CD4DE9E08&index=4 Video] + +==Other topics== + +Colour management, fonts, graphics tools etc. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2011-20161024003011-show.txt b/wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2011-20161024003011-show.txt new file mode 100644 index 0000000..c88afea --- /dev/null +++ b/wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr%C3%A9al,_Canada,_2011-20161024003011-show.txt @@ -0,0 +1,16 @@ + +[http://libregraphicsmeeting.org/2011/ Homepage] +[http://libre-graphics-meeting.org/2011/program/ Program] +[https://itunes.apple.com/de/podcast/lgm-2011-video/id450990980 Video podcast] + + +==GIMP and GEGL topics== + +* Michael Terry: Introducing AdaptableGIMP [http://adaptablegimp.blogspot.de/ Blog] +* Nicolas Robidoux: Better and faster image resizing and resampling [http://libre-graphics-meeting.org/2011/day-4#NicolasRobidoux Description] + +==Other topics== + +Colour management, other tools etc. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr-20150911044820-edit.txt b/wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr-20150911044820-edit.txt new file mode 100644 index 0000000..e0a34f8 --- /dev/null +++ b/wiki/Hacking:LGM_2011_Libre_Graphics_Meeting,_Montr-20150911044820-edit.txt @@ -0,0 +1,12 @@ +[http://libregraphicsmeeting.org/2011/ Homepage] + +[http://libre-graphics-meeting.org/2011/program/ Program] + +[https://itunes.apple.com/de/podcast/lgm-2011-video/id450990980 Video podcast] + +==GIMP and GEGL topics== +* Michael Terry: Introducing AdaptableGIMP [http://adaptablegimp.blogspot.de/ Blog] +* Nicolas Robidoux: Better and faster image resizing and resampling [http://libre-graphics-meeting.org/2011/day-4#NicolasRobidoux Description] + +==Other topics== +Colour management, other tools etc. diff --git a/wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20150911043802-edit.txt b/wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20150911043802-edit.txt new file mode 100644 index 0000000..e6c3ee6 --- /dev/null +++ b/wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20150911043802-edit.txt @@ -0,0 +1,20 @@ +[http://libregraphicsmeeting.org/2012/ Homepage] + +[http://libregraphicsmeeting.org/2012/program/ Program] + +==GIMP and GEGL topics== +* Peter Sikking, Kate Price: Rethinking text handling in GIMP [http://www.youtube.com/watch?v=eWCmb3eIr6k Video] +* Victor Oliveira: Implementing OpenCL support in GEGL and GIMP [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* Øyvind Kolås: GeglBuffer tight and flexible raster abstraction [http://www.youtube.com/watch?v=HFDbSQk9Ba0&feature=plcp Video] +* Michael Natterer: Goat Invasion in GIMP [http://www.youtube.com/watch?v=HFDbSQk9Ba0&feature=plcp Video] +* Øyvind Kolås: Petting Zoo with Goats [http://www.youtube.com/watch?v=HFDbSQk9Ba0&feature=plcp Video] +* Ramon Miranda: Digital Painting with open source [http://www.slideshare.net/lgworld/lgm2012-digital-painting Slides] +* Martin Renold: Predictable Painting +* Bassam Kurdali, Fateh Slavitskaya: Tube Open Movie: Blender 3D Animation in a Distributed Pipeline +* Amir Hassan: SoundFumble: live sound generation with Gimp [http://www.youtube.com/watch?v=teNkaSs_OmY&feature=plcp Video] +* Sirko Kemter: Open Source, Just Works - The LGM Book Workshop + +==Other topics== +Colour management, import filters, text handling, other graphics software, workflow, tools etc. + + diff --git a/wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20161024013729-show.txt b/wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20161024013729-show.txt new file mode 100644 index 0000000..c0b0b12 --- /dev/null +++ b/wiki/Hacking:LGM_2012_Libre_Graphics_Meeting,_Vienna,_Austria,_2012-20161024013729-show.txt @@ -0,0 +1,24 @@ + +[http://libregraphicsmeeting.org/2012/ Homepage] +[http://libregraphicsmeeting.org/2012/program/ Program] + + +==GIMP and GEGL topics== + +* Peter Sikking, Kate Price: Rethinking text handling in GIMP [http://www.youtube.com/watch?v=eWCmb3eIr6k Video] +* Victor Oliveira: Implementing OpenCL support in GEGL and GIMP [http://www.slideshare.net/lgworld/implementing-opencl-support-in-gegl-and-gimp#btnNext Slides] [http://www.youtube.com/watch?v=UzBPUalkqg8&feature=plcp Video] +* Øyvind Kolås: GeglBuffer tight and flexible raster abstraction [http://www.youtube.com/watch?v=HFDbSQk9Ba0&feature=plcp Video] +* Michael Natterer: Goat Invasion in GIMP [http://www.youtube.com/watch?v=HFDbSQk9Ba0&feature=plcp Video] +* Øyvind Kolås: Petting Zoo with Goats [http://www.youtube.com/watch?v=HFDbSQk9Ba0&feature=plcp Video] +* Ramon Miranda: Digital Painting with open source [http://www.slideshare.net/lgworld/lgm2012-digital-painting Slides] +* Martin Renold: Predictable Painting +* Bassam Kurdali, Fateh Slavitskaya: Tube Open Movie: Blender 3D Animation in a Distributed Pipeline +* Amir Hassan: SoundFumble: live sound generation with Gimp [http://www.youtube.com/watch?v=teNkaSs_OmY&feature=plcp Video] +* Sirko Kemter: Open Source, Just Works - The LGM Book Workshop + +==Other topics== + +Colour management, import filters, text handling, other graphics software, workflow, tools etc. + + + diff --git a/wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20150914160233-edit.txt b/wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20150914160233-edit.txt new file mode 100644 index 0000000..ace59bf --- /dev/null +++ b/wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20150914160233-edit.txt @@ -0,0 +1,98 @@ +__TOC__ + +==Links== +[http://libregraphicsmeeting.org/2013/ Homepage] + +[http://libregraphicsmeeting.org/2013/program/ Program] + +[http://medialab-prado.es/article/lgm_2013 Video archive] + +==GIMP and GEGL topics== +* GIMP team: Save your work, export results^W^W^W^W^W^WQ+A with GIMPers. [http://medialab-prado.es/article/gimpers presentation] +* Steve Czajka: GIMP Magazine +* David Tschumperlé: G'MIC: A full-featured framework for image processing with various interfaces +* Camille Bissuel, Cedric Gémy, Alexandre Quessy: Mikado, a "Future tool" for image manipulation with graphs and nodes based on Tempi and GEGL + + + +==Birds of a feather session== +===Participants=== + +:Jakub Steiner (jimmac) +:Øyvind Kolås (pippin) +:Ville Pätsi (drc) +:Simon Budig (nomis) +:Michael Natterer (mitch) +:Michael Schumacher (schumaml) + +:Jon Nordby (jonnor) +:Jehan Pagès (jehan) +:Tobias Jakobs +:Pablo Lopez +:Aryeom Han +:James Prichard +:Roberto Roch +:+ 2 + +===Topics=== + +====G’MIC & a GEGLified GIMP==== + +Pippin describes how G’MIC can be changed to add its filters to GIMP 2.10 and up, this extends to how this can be done in general. It is mentioned that plug-ins have to use the new plug-in API, or they will never get access to floating point data etc. + +What G’MIC has to add is a way for GIMP to query the available operations and their parameters in order to build generic interfaces for them (GParam* is mentioned) + +====Symbolic Icon Theme==== + +Jimmac talks about the symbolic icon theme that has been created during GNOME Outreach Program for Women. This will most likely be used for GIMP 3.0 + +====Knowledge transfer to forums==== + +schumaml mentions that overall, many replies given to questions of users in forums about gimp are not really satisfactory - sometimes even when being given by regulars and administrators of the respective forums. This is seen as an area where non-coding contributors can do a lot of good work - by interacting in forums on the one hand, but also by providing top-notch tutorials, which will act as reference for GIMP usage on the other hand. + +====Malicious downloads - how to fight them==== + +There are many places where GIMP, and especially its Windows installers, can be downloaded from. Some of these are places we like to do so - Jernej, Simone, Partha, Photocomix, other GIMP forums. + +Small bias against big downloader sites is there is suspicion that they might be repackaging the installers. + +Growing(?) problem of sites hiding behind “green download arrow” ad banners which lead users to InstallIQ-infested Windows installers for GIMP. Limited problem with outright trojans masquerading as GIMP, c.f. https://mail.gnome.org/archives/gimp-developer-list/2012-August/msg00074.html + +No real solutions, but an attempt can be made to get Google and other search engines to delist those sites. + +Constructive suggestion by Jimmac: prevent users from having to search for GIMP by getting it into OS X and Windows app stores, problem with that is subscriptions for developer certificates. + +====Google Summer of Code==== + +We are out of easy tasks to do, the remainder is complex. + +Suggestions for projects to offer/look out for: + + PSD format support improvement for loading, concentrating on retaining the image structure and correctness of the visual result. Exporting to PSD won’t result in the same file, even if nothing has changed. + + Slicing tool + + Resurrecting mathmap + + Running gegl ops out of process, like GIMP does with its plug-ins. Concept is defined, requires hard-core gobject knowledge. + + babl optimization, will require near obsessive-disorder determination to lower the errors, but also communication and social skill which are considered normal by established societies + +====Interjection by two local designers==== + +How is animation support in GIMP, and will it improve? + +Unfortunately not, but we explained how the existing, albeit cumbersome layer-as-frame animation works, and mentioned GAP. + +Discussion diverted to inclusion of Frame Manager from Cinepaint (infamous inside joke: “CEASE AND DESIST”), and that it isn’t really for animation, rather frame-by-frame video retouching. + + +====How to deal with abusive people on lists, Bugzilla, ...==== + +Recently, we’ve had to deal with one person on GNOME Bugzilla, who can, by all standards, be described as abusive - even repeated requests to change the behaviour have been unsuccessful. + +We do not want to establish a formal policy about how to deal with such behaviour, if only for not encouraging people to “test” it by navigating along its loopholes. Incidents will be evaluated on a case by cases basis, on the assumption that 99,9xxxx% of all people communicating in the project will never violate any of it. + +If GNOME establishes a policy for Bugzilla (and it seems like they’re doing so), we will evaluate and respond to it. + +Our goal is to be as inclusive as possible, but not on the expense of other participants. diff --git a/wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20161024001809-show.txt b/wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20161024001809-show.txt new file mode 100644 index 0000000..c988116 --- /dev/null +++ b/wiki/Hacking:LGM_2013_Libre_Graphics_Meeting,_Madrid,_Spain,_2013-20161024001809-show.txt @@ -0,0 +1,127 @@ + + +__TOC__ + +==Links== + +[http://libregraphicsmeeting.org/2013/ Homepage] +[http://libregraphicsmeeting.org/2013/program/ Program] +[http://medialab-prado.es/article/lgm_2013 Video archive] + + +==GIMP and GEGL topics== + +* GIMP team: Save your work, export results^W^W^W^W^W^WQ+A with GIMPers. [http://medialab-prado.es/article/gimpers presentation] +* Steve Czajka: GIMP Magazine +* David Tschumperlé: G'MIC: A full-featured framework for image processing with various interfaces +* Camille Bissuel, Cedric Gémy, Alexandre Quessy: Mikado, a "Future tool" for image manipulation with graphs and nodes based on Tempi and GEGL + + + + +==Birds of a feather session== + +===Participants=== +:Jakub Steiner (jimmac) + +:Øyvind Kolås (pippin) + +:Ville Pätsi (drc) + +:Simon Budig (nomis) + +:Michael Natterer (mitch) + +:Michael Schumacher (schumaml) + + +:Jon Nordby (jonnor) + +:Jehan Pagès (jehan) + +:Tobias Jakobs + +:Pablo Lopez + +:Aryeom Han + +:James Prichard + +:Roberto Roch + +:+ 2 + + + +===Topics=== + +====G’MIC & a GEGLified GIMP==== + +Pippin describes how G’MIC can be changed to add its filters to GIMP 2.10 and up, this extends to how this can be done in general. It is mentioned that plug-ins have to use the new plug-in API, or they will never get access to floating point data etc. + +What G’MIC has to add is a way for GIMP to query the available operations and their parameters in order to build generic interfaces for them (GParam* is mentioned) + + +====Symbolic Icon Theme==== + +Jimmac talks about the symbolic icon theme that has been created during GNOME Outreach Program for Women. This will most likely be used for GIMP 3.0 + + +====Knowledge transfer to forums==== + +schumaml mentions that overall, many replies given to questions of users in forums about gimp are not really satisfactory - sometimes even when being given by regulars and administrators of the respective forums. This is seen as an area where non-coding contributors can do a lot of good work - by interacting in forums on the one hand, but also by providing top-notch tutorials, which will act as reference for GIMP usage on the other hand. + + +====Malicious downloads - how to fight them==== + +There are many places where GIMP, and especially its Windows installers, can be downloaded from. Some of these are places we like to do so - Jernej, Simone, Partha, Photocomix, other GIMP forums. + +Small bias against big downloader sites is there is suspicion that they might be repackaging the installers. + +Growing(?) problem of sites hiding behind “green download arrow” ad banners which lead users to InstallIQ-infested Windows installers for GIMP. Limited problem with outright trojans masquerading as GIMP, c.f. [https://mail.gnome.org/archives/gimp-developer-list/2012-August/msg00074.html https://mail.gnome.org/archives/gimp-developer-list/2012-August/msg00074.html] + +No real solutions, but an attempt can be made to get Google and other search engines to delist those sites. + +Constructive suggestion by Jimmac: prevent users from having to search for GIMP by getting it into OS X and Windows app stores, problem with that is subscriptions for developer certificates. + + +====Google Summer of Code==== + +We are out of easy tasks to do, the remainder is complex. + +Suggestions for projects to offer/look out for: + +
       PSD format support improvement for loading, concentrating on retaining the image structure and correctness of the visual result. Exporting to PSD won’t result in the same file, even if nothing has changed.
    +
    +
       Slicing tool
    +
    +
       Resurrecting mathmap
    +
    +
       Running gegl ops out of process, like GIMP does with its plug-ins. Concept is defined, requires hard-core gobject knowledge.
    +
    +
       babl optimization, will require near obsessive-disorder determination to lower the errors, but also communication and social skill which are considered normal by established societies
    +
    + +====Interjection by two local designers==== + +How is animation support in GIMP, and will it improve? + +Unfortunately not, but we explained how the existing, albeit cumbersome layer-as-frame animation works, and mentioned GAP. + +Discussion diverted to inclusion of Frame Manager from Cinepaint (infamous inside joke: “CEASE AND DESIST”), and that it isn’t really for animation, rather frame-by-frame video retouching. + + + + + +====How to deal with abusive people on lists, Bugzilla, ...==== + +Recently, we’ve had to deal with one person on GNOME Bugzilla, who can, by all standards, be described as abusive - even repeated requests to change the behaviour have been unsuccessful. + +We do not want to establish a formal policy about how to deal with such behaviour, if only for not encouraging people to “test” it by navigating along its loopholes. Incidents will be evaluated on a case by cases basis, on the assumption that 99,9xxxx% of all people communicating in the project will never violate any of it. + +If GNOME establishes a policy for Bugzilla (and it seems like they’re doing so), we will evaluate and respond to it. + +Our goal is to be as inclusive as possible, but not on the expense of other participants. + + \ No newline at end of file diff --git a/wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20150911065020-edit.txt b/wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20150911065020-edit.txt new file mode 100644 index 0000000..f646f39 --- /dev/null +++ b/wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20150911065020-edit.txt @@ -0,0 +1,68 @@ +"Libre Graphics Meeting 2014, the annual conference and workshop for users and makers of free software creative applications, will take place on April 2–5, in Leipzig, Germany. + +The event is open to anyone with an interest in open source graphics, design, and creative culture. Software developers and artists alike are invited to attend, and will be welcome to submit topics for presentations, hands-on workshops, and birds-of-a-feather sessions once the call for participation is officially opened. + +2014 will mark the ninth anniversary of LGM, the premiere gathering of the free software graphics community, drawing developers, users and supporters alike from across the globe." + +(Announcement at the [http://libregraphicsmeeting.org/2013/ Libre graphics World website], retrieved on 29.06.2013) + + +== Links == + +[http://libregraphicsmeeting.org/2014/ Homepage] + +[http://libregraphicsmeeting.org/2014/program/ Program] + +[[LGM2014Minutes| GIMP meeting minutes]] + +==GIMP and GEGL topics== +* Peter Sikking: UI design for full GEGL integration in GIMP, Wed April 2, 2:30 p.m. + +* Artem Popov: Keeping metadata in remixed works, Wed April 2, 3:10 p.m. +* Peter Liljenberg, Artem Popov: BOF: The future of metadata, Fri April 4, 12:10 p.m. + +* Patrick David, Tobias Ellinghaus: Utilizing FL/OSS tools in a photographic workflow – Part II: The Work, Sat April 5, 12:30 p.m. + +* Manuel Quiñones: GEGL is not GIMP - creating graphic applications with GEGL, Sat April 5, 12:30 p.m. + +* Chris Murphy: State of color management, Wed April 2, 11:20 a.m. +* Chris Murphy: End to end color management workflow, Wed April 2, 12:10 p.m. +* Richard Hughes: Building an OpenHardware Spectrograph for Color Profiling in Linux, Wed April 2, 6:10 p.m. +* Chris Murphy: What about the color, Thu April 3, 12:10 p.m. + +* Fateh Slavitskaya, Bassam Kurdali: Distributed Free-Cultural Production and the Future of Creative Economy, Sat April 5, 4:00 p.m. + +==Other topics== +* State of Libre Graphics, Wed April 2, 10:00 a.m. +* LGM Code of Conduct meeting, Fri April 4, 9:30 a.m. +* LGM group photo and closing session, Sat April 5, 6:00 p.m. + +* Allan Day, Jakub Steiner: GNOME Design: Open to all, Sat April 5, 5:20 p.m. + +* Johannes Hanika: Wavelets for image processing, Wed April 2, 5:50 p.m. +* Øyvind Kolås: 0xA000 a font family, Thu April 3, 10:10 a.m. +* Simon Budig: Fonts in Printed Circuit Board design tools, Thu April 3, 2:30 p.m. +* Jon Nordby, Henri Bergius: Visually programming libre graphics tools, Fri April 4, 12:10 p.m. +* Frederik Steinmetz: Contributing to the community: Writing add-ons, Fri April 4, 5:30 p.m. +* Steve Conklin: Open Hardware devices to aid software testing, Sat April 5, 3:40 p.m. +* Ana Isabel Carvalho, Ricardo Lafuente: Dear designer, have these cool tools, Sat April 5, 4:40 p.m. + +[http://libregraphicsmeeting.org/2014/program/ and more...] + + diff --git a/wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20161024020118-show.txt b/wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20161024020118-show.txt new file mode 100644 index 0000000..80677cb --- /dev/null +++ b/wiki/Hacking:LGM_2014_Libre_Graphics_Meeting,_Leipzig,_Germany,_2014-20161024020118-show.txt @@ -0,0 +1,57 @@ + + +"Libre Graphics Meeting 2014, the annual conference and workshop for users and makers of free software creative applications, will take place on April 2–5, in Leipzig, Germany. + +The event is open to anyone with an interest in open source graphics, design, and creative culture. Software developers and artists alike are invited to attend, and will be welcome to submit topics for presentations, hands-on workshops, and birds-of-a-feather sessions once the call for participation is officially opened. + +2014 will mark the ninth anniversary of LGM, the premiere gathering of the free software graphics community, drawing developers, users and supporters alike from across the globe." + +(Announcement at the [http://libregraphicsmeeting.org/2013/ Libre graphics World website], retrieved on 29.06.2013) + + + + + +==Links== + +[http://libregraphicsmeeting.org/2014/ Homepage] +[http://libregraphicsmeeting.org/2014/program/ Program] +[[LGM2014Minutes| GIMP meeting minutes]] + + +==GIMP and GEGL topics== + +* Peter Sikking: UI design for full GEGL integration in GIMP, Wed April 2, 2:30 p.m. + +* Artem Popov: Keeping metadata in remixed works, Wed April 2, 3:10 p.m. +* Peter Liljenberg, Artem Popov: BOF: The future of metadata, Fri April 4, 12:10 p.m. + +* Patrick David, Tobias Ellinghaus: Utilizing FL/OSS tools in a photographic workflow – Part II: The Work, Sat April 5, 12:30 p.m. + +* Manuel Quiñones: GEGL is not GIMP - creating graphic applications with GEGL, Sat April 5, 12:30 p.m. + +* Chris Murphy: State of color management, Wed April 2, 11:20 a.m. +* Chris Murphy: End to end color management workflow, Wed April 2, 12:10 p.m. +* Richard Hughes: Building an OpenHardware Spectrograph for Color Profiling in Linux, Wed April 2, 6:10 p.m. +* Chris Murphy: What about the color, Thu April 3, 12:10 p.m. + +* Fateh Slavitskaya, Bassam Kurdali: Distributed Free-Cultural Production and the Future of Creative Economy, Sat April 5, 4:00 p.m. + +==Other topics== + +* State of Libre Graphics, Wed April 2, 10:00 a.m. +* LGM Code of Conduct meeting, Fri April 4, 9:30 a.m. +* LGM group photo and closing session, Sat April 5, 6:00 p.m. + +* Allan Day, Jakub Steiner: GNOME Design: Open to all, Sat April 5, 5:20 p.m. + +* Johannes Hanika: Wavelets for image processing, Wed April 2, 5:50 p.m. +* Øyvind Kolås: 0xA000 a font family, Thu April 3, 10:10 a.m. +* Simon Budig: Fonts in Printed Circuit Board design tools, Thu April 3, 2:30 p.m. +* Jon Nordby, Henri Bergius: Visually programming libre graphics tools, Fri April 4, 12:10 p.m. +* Frederik Steinmetz: Contributing to the community: Writing add-ons, Fri April 4, 5:30 p.m. +* Steve Conklin: Open Hardware devices to aid software testing, Sat April 5, 3:40 p.m. +* Ana Isabel Carvalho, Ricardo Lafuente: Dear designer, have these cool tools, Sat April 5, 4:40 p.m. +[http://libregraphicsmeeting.org/2014/program/ and more...] + + diff --git a/wiki/Hacking:Merging_lisanet.de_fork-20161024174608-edit.txt b/wiki/Hacking:Merging_lisanet.de_fork-20161024174608-edit.txt new file mode 100644 index 0000000..b2624d6 --- /dev/null +++ b/wiki/Hacking:Merging_lisanet.de_fork-20161024174608-edit.txt @@ -0,0 +1,313 @@ +Simone Karin Lehmann maintains an [http://gimp.lisanet.de/Website/News/News.html OSX release], which is basically a mini-fork since it includes [https://sourceforge.net/p/gimponosx/code/HEAD/tree/GimpPorts/ports/graphics/gimp2/files/ several patches] to GIMP. + +We had a quick check with Mitch and saw that many are outdated with current code. For instance some about a switch to Carbon->Cocoa platforms already in our code tree, or others obsoleted by our menu replacement. Others seem to make sense like the "color display change". + +This is a working page for GIMP developers to go through the list and decide what we want to integrate and what we want to leave out. + +1/ $ svn checkout svn://svn.code.sf.net/p/gimponosx/code/ gimponosx-code + +2/ $ cd gimponosx-code/GimpPorts/ports/graphics/gimp2/files/ + +3/ Check the patches and update the below lists to keep or not. For instance, if you reviewed a patch and it is not good for us, you can leave a "[exclude]" next to it. If we want to keep it but it needs work, add "[need work]", and so on. + +4/ I set up a [https://bugzilla.gnome.org/show_bug.cgi?id=719667 Bugzilla report]. When a patch seems good, make a `git format-patch` and upload it there for review if needed. :-) +We can close this report when all the patches of the list will have been either applied in our tree or discarded. :-) + +== List of Patches == + +{| class="wikitable sortable" +|- +! patch +! comment +! merge status +|- +| app-actions-dialogs-actions.c.diff +| ''Answer: Yes, change to 'About GIMP'.'' + +The specs supersede what other programs do. + +The [https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AppleHIGuidelines/Menus/Menus.html#//apple_ref/doc/uid/TP30000356-CIHDGFJB OS X human interface guidelines], [http://msdn.microsoft.com/de-de/library/windows/desktop/aa511502#standardMenus Windows human interface guidelines] provide for 'About GIMP'. The [https://developer.gnome.org/hig-book/stable/menus-standard.html.de#menu-standard-help GNOME human interface guidelines] uses only 'About'. More human interface guidelines are listed at [http://en.wikipedia.org/wiki/Human_interface_guidelines Wikipedia]. + +Peter Sikking advices in a [http://blog.mmiworks.net/2007/10/cross-is-bunk.html blog posting about cross-platform development] to use the platform specific specs. +| merged; please test on Windows +|- +| app-actions-file-actions.c.diff +| Add "file-hide" ("H") and "file-hide-others" ("H") actions. Are they common OSX actions? +| +|- +| app-actions-file-commands.c.diff +| The code (OSX specific, apparently using Cocoa headers) for the new "file-hide" and "file-hide-others" actions. +| +|- +| app-actions-file-commands.h.diff +| Headers for the new "file-hide" and "file-hide-others" actions +| +|- +| app-actions-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| app-actions-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-actions-plug-in-actions.c.diff +| Change "Repeat Last" action's shortcut from "F" to "F" and "Re-show Last" from "F" to "F". Are they shortcuts which make more sense on an OSX platform maybe? No idea. In any case, if we decide to change the fullscreen default shortcut, we will indeed also want to change the repat shortcuts for OSX specifically. +| +|- +| app-actions-view-actions.c.diff +| Changing Fullscreen actions from default F11 to "F" shortcut. According to [https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts Wikipedia], whereas F11 is the standard on every other platform, "⌘ Cmd+⇧ Shift+F" seems to be the standard on OSX. Is equivalent to Cmd+Shift when on OSX? +| +|- +| app-config-gimpcoreconfig.c.diff +| Some code relative to the save-xcf-only config added on this fork. +| discarded +|- +| app-config-gimpcoreconfig.h.diff +| Some code relative to the save-xcf-only config added on this fork. +| discarded +|- +| app-config-gimpdisplayconfig.c.diff +| Changing DEFAULT_MARCHING_ANTS_SPEED from 200 to 600. Is the current default too slow? +| +|- +| app-config-gimpguiconfig.c.diff +| Modifies default values of "dock-window-hint" and "toolbox-window-hint" properties from GIMP_WINDOW_HINT_UTILITY to GIMP_WINDOW_HINT_NORMAL. +| +|- +| app-config-gimprc-blurbs.h.diff +| Blurb for the save/export changes: "Uncheck to allow all image formats to be saved via the 'File - Save' menu entry" +| discarded +|- +| app-core-gimpimage.c.diff +| Code relative to the save/export changes. +| discarded +|- +| app-core-gimpimage.h.diff +| Code relative to the save/export changes. +| discarded +|- +| app-core-gimp-user-install.c.diff +| Ah! This one looks interesting. It adds some migration code for the config in ~/Library/GIMP (apparently 2.8.2) to /Library/Application Support/GIMP (since 2.8.4). Code checked and does some bad things (like moving config folder of older versions!) so I basically rewrote it fully. Commit 7ef45be8902a4b7403d1d1736ca4f7c95b6449a8 +| merged +|- +| app-dialogs-preferences-dialog.c.diff +| Commit 308efbb51401ef2a1032619c335e56150587f227 +|help browser change merged, rest discarded +|- +| app-file-file-open.c.diff +| Disable some check which looks for a "icc-profile" parasite on our image. Something to look into why she did this? +| +|- +| app-file-file-save.c.diff +| Some code related to the save/export changes. +| discarded +|- +| app-gui-gui.c.diff +| Looks like some kind of menu grouping change. I guess someone with OSX platform knowledge will know better what it is. Edit: appears it was already merged: commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-gui-gui-unique.c.diff +| Looks interesting, though I guess some OSX dev would need to look closer. Apparently some desktop integration. I copy-paste an in-code comment: + /* The application delegate handles some events + * - terminate GIMP + * - open files when GIMP is already running by dropping on the icon or Finder's 'Open with' + * The event handler + * - handles open events when GIMP is launched by dropping on the icon or Finder's 'Open with' + * + * Now Cocoa based. + */ +Edit: looks like it may have been handled in commit e56344294c90e1ba97de5c134b50c4c522f0808f? There is definitely some changes on app/gui/gui-unique.c with some similarities (but also many differences). Is it the same feature change? +| +|- +| app-gui-Makefile.am.diff +| commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-gui-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-Makefile.am.diff +| commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-menus-menus.c.diff +| 'Print' is now always set to CMD+P (under some circumstances this could be 'P' in the past). +To be examined in more detail. A quick comparison with Claytons 2.8.10 build showed no differences. +| +|- +| app-widgets-gimphelp.c.diff +| Some change in the help browser apparently, and apparently better integration to OSX locales, or something. Copy-paste from code: + /* on OS X there's no need for config->help_locales. The user can handle this + * via System Preferences. Even if she wants to use a different help locale than the + * default language. Just add this alternative locale in System Preferences and + * install the corresponding User manual. + */ +| +|- +| app-widgets-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| app-widgets-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| configure.ac.diff +| Commit e56344294c90e1ba97de5c134b50c4c522f0808f (note: the fork uses gtk-mac-integration version 2.0.0 and over, whereas we use 1.0.1 and over though. Moreover it seems it also uses a patched version of gtkosxapplication whereas we use obviously the upstream version). +| merged +|- +| configure.diff +| configure is generated. See the configure.ac patch. +| discarded +|- +| etc-gimprc.diff +| Add a config option to allow to save in any format. +| discarded +|- +| gimpguiconfig.c.diff +| older version of app-config-gimpguiconfig.c.diff. +| discarded +|- +| lcms.c.diff +| See plug-ins-common-lcms.c.diff (duplicate). +| discarded +|- +| libgimpbase-gimpenv.c.diff +| Just does this change: +-#include ++#import +Not sure why is that. +| +|- +| libgimp-gimpui.c.diff +| Removes a signal handling on "show" for a window that is made transient. Not sure what this signal handling was supposed to do ([NSApp arrangeInFront: nil] -> pushing it to the top of window layers?). +| +|- +| libgimp-Makefile.am.diff +| Commit 0b56aa0d133a9743dca74701a54f21cf9c609f7d +| merged +|- +| libgimp-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| libgimpthumb-gimp-thumbnail-list.c.diff +| Add support for Freedesktop's Thumbnail standard to this file. We already added support to another file as of [https://bugzilla.gnome.org/show_bug.cgi?id=646644 bug 646644]. It seems we may have forgotten a part of the code. :-) +I opened [https://bugzilla.gnome.org/show_bug.cgi?id=719830 bug 719830] for this, with a patch based on our existing core code.. +| merged +|- +| libgimpthumb-gimpthumb-utils.c.diff +| Just does this change: +-#include ++#import +Not sure why is that. +| +|- +| libgimpwidgets-gimpdialog.c.diff +| Position a dialog at display center as default. Commit 0b56aa0d133a9743dca74701a54f21cf9c609f7d then implementation changed with 9e5ed1e70acfef7a488982ae42ea08c32e18a52d. +| merged +|- +| libgimpwidgets-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| libgimpwidgets-Makefile.am.diff-old.diff +| Same as libgimpwidgets-Makefile.am.diff with fixed tabulation. +| discarded +|- +| libgimpwidgets-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| Makefile.in.diff +| This patch tries to disable gtk-doc on a `distcheck` target. +| discarded +|- +| modules-display-filter-lcms.c.diff +| Looks interesting. If nothing else because it seems this piece of code has been forgotten and is still using Carbon on our master (at least there is a remaining Carbon.h include)! +| +|- +| modules-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| modules-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-common-file-ps.c.diff +| Communicate with Ghostscript asynchronously. +| +|- +| plug-ins-common-file-tiff-load.c.diff +| See comment on plug-ins-file-jpeg-jpeg.c.diff. +| discarded +|- +| plug-ins-common-file-tiff-save.c.diff +| See comment on plug-ins-file-jpeg-jpeg.c.diff. +| discarded +|- +| plug-ins-common-lcms.c.diff +| The lcms plug-in is gone in master. +| discarded +|- +| plug-ins-common-web-browser.c.diff +| Commit 308efbb51401ef2a1032619c335e56150587f227 - Should be merged upstream. +| merged +|- +| plug-ins-file-jpeg-jpeg.c.diff +| Try to load and save back metadata (saved in a temporary empty jpeg image) by running the external command exiftool through system()! I don't think we want this, first because we have a new metadata system in master, second because that's a terrible design for just so many reasons! +| discarded +|- +| plugins-filejpeg-jpeg.c.diff +| Exactly same as plug-ins-file-jpeg-jpeg.c.diff +| discarded +|- +| plug-ins-help-gimphelplocale.c.diff +| Use OS X specific implementation. +| +|- +| plug-ins-help-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| plug-ins-help-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-script-fu-Makefile.am.diff +| Commit 83de53ee4de56c41694b7196345586e8f6578d23 +| merged +|- +| plug-ins-script-fu-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-script-fu-script-fu-interface.c.diff +| Some changes about script-fu dialog hiding/showing, or something? Better a OSX dev check this. Only 3 small changes, fast to check. +Note: apparently it modifies further commit 83de53ee4de56c41694b7196345586e8f6578d23 by Mitch (which was already coming from a patch from Simone originally!). +| +|- +| po-de.po.diff +| ''Answer: Yes, 'Über GIMP' is the proper translation.'' for Windows and OS X, for GNOME it is 'Info'. +| merged w/o the 'Force to save in XCF format' translation +|- +| save-export-conf-patch.diff +| Code for the save/export changes. +| discarded +|- +| save-export-patch.diff +| I don't think anyone has actually checked the save/export patches, but there are some [https://mail.gnome.org/archives/gimp-developer-list/2012-November/msg00318.html written specs]. If this is up to date with the patch, basically it allows to "save" images into non-XCF format if and only if the image has just +one layers. The current opinion is that this feels like "unpredictable magic". It would likely feel like really inconsistent to a user (some times you can "save" to non-XCF, sometimes no). +| discarded +|- +| tools-gimptool.c.diff +| Deprecated. Changes something we already changed (GIMP directory) both in master and gimp-2-8 in OSX case. +| discarded +|} diff --git a/wiki/Hacking:Merging_lisanet.de_fork-20180812150613-show.txt b/wiki/Hacking:Merging_lisanet.de_fork-20180812150613-show.txt new file mode 100644 index 0000000..0b82f09 --- /dev/null +++ b/wiki/Hacking:Merging_lisanet.de_fork-20180812150613-show.txt @@ -0,0 +1,333 @@ + + +Simone Karin Lehmann maintains an [http://gimp.lisanet.de/Website/News/News.html OSX release], which is basically a mini-fork since it includes [https://sourceforge.net/p/gimponosx/code/HEAD/tree/GimpPorts/ports/graphics/gimp2/files/ several patches] to GIMP. + +We had a quick check with Mitch and saw that many are outdated with current code. For instance some about a switch to Carbon->Cocoa platforms already in our code tree, or others obsoleted by our menu replacement. Others seem to make sense like the "color display change". + +This is a working page for GIMP developers to go through the list and decide what we want to integrate and what we want to leave out. + +1/ $ svn checkout svn://svn.code.sf.net/p/gimponosx/code/ gimponosx-code + +2/ $ cd gimponosx-code/GimpPorts/ports/graphics/gimp2/files/ + +3/ Check the patches and update the below lists to keep or not. For instance, if you reviewed a patch and it is not good for us, you can leave a "[exclude]" next to it. If we want to keep it but it needs work, add "[need work]", and so on. + +4/ I set up a [https://bugzilla.gnome.org/show_bug.cgi?id=719667 Bugzilla report]. When a patch seems good, make a `git format-patch` and upload it there for review if needed. :-) +We can close this report when all the patches of the list will have been either applied in our tree or discarded. :-) + + +==List of Patches== + +{| class="wikitable" +|- +! patch +! comment +! merge status +|- +| app-actions-dialogs-actions.c.diff +| ''Answer: Yes, change to 'About GIMP'.'' + +The specs supersede what other programs do. + +The [https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AppleHIGuidelines/Menus/Menus.html#//apple_ref/doc/uid/TP30000356-CIHDGFJB OS X human interface guidelines], [http://msdn.microsoft.com/de-de/library/windows/desktop/aa511502#standardMenus Windows human interface guidelines] provide for 'About GIMP'. The [https://developer.gnome.org/hig-book/stable/menus-standard.html.de#menu-standard-help GNOME human interface guidelines] uses only 'About'. More human interface guidelines are listed at [http://en.wikipedia.org/wiki/Human_interface_guidelines Wikipedia]. + +Peter Sikking advices in a [http://blog.mmiworks.net/2007/10/cross-is-bunk.html blog posting about cross-platform development] to use the platform specific specs. + +| merged; please test on Windows +|- +| app-actions-file-actions.c.diff +| Add "file-hide" ("H") and "file-hide-others" ("H") actions. Are they common OSX actions? +| +|- +| app-actions-file-commands.c.diff +| The code (OSX specific, apparently using Cocoa headers) for the new "file-hide" and "file-hide-others" actions. +| +|- +| app-actions-file-commands.h.diff +| Headers for the new "file-hide" and "file-hide-others" actions +| +|- +| app-actions-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| app-actions-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-actions-plug-in-actions.c.diff +| Change "Repeat Last" action's shortcut from "F" to "F" and "Re-show Last" from "F" to "F". Are they shortcuts which make more sense on an OSX platform maybe? No idea. In any case, if we decide to change the fullscreen default shortcut, we will indeed also want to change the repat shortcuts for OSX specifically. +| +|- +| app-actions-view-actions.c.diff +| Changing Fullscreen actions from default F11 to "F" shortcut. According to [https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts Wikipedia], whereas F11 is the standard on every other platform, "⌘ Cmd+⇧ Shift+F" seems to be the standard on OSX. Is equivalent to Cmd+Shift when on OSX? +| +|- +| app-config-gimpcoreconfig.c.diff +| Some code relative to the save-xcf-only config added on this fork. +| discarded +|- +| app-config-gimpcoreconfig.h.diff +| Some code relative to the save-xcf-only config added on this fork. +| discarded +|- +| app-config-gimpdisplayconfig.c.diff +| Changing DEFAULT_MARCHING_ANTS_SPEED from 200 to 600. Is the current default too slow? +| +|- +| app-config-gimpguiconfig.c.diff +| Modifies default values of "dock-window-hint" and "toolbox-window-hint" properties from GIMP_WINDOW_HINT_UTILITY to GIMP_WINDOW_HINT_NORMAL. +| +|- +| app-config-gimprc-blurbs.h.diff +| Blurb for the save/export changes: "Uncheck to allow all image formats to be saved via the 'File - Save' menu entry" +| discarded +|- +| app-core-gimpimage.c.diff +| Code relative to the save/export changes. +| discarded +|- +| app-core-gimpimage.h.diff +| Code relative to the save/export changes. +| discarded +|- +| app-core-gimp-user-install.c.diff +| Ah! This one looks interesting. It adds some migration code for the config in ~/Library/GIMP (apparently 2.8.2) to /Library/Application Support/GIMP (since 2.8.4). Code checked and does some bad things (like moving config folder of older versions!) so I basically rewrote it fully. Commit 7ef45be8902a4b7403d1d1736ca4f7c95b6449a8 +| merged +|- +| app-dialogs-preferences-dialog.c.diff +| Commit 308efbb51401ef2a1032619c335e56150587f227 +| help browser change merged, rest discarded +|- +| app-file-file-open.c.diff +| Disable some check which looks for a "icc-profile" parasite on our image. Something to look into why she did this? +| +|- +| app-file-file-save.c.diff +| Some code related to the save/export changes. +| discarded +|- +| app-gui-gui.c.diff +| Looks like some kind of menu grouping change. I guess someone with OSX platform knowledge will know better what it is. Edit: appears it was already merged: commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-gui-gui-unique.c.diff +| Looks interesting, though I guess some OSX dev would need to look closer. Apparently some desktop integration. I copy-paste an in-code comment: +
    /* The application delegate handles some events
    + * - terminate GIMP
    + * - open files when GIMP is already running by dropping on the icon or Finder's 'Open with'
    + * The event handler
    + * - handles open events when GIMP is launched by dropping on the icon or Finder's 'Open with'
    + *
    + * Now Cocoa based.
    + */
    +
    + +Edit: looks like it may have been handled in commit e56344294c90e1ba97de5c134b50c4c522f0808f? There is definitely some changes on app/gui/gui-unique.c with some similarities (but also many differences). Is it the same feature change? + +| +|- +| app-gui-Makefile.am.diff +| commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-gui-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-Makefile.am.diff +| commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-menus-menus.c.diff +| 'Print' is now always set to CMD+P (under some circumstances this could be 'P' in the past). + +To be examined in more detail. A quick comparison with Claytons 2.8.10 build showed no differences. + +| +|- +| app-widgets-gimphelp.c.diff +| Some change in the help browser apparently, and apparently better integration to OSX locales, or something. Copy-paste from code: +
      /* on OS X there's no need for config->help_locales. The user can handle this
    +   * via System Preferences. Even if she wants to use a different help locale than the 
    +   * default language. Just add this alternative locale in System Preferences and
    +   * install the corresponding User manual.
    +   */
    +
    +| +|- +| app-widgets-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| app-widgets-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| configure.ac.diff +| Commit e56344294c90e1ba97de5c134b50c4c522f0808f (note: the fork uses gtk-mac-integration version 2.0.0 and over, whereas we use 1.0.1 and over though. Moreover it seems it also uses a patched version of gtkosxapplication whereas we use obviously the upstream version). +| merged +|- +| configure.diff +| configure is generated. See the configure.ac patch. +| discarded +|- +| etc-gimprc.diff +| Add a config option to allow to save in any format. +| discarded +|- +| gimpguiconfig.c.diff +| older version of app-config-gimpguiconfig.c.diff. +| discarded +|- +| lcms.c.diff +| See plug-ins-common-lcms.c.diff (duplicate). +| discarded +|- +| libgimpbase-gimpenv.c.diff +| Just does this change: + +-#include ++#import +Not sure why is that. + +| +|- +| libgimp-gimpui.c.diff +| Removes a signal handling on "show" for a window that is made transient. Not sure what this signal handling was supposed to do ([NSApp arrangeInFront: nil] -> pushing it to the top of window layers?). +| +|- +| libgimp-Makefile.am.diff +| Commit 0b56aa0d133a9743dca74701a54f21cf9c609f7d +| merged +|- +| libgimp-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| libgimpthumb-gimp-thumbnail-list.c.diff +| Add support for Freedesktop's Thumbnail standard to this file. We already added support to another file as of [https://bugzilla.gnome.org/show_bug.cgi?id=646644 bug 646644]. It seems we may have forgotten a part of the code. :-) + +I opened [https://bugzilla.gnome.org/show_bug.cgi?id=719830 bug 719830] for this, with a patch based on our existing core code.. + +| merged +|- +| libgimpthumb-gimpthumb-utils.c.diff +| Just does this change: + +-#include ++#import +Not sure why is that. + +| +|- +| libgimpwidgets-gimpdialog.c.diff +| Position a dialog at display center as default. Commit 0b56aa0d133a9743dca74701a54f21cf9c609f7d then implementation changed with 9e5ed1e70acfef7a488982ae42ea08c32e18a52d. +| merged +|- +| libgimpwidgets-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| libgimpwidgets-Makefile.am.diff-old.diff +| Same as libgimpwidgets-Makefile.am.diff with fixed tabulation. +| discarded +|- +| libgimpwidgets-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| Makefile.in.diff +| This patch tries to disable gtk-doc on a `distcheck` target. +| discarded +|- +| modules-display-filter-lcms.c.diff +| Looks interesting. If nothing else because it seems this piece of code has been forgotten and is still using Carbon on our master (at least there is a remaining Carbon.h include)! +| +|- +| modules-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| modules-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-common-file-ps.c.diff +| Communicate with Ghostscript asynchronously. +| +|- +| plug-ins-common-file-tiff-load.c.diff +| See comment on plug-ins-file-jpeg-jpeg.c.diff. +| discarded +|- +| plug-ins-common-file-tiff-save.c.diff +| See comment on plug-ins-file-jpeg-jpeg.c.diff. +| discarded +|- +| plug-ins-common-lcms.c.diff +| The lcms plug-in is gone in master. +| discarded +|- +| plug-ins-common-web-browser.c.diff +| Commit 308efbb51401ef2a1032619c335e56150587f227 - Should be merged upstream. +| merged +|- +| plug-ins-file-jpeg-jpeg.c.diff +| Try to load and save back metadata (saved in a temporary empty jpeg image) by running the external command exiftool through system()! I don't think we want this, first because we have a new metadata system in master, second because that's a terrible design for just so many reasons! +| discarded +|- +| plugins-filejpeg-jpeg.c.diff +| Exactly same as plug-ins-file-jpeg-jpeg.c.diff +| discarded +|- +| plug-ins-help-gimphelplocale.c.diff +| Use OS X specific implementation. +| +|- +| plug-ins-help-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| plug-ins-help-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-script-fu-Makefile.am.diff +| Commit 83de53ee4de56c41694b7196345586e8f6578d23 +| merged +|- +| plug-ins-script-fu-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-script-fu-script-fu-interface.c.diff +| Some changes about script-fu dialog hiding/showing, or something? Better a OSX dev check this. Only 3 small changes, fast to check. + +Note: apparently it modifies further commit 83de53ee4de56c41694b7196345586e8f6578d23 by Mitch (which was already coming from a patch from Simone originally!). + +| +|- +| po-de.po.diff +| ''Answer: Yes, 'Über GIMP' is the proper translation.'' for Windows and OS X, for GNOME it is 'Info'. +| merged w/o the 'Force to save in XCF format' translation +|- +| save-export-conf-patch.diff +| Code for the save/export changes. +| discarded +|- +| save-export-patch.diff +| I don't think anyone has actually checked the save/export patches, but there are some [https://mail.gnome.org/archives/gimp-developer-list/2012-November/msg00318.html written specs]. If this is up to date with the patch, basically it allows to "save" images into non-XCF format if and only if the image has just + +one layers. The current opinion is that this feels like "unpredictable magic". It would likely feel like really inconsistent to a user (some times you can "save" to non-XCF, sometimes no). + +| discarded +|- +| tools-gimptool.c.diff +| Deprecated. Changes something we already changed (GIMP directory) both in master and gimp-2-8 in OSX case. +| discarded +|} diff --git a/wiki/Hacking:Merging_lisanet.de_fork-20201028005049-edit.txt b/wiki/Hacking:Merging_lisanet.de_fork-20201028005049-edit.txt new file mode 100644 index 0000000..b2624d6 --- /dev/null +++ b/wiki/Hacking:Merging_lisanet.de_fork-20201028005049-edit.txt @@ -0,0 +1,313 @@ +Simone Karin Lehmann maintains an [http://gimp.lisanet.de/Website/News/News.html OSX release], which is basically a mini-fork since it includes [https://sourceforge.net/p/gimponosx/code/HEAD/tree/GimpPorts/ports/graphics/gimp2/files/ several patches] to GIMP. + +We had a quick check with Mitch and saw that many are outdated with current code. For instance some about a switch to Carbon->Cocoa platforms already in our code tree, or others obsoleted by our menu replacement. Others seem to make sense like the "color display change". + +This is a working page for GIMP developers to go through the list and decide what we want to integrate and what we want to leave out. + +1/ $ svn checkout svn://svn.code.sf.net/p/gimponosx/code/ gimponosx-code + +2/ $ cd gimponosx-code/GimpPorts/ports/graphics/gimp2/files/ + +3/ Check the patches and update the below lists to keep or not. For instance, if you reviewed a patch and it is not good for us, you can leave a "[exclude]" next to it. If we want to keep it but it needs work, add "[need work]", and so on. + +4/ I set up a [https://bugzilla.gnome.org/show_bug.cgi?id=719667 Bugzilla report]. When a patch seems good, make a `git format-patch` and upload it there for review if needed. :-) +We can close this report when all the patches of the list will have been either applied in our tree or discarded. :-) + +== List of Patches == + +{| class="wikitable sortable" +|- +! patch +! comment +! merge status +|- +| app-actions-dialogs-actions.c.diff +| ''Answer: Yes, change to 'About GIMP'.'' + +The specs supersede what other programs do. + +The [https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AppleHIGuidelines/Menus/Menus.html#//apple_ref/doc/uid/TP30000356-CIHDGFJB OS X human interface guidelines], [http://msdn.microsoft.com/de-de/library/windows/desktop/aa511502#standardMenus Windows human interface guidelines] provide for 'About GIMP'. The [https://developer.gnome.org/hig-book/stable/menus-standard.html.de#menu-standard-help GNOME human interface guidelines] uses only 'About'. More human interface guidelines are listed at [http://en.wikipedia.org/wiki/Human_interface_guidelines Wikipedia]. + +Peter Sikking advices in a [http://blog.mmiworks.net/2007/10/cross-is-bunk.html blog posting about cross-platform development] to use the platform specific specs. +| merged; please test on Windows +|- +| app-actions-file-actions.c.diff +| Add "file-hide" ("H") and "file-hide-others" ("H") actions. Are they common OSX actions? +| +|- +| app-actions-file-commands.c.diff +| The code (OSX specific, apparently using Cocoa headers) for the new "file-hide" and "file-hide-others" actions. +| +|- +| app-actions-file-commands.h.diff +| Headers for the new "file-hide" and "file-hide-others" actions +| +|- +| app-actions-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| app-actions-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-actions-plug-in-actions.c.diff +| Change "Repeat Last" action's shortcut from "F" to "F" and "Re-show Last" from "F" to "F". Are they shortcuts which make more sense on an OSX platform maybe? No idea. In any case, if we decide to change the fullscreen default shortcut, we will indeed also want to change the repat shortcuts for OSX specifically. +| +|- +| app-actions-view-actions.c.diff +| Changing Fullscreen actions from default F11 to "F" shortcut. According to [https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts Wikipedia], whereas F11 is the standard on every other platform, "⌘ Cmd+⇧ Shift+F" seems to be the standard on OSX. Is equivalent to Cmd+Shift when on OSX? +| +|- +| app-config-gimpcoreconfig.c.diff +| Some code relative to the save-xcf-only config added on this fork. +| discarded +|- +| app-config-gimpcoreconfig.h.diff +| Some code relative to the save-xcf-only config added on this fork. +| discarded +|- +| app-config-gimpdisplayconfig.c.diff +| Changing DEFAULT_MARCHING_ANTS_SPEED from 200 to 600. Is the current default too slow? +| +|- +| app-config-gimpguiconfig.c.diff +| Modifies default values of "dock-window-hint" and "toolbox-window-hint" properties from GIMP_WINDOW_HINT_UTILITY to GIMP_WINDOW_HINT_NORMAL. +| +|- +| app-config-gimprc-blurbs.h.diff +| Blurb for the save/export changes: "Uncheck to allow all image formats to be saved via the 'File - Save' menu entry" +| discarded +|- +| app-core-gimpimage.c.diff +| Code relative to the save/export changes. +| discarded +|- +| app-core-gimpimage.h.diff +| Code relative to the save/export changes. +| discarded +|- +| app-core-gimp-user-install.c.diff +| Ah! This one looks interesting. It adds some migration code for the config in ~/Library/GIMP (apparently 2.8.2) to /Library/Application Support/GIMP (since 2.8.4). Code checked and does some bad things (like moving config folder of older versions!) so I basically rewrote it fully. Commit 7ef45be8902a4b7403d1d1736ca4f7c95b6449a8 +| merged +|- +| app-dialogs-preferences-dialog.c.diff +| Commit 308efbb51401ef2a1032619c335e56150587f227 +|help browser change merged, rest discarded +|- +| app-file-file-open.c.diff +| Disable some check which looks for a "icc-profile" parasite on our image. Something to look into why she did this? +| +|- +| app-file-file-save.c.diff +| Some code related to the save/export changes. +| discarded +|- +| app-gui-gui.c.diff +| Looks like some kind of menu grouping change. I guess someone with OSX platform knowledge will know better what it is. Edit: appears it was already merged: commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-gui-gui-unique.c.diff +| Looks interesting, though I guess some OSX dev would need to look closer. Apparently some desktop integration. I copy-paste an in-code comment: + /* The application delegate handles some events + * - terminate GIMP + * - open files when GIMP is already running by dropping on the icon or Finder's 'Open with' + * The event handler + * - handles open events when GIMP is launched by dropping on the icon or Finder's 'Open with' + * + * Now Cocoa based. + */ +Edit: looks like it may have been handled in commit e56344294c90e1ba97de5c134b50c4c522f0808f? There is definitely some changes on app/gui/gui-unique.c with some similarities (but also many differences). Is it the same feature change? +| +|- +| app-gui-Makefile.am.diff +| commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-gui-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-Makefile.am.diff +| commit e56344294c90e1ba97de5c134b50c4c522f0808f +| merged +|- +| app-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| app-menus-menus.c.diff +| 'Print' is now always set to CMD+P (under some circumstances this could be 'P' in the past). +To be examined in more detail. A quick comparison with Claytons 2.8.10 build showed no differences. +| +|- +| app-widgets-gimphelp.c.diff +| Some change in the help browser apparently, and apparently better integration to OSX locales, or something. Copy-paste from code: + /* on OS X there's no need for config->help_locales. The user can handle this + * via System Preferences. Even if she wants to use a different help locale than the + * default language. Just add this alternative locale in System Preferences and + * install the corresponding User manual. + */ +| +|- +| app-widgets-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| app-widgets-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| configure.ac.diff +| Commit e56344294c90e1ba97de5c134b50c4c522f0808f (note: the fork uses gtk-mac-integration version 2.0.0 and over, whereas we use 1.0.1 and over though. Moreover it seems it also uses a patched version of gtkosxapplication whereas we use obviously the upstream version). +| merged +|- +| configure.diff +| configure is generated. See the configure.ac patch. +| discarded +|- +| etc-gimprc.diff +| Add a config option to allow to save in any format. +| discarded +|- +| gimpguiconfig.c.diff +| older version of app-config-gimpguiconfig.c.diff. +| discarded +|- +| lcms.c.diff +| See plug-ins-common-lcms.c.diff (duplicate). +| discarded +|- +| libgimpbase-gimpenv.c.diff +| Just does this change: +-#include ++#import +Not sure why is that. +| +|- +| libgimp-gimpui.c.diff +| Removes a signal handling on "show" for a window that is made transient. Not sure what this signal handling was supposed to do ([NSApp arrangeInFront: nil] -> pushing it to the top of window layers?). +| +|- +| libgimp-Makefile.am.diff +| Commit 0b56aa0d133a9743dca74701a54f21cf9c609f7d +| merged +|- +| libgimp-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| libgimpthumb-gimp-thumbnail-list.c.diff +| Add support for Freedesktop's Thumbnail standard to this file. We already added support to another file as of [https://bugzilla.gnome.org/show_bug.cgi?id=646644 bug 646644]. It seems we may have forgotten a part of the code. :-) +I opened [https://bugzilla.gnome.org/show_bug.cgi?id=719830 bug 719830] for this, with a patch based on our existing core code.. +| merged +|- +| libgimpthumb-gimpthumb-utils.c.diff +| Just does this change: +-#include ++#import +Not sure why is that. +| +|- +| libgimpwidgets-gimpdialog.c.diff +| Position a dialog at display center as default. Commit 0b56aa0d133a9743dca74701a54f21cf9c609f7d then implementation changed with 9e5ed1e70acfef7a488982ae42ea08c32e18a52d. +| merged +|- +| libgimpwidgets-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| libgimpwidgets-Makefile.am.diff-old.diff +| Same as libgimpwidgets-Makefile.am.diff with fixed tabulation. +| discarded +|- +| libgimpwidgets-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| Makefile.in.diff +| This patch tries to disable gtk-doc on a `distcheck` target. +| discarded +|- +| modules-display-filter-lcms.c.diff +| Looks interesting. If nothing else because it seems this piece of code has been forgotten and is still using Carbon on our master (at least there is a remaining Carbon.h include)! +| +|- +| modules-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| modules-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-common-file-ps.c.diff +| Communicate with Ghostscript asynchronously. +| +|- +| plug-ins-common-file-tiff-load.c.diff +| See comment on plug-ins-file-jpeg-jpeg.c.diff. +| discarded +|- +| plug-ins-common-file-tiff-save.c.diff +| See comment on plug-ins-file-jpeg-jpeg.c.diff. +| discarded +|- +| plug-ins-common-lcms.c.diff +| The lcms plug-in is gone in master. +| discarded +|- +| plug-ins-common-web-browser.c.diff +| Commit 308efbb51401ef2a1032619c335e56150587f227 - Should be merged upstream. +| merged +|- +| plug-ins-file-jpeg-jpeg.c.diff +| Try to load and save back metadata (saved in a temporary empty jpeg image) by running the external command exiftool through system()! I don't think we want this, first because we have a new metadata system in master, second because that's a terrible design for just so many reasons! +| discarded +|- +| plugins-filejpeg-jpeg.c.diff +| Exactly same as plug-ins-file-jpeg-jpeg.c.diff +| discarded +|- +| plug-ins-help-gimphelplocale.c.diff +| Use OS X specific implementation. +| +|- +| plug-ins-help-Makefile.am.diff +| Adding a "-xobjective-c" flag by default, thus specifying all files are Objective-C, even when not necessary. Do we want this for OSX? +| +|- +| plug-ins-help-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-script-fu-Makefile.am.diff +| Commit 83de53ee4de56c41694b7196345586e8f6578d23 +| merged +|- +| plug-ins-script-fu-Makefile.in.diff +| Makefile.in are generated. See the Makefile.am patch. +| discarded +|- +| plug-ins-script-fu-script-fu-interface.c.diff +| Some changes about script-fu dialog hiding/showing, or something? Better a OSX dev check this. Only 3 small changes, fast to check. +Note: apparently it modifies further commit 83de53ee4de56c41694b7196345586e8f6578d23 by Mitch (which was already coming from a patch from Simone originally!). +| +|- +| po-de.po.diff +| ''Answer: Yes, 'Über GIMP' is the proper translation.'' for Windows and OS X, for GNOME it is 'Info'. +| merged w/o the 'Force to save in XCF format' translation +|- +| save-export-conf-patch.diff +| Code for the save/export changes. +| discarded +|- +| save-export-patch.diff +| I don't think anyone has actually checked the save/export patches, but there are some [https://mail.gnome.org/archives/gimp-developer-list/2012-November/msg00318.html written specs]. If this is up to date with the patch, basically it allows to "save" images into non-XCF format if and only if the image has just +one layers. The current opinion is that this feels like "unpredictable magic". It would likely feel like really inconsistent to a user (some times you can "save" to non-XCF, sometimes no). +| discarded +|- +| tools-gimptool.c.diff +| Deprecated. Changes something we already changed (GIMP directory) both in master and gimp-2-8 in OSX case. +| discarded +|} diff --git a/wiki/Hacking:Netbeans-20150910192804-edit.txt b/wiki/Hacking:Netbeans-20150910192804-edit.txt new file mode 100644 index 0000000..1d72328 --- /dev/null +++ b/wiki/Hacking:Netbeans-20150910192804-edit.txt @@ -0,0 +1,40 @@ +This page will teach you how to set [http://netbeans.org/ Netbeans IDE] to work on the latest source of GIMP from git. In order to work with Netbeans on GIMP, you will have to install the C plugin for Netbeans (or simply download Netbeans with C support). See [http://netbeans.org/community/releases/68/cpp-setup-instructions.html Configuring the NetBeans IDE for C/C++/Fortran]. + +=== Why use Netbeans to work on GIMP? === +* Because it has an extremely good autocompletion, that will be configured automatically for you! +* Because it's an IDE and not just a text editor (meaning it manages many files at once, it has syntax highlighting, it can manage tasks, ...) +* Because it's very easy to use (it's not Emacs :P) + +=== Why not to use Netbeans to work on GIMP? === +* Because it's not Emacs :P + +== Preparing the build environment == +In order for Netbeans to be able to configure all the dependencies of GIMP automatically, you will have to have a working environment in which you can compile GIMP. Netbeans will pull all the needed configurations from your Makefile, so we need to be able to reach the stage of generating GIMP's Makefiles. + +Building GIMP itself is a subject for a different page - see [[Build:Basic]] +After you have the version of GIMP which you want to work on, run the ./configure script to generate all the makefiles (or run ./autogen.sh if you are building GIMP from git). Build GIMP and test that it works without any errors - if there any errors (especially in the Makefile) it will annoy Netbeans... + +== Configuring Netbeans to work on GIMP == +This was tested with Netbeans 6.8 on GIMP 2.7.1 from git. For any errors/problems please report to LightningIsMyName at irc://irc.gimp.org/#gimp. +# Open Netbeans. +# Create a new project. +# In the "Choose Project" screen, choose "C/C++" -> "C/C++ project with existing sources", and click Next. +# In the "Select Mode" screen: +#* For the folder, choose the root folder of GIMP's source. +#* For the configuration mode, choose "Custom". +#* Click Next. +# In the "Build Tool" screen, choose "Using an Existing makefile" and make sure that the selected file is called "Makefile" and it's directly under GIMP's source root dir. Click Next. +# In the build action screen, you can either leave it as is or pass other parameters. For example, I like to add "-j3" to the "Build Command" so that build will use two cores (since I'm on a Dual-Core PC). Click Next. +# In the "Source Files" screen, simply click Next. +# In the "Code Assistance Configuration", make sure "Automatic Configuration" is selected and click Next +# In the "Project Name and Location" screen, give a name for your project and choose a directory for it's configuration files (do NOT select GIMP's source directory!). Click Finish + +Netbeans will now scan and parse GIMP's source. You may encounter the following problems during this scan: +* You will get a dialog asking questions about associating certain file types (usually about xbm) with Netbeans. Say No. +* After parsing will reach 100% it will get stuck - the UI will still be partially responsive, but it will remain on 100%. When this happens, close Netbeans and launch it again +* After opening the project for the first time, netbeans will just get stuck without any obvious reason. Close it (if needed, do it brutally) and launch it again. + +Final Notes: +* Every time you'll launch Netbeans, if the GIMP project is still open from last time it will parse it and parsing the entire source can take 3-10 minutes (depending on your computer). Go drink some coffee and get back to it when it's done =) '''You can disable the source analysis, to make the startup way faster''', be right-clicking the project icon and disabling the checkbox in "Code Assitance -> C\C++ Code Assitance". You will have no C/C++ Code assitance, but the IDE will load much faster without the need to wait. +* If you want to update GIMP's source (from git), first of all close Netbeans. Now run again the ./autogen.sh script to regenerate the makefiles and only then launch Netbeans again. +* You can not debug plugins with the IDE since plugins are external programs started by GIMP, and not a part of GIMP itself. See the plugin debugging information in [http://git.gnome.org/browse/gimp/tree/devel-docs/debug-plug-ins.txt devel-docs/debug-plug-ins.txt] diff --git a/wiki/Hacking:Netbeans-20161024010114-show.txt b/wiki/Hacking:Netbeans-20161024010114-show.txt new file mode 100644 index 0000000..7f46da9 --- /dev/null +++ b/wiki/Hacking:Netbeans-20161024010114-show.txt @@ -0,0 +1,57 @@ + + +This page will teach you how to set [http://netbeans.org/ Netbeans IDE] to work on the latest source of GIMP from git. In order to work with Netbeans on GIMP, you will have to install the C plugin for Netbeans (or simply download Netbeans with C support). See [http://netbeans.org/community/releases/68/cpp-setup-instructions.html Configuring the NetBeans IDE for C/C++/Fortran]. + + +__TOC__ + +===Why use Netbeans to work on GIMP?=== + +* Because it has an extremely good autocompletion, that will be configured automatically for you! +* Because it's an IDE and not just a text editor (meaning it manages many files at once, it has syntax highlighting, it can manage tasks, ...) +* Because it's very easy to use (it's not Emacs :P) + +===Why not to use Netbeans to work on GIMP?=== + +* Because it's not Emacs :P + +==Preparing the build environment== + +In order for Netbeans to be able to configure all the dependencies of GIMP automatically, you will have to have a working environment in which you can compile GIMP. Netbeans will pull all the needed configurations from your Makefile, so we need to be able to reach the stage of generating GIMP's Makefiles. + +Building GIMP itself is a subject for a different page - see [[Build:Basic]] +After you have the version of GIMP which you want to work on, run the ./configure script to generate all the makefiles (or run ./autogen.sh if you are building GIMP from git). Build GIMP and test that it works without any errors - if there any errors (especially in the Makefile) it will annoy Netbeans... + + +==Configuring Netbeans to work on GIMP== + +This was tested with Netbeans 6.8 on GIMP 2.7.1 from git. For any errors/problems please report to LightningIsMyName at irc://irc.gimp.org/#gimp. + + +# Open Netbeans. +# Create a new project. +# In the "Choose Project" screen, choose "C/C++" -> "C/C++ project with existing sources", and click Next. +# In the "Select Mode" screen: + +* For the folder, choose the root folder of GIMP's source. +* For the configuration mode, choose "Custom". +* Click Next. +# In the "Build Tool" screen, choose "Using an Existing makefile" and make sure that the selected file is called "Makefile" and it's directly under GIMP's source root dir. Click Next. +# In the build action screen, you can either leave it as is or pass other parameters. For example, I like to add "-j3" to the "Build Command" so that build will use two cores (since I'm on a Dual-Core PC). Click Next. +# In the "Source Files" screen, simply click Next. +# In the "Code Assistance Configuration", make sure "Automatic Configuration" is selected and click Next +# In the "Project Name and Location" screen, give a name for your project and choose a directory for it's configuration files (do NOT select GIMP's source directory!). Click Finish + +Netbeans will now scan and parse GIMP's source. You may encounter the following problems during this scan: + + +* You will get a dialog asking questions about associating certain file types (usually about xbm) with Netbeans. Say No. +* After parsing will reach 100% it will get stuck - the UI will still be partially responsive, but it will remain on 100%. When this happens, close Netbeans and launch it again +* After opening the project for the first time, netbeans will just get stuck without any obvious reason. Close it (if needed, do it brutally) and launch it again. + +Final Notes: + + +* Every time you'll launch Netbeans, if the GIMP project is still open from last time it will parse it and parsing the entire source can take 3-10 minutes (depending on your computer). Go drink some coffee and get back to it when it's done =) '''You can disable the source analysis, to make the startup way faster''', be right-clicking the project icon and disabling the checkbox in "Code Assitance -> C\C++ Code Assitance". You will have no C/C++ Code assitance, but the IDE will load much faster without the need to wait. +* If you want to update GIMP's source (from git), first of all close Netbeans. Now run again the ./autogen.sh script to regenerate the makefiles and only then launch Netbeans again. +* You can not debug plugins with the IDE since plugins are external programs started by GIMP, and not a part of GIMP itself. See the plugin debugging information in [http://git.gnome.org/browse/gimp/tree/devel-docs/debug-plug-ins.txt devel-docs/debug-plug-ins.txt] diff --git a/wiki/Hacking:Patches-20161024001850-edit.txt b/wiki/Hacking:Patches-20161024001850-edit.txt new file mode 100644 index 0000000..af9a243 --- /dev/null +++ b/wiki/Hacking:Patches-20161024001850-edit.txt @@ -0,0 +1,60 @@ +This page describes how to create patches for GIMP. The instructions in this page also apply for GEGL and BABL. The content of this page is based on a mail sent to the gimp-developer mailing list from Eric Daoust (the original email can be found [http://www.mail-archive.com/gimp-developer@lists.xcf.berkeley.edu/msg18087.html here]) + +'''Note:''' this is not a git tutorial, and it's barely a crash course. For a decent git tutorial, try reading [http://www-cs-students.stanford.edu/%7Eblynn/gitmagic/ git magic]. + +=== Required Tools === + +In order to work with GIMP's source (or GEGL, BABL), you will need [http://en.wikipedia.org/wiki/Git_%28software%29 Git], a version control system which is used for managing GIMP's source. The offical homepage of the git project can be found [http://git-scm.com/ here]. + +=== Checkout the source === +To checkout the source of GEGL/GIMP/BABL open the command line and type + + git clone git://git.gnome.org/'''gimp''' ''destination-folder-name'' + +* If you want to checkout GEGL, replace '''gimp''' with gegl +* If you want to checkout BABL, replace '''gimp''' with babl +* Replace ''destination-folder-name'' with the name of the folder you wish to create to store the source. + +=== Modifying the source === +Create a local branch for your modifications: + + git checkout -b '''branch-name''' ''origin/master'' + +* Replace '''branch-name''' with the desired name for your branch. +* If you want to base your branch on a different branch than the master branch, replace ''origin/master'' with the name of the desired parent branch. + +This branch will now contain your source. Do changes while on this branch, commit often (this will NOT affect other people's repository). + +To see the status of your branch (which files were changed/added/removed) do: + + git status + +In order to have a graphical user interface to browse the current state of the branch, and to see the exact changes you made to specific files, do: + + gitk + +In order to commit your changes (i.e. save the current state of the source) do: + + git commit -a -m "Message" + +* Replace "Message" with your own message, describing the current commit. + +Note that if you have a long commit message (longer than 80 characters), then you should brake it into a summary line (of up to 80 characters) and description lines (directly after the summary) which describe the commit with more details (again, each of the lines should not be more than 80 characters long). + +=== Finalizing your changes === +When finished (and committed code one final time) do: + + git pull --rebase + +Fix any merge errors, re-execute your test code, and commit again if necessary (after finishing this, execute git pull --rebase again). + +=== Creating a patch === +To create the patch do: + + git format-patch ''origin/master''..'''branch-name''' -o ''output-folder'' + +* Replace '''branch-name''' with the name of your branch (if you forgot the name of your branch, type git branch to see which branch you are working on). +* If you want to create the patch against a branch different than the master branch, replace ''origin/master'' with the name of the desired branch to create the patch against. Usually, you will only create a patch against a branch different than the master if your original branch was created against a different branch. +* Replace ''output-folder'' with the folder where you want the patch files to be created. For each one of your commits, a patch file will be created in that directory (the patch files will be numbered by the order of the commits). + +Now, when someone asks you to submit a patch, send him the files that were created in the output-folder you specified. diff --git a/wiki/Hacking:Patches-20180812150605-show.txt b/wiki/Hacking:Patches-20180812150605-show.txt new file mode 100644 index 0000000..053b814 --- /dev/null +++ b/wiki/Hacking:Patches-20180812150605-show.txt @@ -0,0 +1,81 @@ + + +This page describes how to create patches for GIMP. The instructions in this page also apply for GEGL and BABL. The content of this page is based on a mail sent to the gimp-developer mailing list from Eric Daoust (the original email can be found [http://www.mail-archive.com/gimp-developer@lists.xcf.berkeley.edu/msg18087.html here]) + +'''Note:''' this is not a git tutorial, and it's barely a crash course. For a decent git tutorial, try reading [http://www-cs-students.stanford.edu/%7Eblynn/gitmagic/ git magic]. + + +__TOC__ + +===Required Tools=== + +In order to work with GIMP's source (or GEGL, BABL), you will need [http://en.wikipedia.org/wiki/Git_%28software%29 Git], a version control system which is used for managing GIMP's source. The offical homepage of the git project can be found [http://git-scm.com/ here]. + + +===Checkout the source=== + +To checkout the source of GEGL/GIMP/BABL open the command line and type + +
    git clone git://git.gnome.org/'''gimp''' ''destination-folder-name''
    +
    + +* If you want to checkout GEGL, replace '''gimp''' with gegl +* If you want to checkout BABL, replace '''gimp''' with babl +* Replace ''destination-folder-name'' with the name of the folder you wish to create to store the source. + +===Modifying the source=== + +Create a local branch for your modifications: + +
    git checkout -b '''branch-name''' ''origin/master''
    +
    + +* Replace '''branch-name''' with the desired name for your branch. +* If you want to base your branch on a different branch than the master branch, replace ''origin/master'' with the name of the desired parent branch. + +This branch will now contain your source. Do changes while on this branch, commit often (this will NOT affect other people's repository). + +To see the status of your branch (which files were changed/added/removed) do: + +
    git status
    +
    + +In order to have a graphical user interface to browse the current state of the branch, and to see the exact changes you made to specific files, do: + +
    gitk
    +
    + +In order to commit your changes (i.e. save the current state of the source) do: + +
    git commit -a -m "Message"
    +
    + +* Replace "Message" with your own message, describing the current commit. + +Note that if you have a long commit message (longer than 80 characters), then you should brake it into a summary line (of up to 80 characters) and description lines (directly after the summary) which describe the commit with more details (again, each of the lines should not be more than 80 characters long). + + +===Finalizing your changes=== + +When finished (and committed code one final time) do: + +
    git pull --rebase
    +
    + +Fix any merge errors, re-execute your test code, and commit again if necessary (after finishing this, execute git pull --rebase again). + + +===Creating a patch=== + +To create the patch do: + +
    git format-patch ''origin/master''..'''branch-name''' -o ''output-folder''
    +
    + +* Replace '''branch-name''' with the name of your branch (if you forgot the name of your branch, type git branch to see which branch you are working on). +* If you want to create the patch against a branch different than the master branch, replace ''origin/master'' with the name of the desired branch to create the patch against. Usually, you will only create a patch against a branch different than the master if your original branch was created against a different branch. +* Replace ''output-folder'' with the folder where you want the patch files to be created. For each one of your commits, a patch file will be created in that directory (the patch files will be numbered by the order of the commits). + +Now, when someone asks you to submit a patch, send him the files that were created in the output-folder you specified. + + \ No newline at end of file diff --git a/wiki/Hacking:Plugin_registry-20161024013437-edit.txt b/wiki/Hacking:Plugin_registry-20161024013437-edit.txt new file mode 100644 index 0000000..8563a77 --- /dev/null +++ b/wiki/Hacking:Plugin_registry-20161024013437-edit.txt @@ -0,0 +1,126 @@ +This site is about the future of the plug-in registry. + +=Mindstorm= +The place for brainstorm ideas etc. + +Here are some screenshots of the Gimp-Perl registry viewer (as of release 2.30_05 - [http://search.cpan.org/~etj/Gimp-2.30_05/]): + +Showing a script's information: + +[[File:Gp-regviewer-script-info.png]] + +Showing the text of the script: + +[[File:Gp-regviewer-script-text.png]] + +Current features: + +* lists script-fu entries in the registry that say they work with GIMP 2.8 (and 2.7) +* allows user to select an entry +* shows information about the entry +* shows the ".scm" files, allowing the user to view these and/or to install them +* when installed, immediately refreshes the script-fu scripts so the new script will be immediately visible + +It currently achieves this by web-scraping the registry website. It would be better if the search API were accessible over something like SOAP. + +Features of the website/resource that would be nice: + +* SOAP access to search +* better search +* advanced search that works: currently, if enter "script-fu 2.8" in "Containing any of the words" and click "Advanced search", gives a 404 +* facility to automatically tell what menu entry(-ies) are installed by plugin to facilitate immediate "having a go" +* facility to spot updates to given plugins +* ability to show images in plugin description + +Features on the GIMP side that would be nice: + +* tracking plugin versions to enable spotting updates +* ability to rate plugins +* ability to remove plugins +* ability to refresh plugins (as opposed to only Script-Fu scripts) + +---- + + +The mailing list thread: +https://mail.gnome.org/archives/gimp-developer-list/2014-April/msg00015.html + + +---- + +==AppStores== + +[http://www.apple.com/osx/apps/app-store.html Apple App Store] +* Closed source +* Apple only +* Apple account required + + +[http://windows.microsoft.com/en-us/windows-8/apps#Cat=t1 Microsoft Windows Store] +* Windows only +* Microsoft account required + + +[https://play.google.com/store Google Play] +* Closed Source +* Automatic security check of every uploaded app +* Apps run in a Sandbox +* Android only +* Google account required + + +[https://wiki.gnome.org/Design/Apps/Software GNOME Software] +* Open Source +* Uses the Distribuion Package management +* Linux only + + +==Other programs, that download app/plugins== + +[http://blogs.gnome.org/hughsie/2014/06/11/application-addons-in-gnome-software/ Application Addons in GNOME Software] +* Open Source + + +[http://newstuff.kde.org/ KDE Get Hot New Stuff!] +* Open Source +* Looks like it's no longer actively maintained + + +[https://addons.mozilla.org Firefox Addons] +* Open Source +* Platform independent + + +[http://gmic.sourceforge.net/gimp.shtml G’MIC] +* Open Source +* Download new Filters +* Platform independent + + +[http://www.darktable.org/redmine/projects/darktable/wiki/Upcoming_styles_sharing_platform Darktable] +* Open Source +* Download new styles +* Platform independent + + +AppStream standardized sets of additional metadata. +http://www.freedesktop.org/software/appstream/docs/ + +=Status= +Brainstorming + +=Requirements= +==Functional requirements== +Desired Features go here. + +==Nonfunctional requirements== +Such as Performance, Scalability, Security go here. + +=Architecture= +==Interaction architecture== +==Technical architecture== + +=Implementation= + +=See also= +* [[Specs:Resource_installer]] - a resource installer for GIMP diff --git a/wiki/Hacking:Plugin_registry-20161109163337-show.txt b/wiki/Hacking:Plugin_registry-20161109163337-show.txt new file mode 100644 index 0000000..3673562 --- /dev/null +++ b/wiki/Hacking:Plugin_registry-20161109163337-show.txt @@ -0,0 +1,156 @@ + + +This site is about the future of the plug-in registry. + + +__TOC__ + +=Mindstorm= + +The place for brainstorm ideas etc. + +Here are some screenshots of the Gimp-Perl registry viewer (as of release 2.30_05 - [http://search.cpan.org/~etj/Gimp-2.30_05/ [1]]): + +Showing a script's information: + +[[File:Gp-regviewer-script-info.png|Gp-regviewer-script-info.png]] + +Showing the text of the script: + +[[File:Gp-regviewer-script-text.png|Gp-regviewer-script-text.png]] + +Current features: + + +* lists script-fu entries in the registry that say they work with GIMP 2.8 (and 2.7) +* allows user to select an entry +* shows information about the entry +* shows the ".scm" files, allowing the user to view these and/or to install them +* when installed, immediately refreshes the script-fu scripts so the new script will be immediately visible + +It currently achieves this by web-scraping the registry website. It would be better if the search API were accessible over something like SOAP. + +Features of the website/resource that would be nice: + + +* SOAP access to search +* better search +* advanced search that works: currently, if enter "script-fu 2.8" in "Containing any of the words" and click "Advanced search", gives a 404 +* facility to automatically tell what menu entry(-ies) are installed by plugin to facilitate immediate "having a go" +* facility to spot updates to given plugins +* ability to show images in plugin description + +Features on the GIMP side that would be nice: + + +* tracking plugin versions to enable spotting updates +* ability to rate plugins +* ability to remove plugins +* ability to refresh plugins (as opposed to only Script-Fu scripts) +
    + + +The mailing list thread: +[https://mail.gnome.org/archives/gimp-developer-list/2014-April/msg00015.html https://mail.gnome.org/archives/gimp-developer-list/2014-April/msg00015.html] + + +
    + +==AppStores== + +[http://www.apple.com/osx/apps/app-store.html Apple App Store] + +* Closed source +* Apple only +* Apple account required + + +[http://windows.microsoft.com/en-us/windows-8/apps#Cat=t1 Microsoft Windows Store] + +* Windows only +* Microsoft account required + + +[https://play.google.com/store Google Play] + +* Closed Source +* Automatic security check of every uploaded app +* Apps run in a Sandbox +* Android only +* Google account required + + +[https://wiki.gnome.org/Design/Apps/Software GNOME Software] + +* Open Source +* Uses the Distribuion Package management +* Linux only + + + + +==Other programs, that download app/plugins== + +[http://blogs.gnome.org/hughsie/2014/06/11/application-addons-in-gnome-software/ Application Addons in GNOME Software] + +* Open Source + + +[http://newstuff.kde.org/ KDE Get Hot New Stuff!] + +* Open Source +* Looks like it's no longer actively maintained + + +[https://addons.mozilla.org/ Firefox Addons] + +* Open Source +* Platform independent + + +[http://gmic.sourceforge.net/gimp.shtml G’MIC] + +* Open Source +* Download new Filters +* Platform independent + + +[http://www.darktable.org/redmine/projects/darktable/wiki/Upcoming_styles_sharing_platform Darktable] + +* Open Source +* Download new styles +* Platform independent + + +AppStream standardized sets of additional metadata. +[http://www.freedesktop.org/software/appstream/docs/ http://www.freedesktop.org/software/appstream/docs/] + + +=Status= + +Brainstorming + + +=Requirements= + +==Functional requirements== + +Desired Features go here. + + +==Nonfunctional requirements== + +Such as Performance, Scalability, Security go here. + + +=Architecture= + +==Interaction architecture== + +==Technical architecture== + +=Implementation= + +=See also= + +* [[Specs:Resource_installer]] - a resource installer for GIMP diff --git a/wiki/Hacking:Plugin_registry-20180812150613-show.txt b/wiki/Hacking:Plugin_registry-20180812150613-show.txt new file mode 100644 index 0000000..9e26ea3 --- /dev/null +++ b/wiki/Hacking:Plugin_registry-20180812150613-show.txt @@ -0,0 +1,156 @@ + + +This site is about the future of the plug-in registry. + + +__TOC__ + +=Mindstorm= + +The place for brainstorm ideas etc. + +Here are some screenshots of the Gimp-Perl registry viewer (as of release 2.30_05 - [http://search.cpan.org/~etj/Gimp-2.30_05/ [1]]): + +Showing a script's information: + +[[File:Gp-regviewer-script-info.png|Gp-regviewer-script-info.png]] + +Showing the text of the script: + +[[File:Gp-regviewer-script-text.png|Gp-regviewer-script-text.png]] + +Current features: + + +* lists script-fu entries in the registry that say they work with GIMP 2.8 (and 2.7) +* allows user to select an entry +* shows information about the entry +* shows the ".scm" files, allowing the user to view these and/or to install them +* when installed, immediately refreshes the script-fu scripts so the new script will be immediately visible + +It currently achieves this by web-scraping the registry website. It would be better if the search API were accessible over something like SOAP. + +Features of the website/resource that would be nice: + + +* SOAP access to search +* better search +* advanced search that works: currently, if enter "script-fu 2.8" in "Containing any of the words" and click "Advanced search", gives a 404 +* facility to automatically tell what menu entry(-ies) are installed by plugin to facilitate immediate "having a go" +* facility to spot updates to given plugins +* ability to show images in plugin description + +Features on the GIMP side that would be nice: + + +* tracking plugin versions to enable spotting updates +* ability to rate plugins +* ability to remove plugins +* ability to refresh plugins (as opposed to only Script-Fu scripts) +
    + + +The mailing list thread: +[https://mail.gnome.org/archives/gimp-developer-list/2014-April/msg00015.html https://mail.gnome.org/archives/gimp-developer-list/2014-April/msg00015.html] + + +
    + +==AppStores== + +[http://www.apple.com/osx/apps/app-store.html Apple App Store] + +* Closed source +* Apple only +* Apple account required + + +[http://windows.microsoft.com/en-us/windows-8/apps#Cat=t1 Microsoft Windows Store] + +* Windows only +* Microsoft account required + + +[https://play.google.com/store Google Play] + +* Closed Source +* Automatic security check of every uploaded app +* Apps run in a Sandbox +* Android only +* Google account required + + +[https://wiki.gnome.org/Design/Apps/Software GNOME Software] + +* Open Source +* Uses the Distribuion Package management +* Linux only + + + + +==Other programs, that download app/plugins== + +[http://blogs.gnome.org/hughsie/2014/06/11/application-addons-in-gnome-software/ Application Addons in GNOME Software] + +* Open Source + + +[http://newstuff.kde.org/ KDE Get Hot New Stuff!] + +* Open Source +* Looks like it's no longer actively maintained + + +[https://addons.mozilla.org/ Firefox Addons] + +* Open Source +* Platform independent + + +[http://gmic.sourceforge.net/gimp.shtml G’MIC] + +* Open Source +* Download new Filters +* Platform independent + + +[http://www.darktable.org/redmine/projects/darktable/wiki/Upcoming_styles_sharing_platform Darktable] + +* Open Source +* Download new styles +* Platform independent + + +AppStream standardized sets of additional metadata. +[http://www.freedesktop.org/software/appstream/docs/ http://www.freedesktop.org/software/appstream/docs/] + + +=Status= + +Brainstorming + + +=Requirements= + +==Functional requirements== + +Desired Features go here. + + +==Nonfunctional requirements== + +Such as Performance, Scalability, Security go here. + + +=Architecture= + +==Interaction architecture== + +==Technical architecture== + +=Implementation= + +=See also= + +* [[Specs:Resource_installer]] - a resource installer for GIMP diff --git a/wiki/Hacking:Plugin_registry-20201028003355-edit.txt b/wiki/Hacking:Plugin_registry-20201028003355-edit.txt new file mode 100644 index 0000000..8563a77 --- /dev/null +++ b/wiki/Hacking:Plugin_registry-20201028003355-edit.txt @@ -0,0 +1,126 @@ +This site is about the future of the plug-in registry. + +=Mindstorm= +The place for brainstorm ideas etc. + +Here are some screenshots of the Gimp-Perl registry viewer (as of release 2.30_05 - [http://search.cpan.org/~etj/Gimp-2.30_05/]): + +Showing a script's information: + +[[File:Gp-regviewer-script-info.png]] + +Showing the text of the script: + +[[File:Gp-regviewer-script-text.png]] + +Current features: + +* lists script-fu entries in the registry that say they work with GIMP 2.8 (and 2.7) +* allows user to select an entry +* shows information about the entry +* shows the ".scm" files, allowing the user to view these and/or to install them +* when installed, immediately refreshes the script-fu scripts so the new script will be immediately visible + +It currently achieves this by web-scraping the registry website. It would be better if the search API were accessible over something like SOAP. + +Features of the website/resource that would be nice: + +* SOAP access to search +* better search +* advanced search that works: currently, if enter "script-fu 2.8" in "Containing any of the words" and click "Advanced search", gives a 404 +* facility to automatically tell what menu entry(-ies) are installed by plugin to facilitate immediate "having a go" +* facility to spot updates to given plugins +* ability to show images in plugin description + +Features on the GIMP side that would be nice: + +* tracking plugin versions to enable spotting updates +* ability to rate plugins +* ability to remove plugins +* ability to refresh plugins (as opposed to only Script-Fu scripts) + +---- + + +The mailing list thread: +https://mail.gnome.org/archives/gimp-developer-list/2014-April/msg00015.html + + +---- + +==AppStores== + +[http://www.apple.com/osx/apps/app-store.html Apple App Store] +* Closed source +* Apple only +* Apple account required + + +[http://windows.microsoft.com/en-us/windows-8/apps#Cat=t1 Microsoft Windows Store] +* Windows only +* Microsoft account required + + +[https://play.google.com/store Google Play] +* Closed Source +* Automatic security check of every uploaded app +* Apps run in a Sandbox +* Android only +* Google account required + + +[https://wiki.gnome.org/Design/Apps/Software GNOME Software] +* Open Source +* Uses the Distribuion Package management +* Linux only + + +==Other programs, that download app/plugins== + +[http://blogs.gnome.org/hughsie/2014/06/11/application-addons-in-gnome-software/ Application Addons in GNOME Software] +* Open Source + + +[http://newstuff.kde.org/ KDE Get Hot New Stuff!] +* Open Source +* Looks like it's no longer actively maintained + + +[https://addons.mozilla.org Firefox Addons] +* Open Source +* Platform independent + + +[http://gmic.sourceforge.net/gimp.shtml G’MIC] +* Open Source +* Download new Filters +* Platform independent + + +[http://www.darktable.org/redmine/projects/darktable/wiki/Upcoming_styles_sharing_platform Darktable] +* Open Source +* Download new styles +* Platform independent + + +AppStream standardized sets of additional metadata. +http://www.freedesktop.org/software/appstream/docs/ + +=Status= +Brainstorming + +=Requirements= +==Functional requirements== +Desired Features go here. + +==Nonfunctional requirements== +Such as Performance, Scalability, Security go here. + +=Architecture= +==Interaction architecture== +==Technical architecture== + +=Implementation= + +=See also= +* [[Specs:Resource_installer]] - a resource installer for GIMP diff --git a/wiki/Hacking:Plugins-20200923041814-edit.txt b/wiki/Hacking:Plugins-20200923041814-edit.txt new file mode 100644 index 0000000..f546ff1 --- /dev/null +++ b/wiki/Hacking:Plugins-20200923041814-edit.txt @@ -0,0 +1,130 @@ +GIMP supports [http://en.wikipedia.org/wiki/Plug-in_%28computing%29 plug-ins]. + +Some plug-ins are distributed with GIMP and some are distributed by third parties. + +This describes Gimp 2 plugins. For Gimp 3, see [[Hacking:Plugins v3]]. + + +== Getting Started == + +A good way to get started is to read plug-ins distributed with GIMP. + +You can test snippets of Scheme and Python plug-ins on the consoles available in GIMP at the menu items: Filters>Script-Fu>Console and Filters>Python-Fu>Console. A console is a terminal window that lets you enter and execute statements in the programming language. + +The documentation for the PDB is available in GIMP at the menu item: Help>Procedure Browser. + +== Plug-ins and the GIMP Procedural DataBase (PDB) == + +Plug-ins must register themselves in the PDB. Other GIMP functions, called internal procedures, are also in the PDB. An internal procedure often provides a function also found in the GIMP menus. + +Registration means declaring the name and parameters of a plug-in, as well as declaring where a plug-in will appear in the GIMP menus, if at all. + +A plug-in commonly calls other plug-ins in the PDB. + +(Note that the procedures in the PDB are often similar to procedures in the GIMP library, but have different signatures. Do not confuse the two.) + +== Programming Languages for GIMP Plug-ins == + +GIMP plug-ins are written in the C, Scheme, Python, or Perl programming languages. + +C language GIMP plug-ins are compiled and linked with Gimp libraries. They can access functions in those libraries or functions in the PDB. They are distributed as executable files with suffix ".exe". + +Scheme language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as the functions built into the Scheme language. They are distributed as text files called scripts with suffix ".scm". + +Python language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as functions provided by the PyGimp set of Python modules (chiefly, the module named "gimpfu") and functions provided by the Python modules in a standard Python distribution. They are distributed as text files with suffix ".py". + +== Choosing a Language for a GIMP Plug-in == + +Plug-ins are usually usually written in the C language if they implement fundamental algorithms at the pixel level. Such plug-ins might need the speed of a compiled language and full access to the GIMP libraries. However, such plug-ins need to be separately compiled for each platform. + +Plug-ins written in Scheme or Python usually implement less compute intensive algorithms. Often they implement recipes: step-by-step sequences of actions a user could do manually using the GIMP. They are limited to GIMP functions found in the PDB (they can't directly access the Gimp C libraries. For Python plug-ins the gimpfu module wraps many GIMP C library functions.) They are very portable (assuming the separate Python interpreter is installed for Python plug-ins.) + +Plug-ins in C can provide any user interface using, for example, the GTK toolkit. Plug-ins written in Scheme or Python can easily provide a dialog for plug-in settings using a standard set of widgets provided (by the Scheme interpreter and the PyGimp modules) for the parameters of the plug-in. Plug-ins written in Python can provide fuller user interfaces by using, for example the PyGTK toolkit, which is in a standard Python distribution. + +C is an older language, the traditional programming language for systems level programming with full access to the underlying hardware and operating system. It is powerful but unforgiving. + +[http://en.wikipedia.org/wiki/Scheme_%28programming_language%29 Scheme] is a Lisp-like language with a very simple syntax. Some people find it hard to learn and difficult to read. The set of functions distributed with the Scheme interpreter built into Gimp is what the language provides, so you might need to include third party Scheme functions inside your plug-in. + +[http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] is a more recent, interpreted language. It is open source from [http://www.python.org/ Python.org] and supported on most platforms. It supports programming concepts such as object orientation and exceptions. Since it is interpreted, it supports agile programming or rapid prototyping. Most Python programs are written idiomatically, using common phrases. Some people find Python abstractions and idioms difficult to learn. The set of modules in a standard Python distribution provides a rich set of components. + +== Debugging GIMP Plug-ins == + +Generally, debugging Scheme and Python plug-ins is easier. Python provides a trace when a plug-in throws an exception. Python also has a convenient logging module. + +You can use the technique of embedding print statements or logging statements in your plug-in. Start GIMP from a console (a terminal window) to see the output of your debugging statements to stdout or stderr (the standard output streams for a program.) + +You can also debug plug-ins using a run-time debugger, such as the GNU debugger, gdb, or a memory debugger, such as valgrind or purify. Since a plug-in is started from within GIMP and runs as a separate process from GIMP, you generally "attach" a running plug-in to a debugger. Or, for example, instead of you starting the debugger, GIMP starts the debugger when you start a plug-in from within GIMP. See [http://developer.gimp.org/debug-plug-ins.txt] for more information. Generally a debugger is more useful for C-language programs. Using a debugger you might find yourself reading GIMP code instead of your plug-in code. + +== Community of GIMP Plug-in Authors == + +Many authors of GIMP Scheme and Python plug-ins lurk at: + +[http://registry.gimp.org/ Gimp Plugin Registry] + +[http://www.gimptalk.com/ Gimptalk] + +Generally, there are fewer authors of C-language GIMP plug-ins. The community of GIMP developers are mostly C programmers but they don't often write plug-ins. Questions to GIMP developers concerning C-language plug-ins are discouraged for all but difficult questions. Bugs in third-party plug-ins (those not distributed with GIMP) should NOT be reported as GIMP bugs, only reported to the author or maintainers of the third-party plug-ins. + +== References for Programming GIMP Plug-ins == + +[[Hacking:How to write a GIMP plug-in | A tutorial on programming GIMP plug-ins in the C language]]. + +[http://www.gimp.org/docs/scheme_plugin/ A tutorial on programming GIMP plug-ins in the Scheme language.] + +[http://www.gimp.org/docs/python/index.html GIMP Python Documentation.] + +[http://www.ibm.com/developerworks/opensource/library/os-autogimp/index.html#resources A tutorial on programming GIMP plug-ins in Python.] + +[http://developer.gimp.org/api/2.0/index.html The GIMP 2.0 API Reference] This documents the GIMP C library, not the GIMP Procedural Database! The PDB is best examined from within GIMP using Help>Procedure Browser + +A few questions about plug-in development are answered in [http://developer.gimp.org/faq.html#id462307 GIMP Developer Frequently Asked Questions.] + +== Templates for GIMP Plug-ins == + +A template is a canonical, minimal shell of, or a fill-in-the-blanks version, or an empty prototype for, a plug-in. + +A template for a C-language plug-in can be downloaded from [ftp://ftp.gimp.org/pub/gimp/plugin-template/ GIMP's FTP server]. A more current version is in the [https://git.gnome.org/browse/gimp-plugin-template/ GIMP plug-in template project's repository]. The template includes all necessary features of a well-behaved plug-in and includes build files for compiling the template. You don't have to care for [http://www.gnu.org/software/autoconf/ autoconf], [http://www.gnu.org/software/automake/ automake], internationalisation etc. + +There is also a [http://www.home.unix-ag.org/simon/files/script-fu-template.scm template for a Scheme language plug-in]. + +A template for a Python language plug-in is near the start of [http://www.gimp.org/docs/python/index.html the GIMP Python Documentation.] + +A template demonstrating how GIMP Python displays GUI widgets (for each parameter type) in the settings dialog of a Python plug-in is in the [http://registry.gimp.org/node/22349 plug-in registry]. + +== GIMP Plug-in Architecture == + +Plug-ins are invoked by GIMP (whether interactive GIMP or batch-mode GIMP.) Plug-ins run as separate, independent processes from GIMP. That is, they have a separate execution environment. When a plug-in crashes, it does not usually affect the separate GIMP process. The GIMP and plug-in processes communicate using shared memory inter-process communication, but that does not concern most plug-in developers. The inter-process communication is hidden and established automatically by the canonical framework for a plug-in. + +A GIMP user can continue to use GIMP while a plug-in executes. However, usually a user waits and a plug-in returns quickly. + +A plug-in can open dialog windows with the user. The plug-in framework provides an initial "settings" dialog, for the parameters of a plug-in, before a plug-in begins its substantive work. A C-language plug-in should return a result code to GIMP and let GIMP display an error dialog if any. A Scheme or Python language plug-in should call the PDB procedure gimp_message() to display an error dialog. Or a Python plug-in can raise an exception, which results in the GIMP process displaying an error dialog. + +A plug-in that operates on an existing drawable (image, layer, or channel) should finally flush the display to show results to a user. + +A plug-in can also open separate displays (windows, for example on images.) A plug-in creates a display, then flushes it to show or refresh it to a user. + +A plug-in is invoked with a "run mode": +* interactive: shows a settings dialog for the user to modify parameters and can show GUI dialogs and windows to the user +* non-interactive: runs with the passed parameters and should not interact with a user +* run with last values: runs with previously used values for parameters (does not display a settings dialog) but can otherwise interact with the user +It is the responsibility of a well-behaved plug-in to adhere to these rules. For example, a plug-in that is invoked with run mode non-interactive should not attempt to open a display. + +== Installation of GIMP Plug-ins == + +Scheme and Python plug-ins are readable text files. C-language and Python plug-in files must have permissions set to allow execution. + +When GIMP starts, it examines the standard installation directories for plug-ins, and registers the plug-ins it finds. The plug-ins registered in the PDB are not persistent: if you delete a plug-in file, it disappears from the PDB. If you install a plug-in file, it will not appear in the PDB until you restart GIMP (except for Scheme plug-ins, which can be refreshed while GIMP is running using the menu item Filters>Script-Fu>Refresh Scripts.) (Also, as long as you don't change the registration signature of a C-language or Python plug-in, you can modify the plug-in file and rerun it without restarting GIMP.) + +Plug-ins distributed with GIMP are installed in standard subdirectories of the GIMP installation: all users on a multi-user computer can use them. A user can install third-party plug-ins in the same place, although it is not recommended. A user should install third-party plug-ins in a standard subdirectory of the user's home directory, so that on a multi-user computer, each user has their own plug-ins, and so that after a re-installation or update of GIMP, the user's third-party plug-ins in their home directory are not affected. + +You can determine the path to the two standard installation directories (all users, and user local) for plug-ins on any platform by installing GIMP and examining the Folders/Plug-Ins item of the Edit>Preferences dialog. + +Typically, third-party Scheme plug-ins are installed in ~/.gimp-2.x/scripts and C-language and Python language plug-ins are installed in ~/.gimp-2.x/plug-ins directories. Here, ~ means the user's home directory, the "." means the directory is a hidden file, and "x" is the minor version of GIMP, for example "7" for GIMP version 2.7. + +== Internationalization of GIMP Plug-ins == + +GIMP is used around the world. Well-behaved plug-ins should be internationalized (translated into other languages, I18N.) The plug-in templates demonstrate internationalization. + +The GIMP project maintains the translation files for the plug-ins distributed with GIMP. + +For now, there does not seem to be any organization maintaining translation files for most third-party plug-ins. diff --git a/wiki/Hacking:Plugins-20210512211343-edit.txt b/wiki/Hacking:Plugins-20210512211343-edit.txt new file mode 100644 index 0000000..bc83a52 --- /dev/null +++ b/wiki/Hacking:Plugins-20210512211343-edit.txt @@ -0,0 +1,132 @@ +GIMP supports [http://en.wikipedia.org/wiki/Plug-in_%28computing%29 plug-ins]. + +Some plug-ins are distributed with GIMP and some are distributed by third parties. + +This describes Gimp 2 plugins. For Gimp 3, see [[Hacking:Plugins v3]]. + + +== Getting Started == + +A good way to get started is to read plug-ins distributed with GIMP. + +You can test snippets of Scheme and Python plug-ins on the consoles available in GIMP at the menu items: Filters>Script-Fu>Console and Filters>Python-Fu>Console. A console is a terminal window that lets you enter and execute statements in the programming language. + +The documentation for the PDB is available in GIMP at the menu item: Help>Procedure Browser. + +== Plug-ins and the GIMP Procedural DataBase (PDB) == + +Plug-ins must register themselves in the PDB. Other GIMP functions, called internal procedures, are also in the PDB. An internal procedure often provides a function also found in the GIMP menus. + +Registration means declaring the name and parameters of a plug-in, as well as declaring where a plug-in will appear in the GIMP menus, if at all. + +A plug-in commonly calls other plug-ins in the PDB. + +(Note that the procedures in the PDB are often similar to procedures in the GIMP library, but have different signatures. Do not confuse the two.) + +== Programming Languages for GIMP Plug-ins == + +GIMP plug-ins are written in the C, Scheme, Python, or Perl programming languages. + +C language GIMP plug-ins are compiled and linked with Gimp libraries. They can access functions in those libraries or functions in the PDB. They are distributed as executable files with suffix ".exe". + +Scheme language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as the functions built into the Scheme language. They are distributed as text files called scripts with suffix ".scm". + +Python language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as functions provided by the PyGimp set of Python modules (chiefly, the module named "gimpfu") and functions provided by the Python modules in a standard Python distribution. They are distributed as text files with suffix ".py". + +== Choosing a Language for a GIMP Plug-in == + +Plug-ins are usually usually written in the C language if they implement fundamental algorithms at the pixel level. Such plug-ins might need the speed of a compiled language and full access to the GIMP libraries. However, such plug-ins need to be separately compiled for each platform. + +Plug-ins written in Scheme or Python usually implement less compute intensive algorithms. Often they implement recipes: step-by-step sequences of actions a user could do manually using the GIMP. They are limited to GIMP functions found in the PDB (they can't directly access the Gimp C libraries. For Python plug-ins the gimpfu module wraps many GIMP C library functions.) They are very portable (assuming the separate Python interpreter is installed for Python plug-ins.) + +Plug-ins in C can provide any user interface using, for example, the GTK toolkit. Plug-ins written in Scheme or Python can easily provide a dialog for plug-in settings using a standard set of widgets provided (by the Scheme interpreter and the PyGimp modules) for the parameters of the plug-in. Plug-ins written in Python can provide fuller user interfaces by using, for example the PyGTK toolkit, which is in a standard Python distribution. + +C is an older language, the traditional programming language for systems level programming with full access to the underlying hardware and operating system. It is powerful but unforgiving. + +[http://en.wikipedia.org/wiki/Scheme_%28programming_language%29 Scheme] is a Lisp-like language with a very simple syntax. Some people find it hard to learn and difficult to read. The set of functions distributed with the Scheme interpreter built into Gimp is what the language provides, so you might need to include third party Scheme functions inside your plug-in. + +[http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] is a more recent, interpreted language. It is open source from [http://www.python.org/ Python.org] and supported on most platforms. It supports programming concepts such as object orientation and exceptions. Since it is interpreted, it supports agile programming or rapid prototyping. Most Python programs are written idiomatically, using common phrases. Some people find Python abstractions and idioms difficult to learn. The set of modules in a standard Python distribution provides a rich set of components. + +== Debugging GIMP Plug-ins == + +Generally, debugging Scheme and Python plug-ins is easier. Python provides a trace when a plug-in throws an exception. Python also has a convenient logging module. + +You can use the technique of embedding print statements or logging statements in your plug-in. Start GIMP from a console (a terminal window) to see the output of your debugging statements to stdout or stderr (the standard output streams for a program.) + +You can also debug plug-ins using a run-time debugger, such as the GNU debugger, gdb, or a memory debugger, such as valgrind or purify. Since a plug-in is started from within GIMP and runs as a separate process from GIMP, you generally "attach" a running plug-in to a debugger. Or, for example, instead of you starting the debugger, GIMP starts the debugger when you start a plug-in from within GIMP. See [http://developer.gimp.org/debug-plug-ins.txt] for more information. Generally a debugger is more useful for C-language programs. Using a debugger you might find yourself reading GIMP code instead of your plug-in code. + +== Community of GIMP Plug-in Authors == + +Many authors of GIMP Scheme and Python plug-ins lurk at: + +[http://registry.gimp.org/ Gimp Plugin Registry] + +[http://www.gimptalk.com/ Gimptalk] + +Generally, there are fewer authors of C-language GIMP plug-ins. The community of GIMP developers are mostly C programmers but they don't often write plug-ins. Questions to GIMP developers concerning C-language plug-ins are discouraged for all but difficult questions. Bugs in third-party plug-ins (those not distributed with GIMP) should NOT be reported as GIMP bugs, only reported to the author or maintainers of the third-party plug-ins. + +== References for Programming GIMP Plug-ins == + +[[Hacking:How to write a GIMP plug-in | A tutorial on programming GIMP plug-ins in the C language]]. + +[[Hacking:ScriptFu | ScriptFu: programming GIMP plug-ins in the Scheme language]] + +[http://www.gimp.org/docs/scheme_plugin/ A tutorial on programming GIMP plug-ins in the Scheme language.] + +[http://www.gimp.org/docs/python/index.html GIMP Python Documentation.] + +[http://www.ibm.com/developerworks/opensource/library/os-autogimp/index.html#resources A tutorial on programming GIMP plug-ins in Python.] + +[http://developer.gimp.org/api/2.0/index.html The GIMP 2.0 API Reference] This documents the GIMP C library, not the GIMP Procedural Database! The PDB is best examined from within GIMP using Help>Procedure Browser + +A few questions about plug-in development are answered in [http://developer.gimp.org/faq.html#id462307 GIMP Developer Frequently Asked Questions.] + +== Templates for GIMP Plug-ins == + +A template is a canonical, minimal shell of, or a fill-in-the-blanks version, or an empty prototype for, a plug-in. + +A template for a C-language plug-in can be downloaded from [ftp://ftp.gimp.org/pub/gimp/plugin-template/ GIMP's FTP server]. A more current version is in the [https://git.gnome.org/browse/gimp-plugin-template/ GIMP plug-in template project's repository]. The template includes all necessary features of a well-behaved plug-in and includes build files for compiling the template. You don't have to care for [http://www.gnu.org/software/autoconf/ autoconf], [http://www.gnu.org/software/automake/ automake], internationalisation etc. + +There is also a [http://www.home.unix-ag.org/simon/files/script-fu-template.scm template for a Scheme language plug-in]. + +A template for a Python language plug-in is near the start of [http://www.gimp.org/docs/python/index.html the GIMP Python Documentation.] + +A template demonstrating how GIMP Python displays GUI widgets (for each parameter type) in the settings dialog of a Python plug-in is in the [http://registry.gimp.org/node/22349 plug-in registry]. + +== GIMP Plug-in Architecture == + +Plug-ins are invoked by GIMP (whether interactive GIMP or batch-mode GIMP.) Plug-ins run as separate, independent processes from GIMP. That is, they have a separate execution environment. When a plug-in crashes, it does not usually affect the separate GIMP process. The GIMP and plug-in processes communicate using shared memory inter-process communication, but that does not concern most plug-in developers. The inter-process communication is hidden and established automatically by the canonical framework for a plug-in. + +A GIMP user can continue to use GIMP while a plug-in executes. However, usually a user waits and a plug-in returns quickly. + +A plug-in can open dialog windows with the user. The plug-in framework provides an initial "settings" dialog, for the parameters of a plug-in, before a plug-in begins its substantive work. A C-language plug-in should return a result code to GIMP and let GIMP display an error dialog if any. A Scheme or Python language plug-in should call the PDB procedure gimp_message() to display an error dialog. Or a Python plug-in can raise an exception, which results in the GIMP process displaying an error dialog. + +A plug-in that operates on an existing drawable (image, layer, or channel) should finally flush the display to show results to a user. + +A plug-in can also open separate displays (windows, for example on images.) A plug-in creates a display, then flushes it to show or refresh it to a user. + +A plug-in is invoked with a "run mode": +* interactive: shows a settings dialog for the user to modify parameters and can show GUI dialogs and windows to the user +* non-interactive: runs with the passed parameters and should not interact with a user +* run with last values: runs with previously used values for parameters (does not display a settings dialog) but can otherwise interact with the user +It is the responsibility of a well-behaved plug-in to adhere to these rules. For example, a plug-in that is invoked with run mode non-interactive should not attempt to open a display. + +== Installation of GIMP Plug-ins == + +Scheme and Python plug-ins are readable text files. C-language and Python plug-in files must have permissions set to allow execution. + +When GIMP starts, it examines the standard installation directories for plug-ins, and registers the plug-ins it finds. The plug-ins registered in the PDB are not persistent: if you delete a plug-in file, it disappears from the PDB. If you install a plug-in file, it will not appear in the PDB until you restart GIMP (except for Scheme plug-ins, which can be refreshed while GIMP is running using the menu item Filters>Script-Fu>Refresh Scripts.) (Also, as long as you don't change the registration signature of a C-language or Python plug-in, you can modify the plug-in file and rerun it without restarting GIMP.) + +Plug-ins distributed with GIMP are installed in standard subdirectories of the GIMP installation: all users on a multi-user computer can use them. A user can install third-party plug-ins in the same place, although it is not recommended. A user should install third-party plug-ins in a standard subdirectory of the user's home directory, so that on a multi-user computer, each user has their own plug-ins, and so that after a re-installation or update of GIMP, the user's third-party plug-ins in their home directory are not affected. + +You can determine the path to the two standard installation directories (all users, and user local) for plug-ins on any platform by installing GIMP and examining the Folders/Plug-Ins item of the Edit>Preferences dialog. + +Typically, third-party Scheme plug-ins are installed in ~/.gimp-2.x/scripts and C-language and Python language plug-ins are installed in ~/.gimp-2.x/plug-ins directories. Here, ~ means the user's home directory, the "." means the directory is a hidden file, and "x" is the minor version of GIMP, for example "7" for GIMP version 2.7. + +== Internationalization of GIMP Plug-ins == + +GIMP is used around the world. Well-behaved plug-ins should be internationalized (translated into other languages, I18N.) The plug-in templates demonstrate internationalization. + +The GIMP project maintains the translation files for the plug-ins distributed with GIMP. + +For now, there does not seem to be any organization maintaining translation files for most third-party plug-ins. diff --git a/wiki/Hacking:Plugins-20210617154825-show.txt b/wiki/Hacking:Plugins-20210617154825-show.txt new file mode 100644 index 0000000..f456008 --- /dev/null +++ b/wiki/Hacking:Plugins-20210617154825-show.txt @@ -0,0 +1,149 @@ + + +GIMP supports [http://en.wikipedia.org/wiki/Plug-in_%28computing%29 plug-ins]. + +Some plug-ins are distributed with GIMP and some are distributed by third parties. + +This describes Gimp 2 plugins. For Gimp 3, see [[Hacking:Plugins v3]]. + + + + + +__TOC__ + +==Getting Started== + +A good way to get started is to read plug-ins distributed with GIMP. + +You can test snippets of Scheme and Python plug-ins on the consoles available in GIMP at the menu items: Filters>Script-Fu>Console and Filters>Python-Fu>Console. A console is a terminal window that lets you enter and execute statements in the programming language. + +The documentation for the PDB is available in GIMP at the menu item: Help>Procedure Browser. + + +==Plug-ins and the GIMP Procedural DataBase (PDB)== + +Plug-ins must register themselves in the PDB. Other GIMP functions, called internal procedures, are also in the PDB. An internal procedure often provides a function also found in the GIMP menus. + +Registration means declaring the name and parameters of a plug-in, as well as declaring where a plug-in will appear in the GIMP menus, if at all. + +A plug-in commonly calls other plug-ins in the PDB. + +(Note that the procedures in the PDB are often similar to procedures in the GIMP library, but have different signatures. Do not confuse the two.) + + +==Programming Languages for GIMP Plug-ins== + +GIMP plug-ins are written in the C, Scheme, Python, or Perl programming languages. + +C language GIMP plug-ins are compiled and linked with Gimp libraries. They can access functions in those libraries or functions in the PDB. They are distributed as executable files with suffix ".exe". + +Scheme language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as the functions built into the Scheme language. They are distributed as text files called scripts with suffix ".scm". + +Python language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as functions provided by the PyGimp set of Python modules (chiefly, the module named "gimpfu") and functions provided by the Python modules in a standard Python distribution. They are distributed as text files with suffix ".py". + + +==Choosing a Language for a GIMP Plug-in== + +Plug-ins are usually usually written in the C language if they implement fundamental algorithms at the pixel level. Such plug-ins might need the speed of a compiled language and full access to the GIMP libraries. However, such plug-ins need to be separately compiled for each platform. + +Plug-ins written in Scheme or Python usually implement less compute intensive algorithms. Often they implement recipes: step-by-step sequences of actions a user could do manually using the GIMP. They are limited to GIMP functions found in the PDB (they can't directly access the Gimp C libraries. For Python plug-ins the gimpfu module wraps many GIMP C library functions.) They are very portable (assuming the separate Python interpreter is installed for Python plug-ins.) + +Plug-ins in C can provide any user interface using, for example, the GTK toolkit. Plug-ins written in Scheme or Python can easily provide a dialog for plug-in settings using a standard set of widgets provided (by the Scheme interpreter and the PyGimp modules) for the parameters of the plug-in. Plug-ins written in Python can provide fuller user interfaces by using, for example the PyGTK toolkit, which is in a standard Python distribution. + +C is an older language, the traditional programming language for systems level programming with full access to the underlying hardware and operating system. It is powerful but unforgiving. + +[http://en.wikipedia.org/wiki/Scheme_%28programming_language%29 Scheme] is a Lisp-like language with a very simple syntax. Some people find it hard to learn and difficult to read. The set of functions distributed with the Scheme interpreter built into Gimp is what the language provides, so you might need to include third party Scheme functions inside your plug-in. + +[http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] is a more recent, interpreted language. It is open source from [http://www.python.org/ Python.org] and supported on most platforms. It supports programming concepts such as object orientation and exceptions. Since it is interpreted, it supports agile programming or rapid prototyping. Most Python programs are written idiomatically, using common phrases. Some people find Python abstractions and idioms difficult to learn. The set of modules in a standard Python distribution provides a rich set of components. + + +==Debugging GIMP Plug-ins== + +Generally, debugging Scheme and Python plug-ins is easier. Python provides a trace when a plug-in throws an exception. Python also has a convenient logging module. + +You can use the technique of embedding print statements or logging statements in your plug-in. Start GIMP from a console (a terminal window) to see the output of your debugging statements to stdout or stderr (the standard output streams for a program.) + +You can also debug plug-ins using a run-time debugger, such as the GNU debugger, gdb, or a memory debugger, such as valgrind or purify. Since a plug-in is started from within GIMP and runs as a separate process from GIMP, you generally "attach" a running plug-in to a debugger. Or, for example, instead of you starting the debugger, GIMP starts the debugger when you start a plug-in from within GIMP. See [http://developer.gimp.org/debug-plug-ins.txt [1]] for more information. Generally a debugger is more useful for C-language programs. Using a debugger you might find yourself reading GIMP code instead of your plug-in code. + + +==Community of GIMP Plug-in Authors== + +Many authors of GIMP Scheme and Python plug-ins lurk at: + +[http://registry.gimp.org/ Gimp Plugin Registry] +[http://www.gimptalk.com/ Gimptalk] + +Generally, there are fewer authors of C-language GIMP plug-ins. The community of GIMP developers are mostly C programmers but they don't often write plug-ins. Questions to GIMP developers concerning C-language plug-ins are discouraged for all but difficult questions. Bugs in third-party plug-ins (those not distributed with GIMP) should NOT be reported as GIMP bugs, only reported to the author or maintainers of the third-party plug-ins. + + +==References for Programming GIMP Plug-ins== + +[[Hacking:How_to_write_a_GIMP_plug-in| A tutorial on programming GIMP plug-ins in the C language]]. + +[[Hacking:ScriptFu| ScriptFu: programming GIMP plug-ins in the Scheme language]] +[http://www.gimp.org/docs/scheme_plugin/ A tutorial on programming GIMP plug-ins in the Scheme language.] +[http://www.gimp.org/docs/python/index.html GIMP Python Documentation.] +[http://www.ibm.com/developerworks/opensource/library/os-autogimp/index.html#resources A tutorial on programming GIMP plug-ins in Python.] +[http://developer.gimp.org/api/2.0/index.html The GIMP 2.0 API Reference] This documents the GIMP C library, not the GIMP Procedural Database! The PDB is best examined from within GIMP using Help>Procedure Browser + +A few questions about plug-in development are answered in [http://developer.gimp.org/faq.html#id462307 GIMP Developer Frequently Asked Questions.] + + +==Templates for GIMP Plug-ins== + +A template is a canonical, minimal shell of, or a fill-in-the-blanks version, or an empty prototype for, a plug-in. + +A template for a C-language plug-in can be downloaded from GIMP's FTP server. A more current version is in the [https://git.gnome.org/browse/gimp-plugin-template/ GIMP plug-in template project's repository]. The template includes all necessary features of a well-behaved plug-in and includes build files for compiling the template. You don't have to care for [http://www.gnu.org/software/autoconf/ autoconf], [http://www.gnu.org/software/automake/ automake], internationalisation etc. + +There is also a [http://www.home.unix-ag.org/simon/files/script-fu-template.scm template for a Scheme language plug-in]. + +A template for a Python language plug-in is near the start of [http://www.gimp.org/docs/python/index.html the GIMP Python Documentation.] + +A template demonstrating how GIMP Python displays GUI widgets (for each parameter type) in the settings dialog of a Python plug-in is in the [http://registry.gimp.org/node/22349 plug-in registry]. + + +==GIMP Plug-in Architecture== + +Plug-ins are invoked by GIMP (whether interactive GIMP or batch-mode GIMP.) Plug-ins run as separate, independent processes from GIMP. That is, they have a separate execution environment. When a plug-in crashes, it does not usually affect the separate GIMP process. The GIMP and plug-in processes communicate using shared memory inter-process communication, but that does not concern most plug-in developers. The inter-process communication is hidden and established automatically by the canonical framework for a plug-in. + +A GIMP user can continue to use GIMP while a plug-in executes. However, usually a user waits and a plug-in returns quickly. + +A plug-in can open dialog windows with the user. The plug-in framework provides an initial "settings" dialog, for the parameters of a plug-in, before a plug-in begins its substantive work. A C-language plug-in should return a result code to GIMP and let GIMP display an error dialog if any. A Scheme or Python language plug-in should call the PDB procedure gimp_message() to display an error dialog. Or a Python plug-in can raise an exception, which results in the GIMP process displaying an error dialog. + +A plug-in that operates on an existing drawable (image, layer, or channel) should finally flush the display to show results to a user. + +A plug-in can also open separate displays (windows, for example on images.) A plug-in creates a display, then flushes it to show or refresh it to a user. + +A plug-in is invoked with a "run mode": + + +* interactive: shows a settings dialog for the user to modify parameters and can show GUI dialogs and windows to the user +* non-interactive: runs with the passed parameters and should not interact with a user +* run with last values: runs with previously used values for parameters (does not display a settings dialog) but can otherwise interact with the user + +It is the responsibility of a well-behaved plug-in to adhere to these rules. For example, a plug-in that is invoked with run mode non-interactive should not attempt to open a display. + + +==Installation of GIMP Plug-ins== + +Scheme and Python plug-ins are readable text files. C-language and Python plug-in files must have permissions set to allow execution. + +When GIMP starts, it examines the standard installation directories for plug-ins, and registers the plug-ins it finds. The plug-ins registered in the PDB are not persistent: if you delete a plug-in file, it disappears from the PDB. If you install a plug-in file, it will not appear in the PDB until you restart GIMP (except for Scheme plug-ins, which can be refreshed while GIMP is running using the menu item Filters>Script-Fu>Refresh Scripts.) (Also, as long as you don't change the registration signature of a C-language or Python plug-in, you can modify the plug-in file and rerun it without restarting GIMP.) + +Plug-ins distributed with GIMP are installed in standard subdirectories of the GIMP installation: all users on a multi-user computer can use them. A user can install third-party plug-ins in the same place, although it is not recommended. A user should install third-party plug-ins in a standard subdirectory of the user's home directory, so that on a multi-user computer, each user has their own plug-ins, and so that after a re-installation or update of GIMP, the user's third-party plug-ins in their home directory are not affected. + +You can determine the path to the two standard installation directories (all users, and user local) for plug-ins on any platform by installing GIMP and examining the Folders/Plug-Ins item of the Edit>Preferences dialog. + +Typically, third-party Scheme plug-ins are installed in ~/.gimp-2.x/scripts and C-language and Python language plug-ins are installed in ~/.gimp-2.x/plug-ins directories. Here, ~ means the user's home directory, the "." means the directory is a hidden file, and "x" is the minor version of GIMP, for example "7" for GIMP version 2.7. + + +==Internationalization of GIMP Plug-ins== + +GIMP is used around the world. Well-behaved plug-ins should be internationalized (translated into other languages, I18N.) The plug-in templates demonstrate internationalization. + +The GIMP project maintains the translation files for the plug-ins distributed with GIMP. + +For now, there does not seem to be any organization maintaining translation files for most third-party plug-ins. + + \ No newline at end of file diff --git a/wiki/Hacking:Plugins-20210701161100-show.txt b/wiki/Hacking:Plugins-20210701161100-show.txt new file mode 100644 index 0000000..f456008 --- /dev/null +++ b/wiki/Hacking:Plugins-20210701161100-show.txt @@ -0,0 +1,149 @@ + + +GIMP supports [http://en.wikipedia.org/wiki/Plug-in_%28computing%29 plug-ins]. + +Some plug-ins are distributed with GIMP and some are distributed by third parties. + +This describes Gimp 2 plugins. For Gimp 3, see [[Hacking:Plugins v3]]. + + + + + +__TOC__ + +==Getting Started== + +A good way to get started is to read plug-ins distributed with GIMP. + +You can test snippets of Scheme and Python plug-ins on the consoles available in GIMP at the menu items: Filters>Script-Fu>Console and Filters>Python-Fu>Console. A console is a terminal window that lets you enter and execute statements in the programming language. + +The documentation for the PDB is available in GIMP at the menu item: Help>Procedure Browser. + + +==Plug-ins and the GIMP Procedural DataBase (PDB)== + +Plug-ins must register themselves in the PDB. Other GIMP functions, called internal procedures, are also in the PDB. An internal procedure often provides a function also found in the GIMP menus. + +Registration means declaring the name and parameters of a plug-in, as well as declaring where a plug-in will appear in the GIMP menus, if at all. + +A plug-in commonly calls other plug-ins in the PDB. + +(Note that the procedures in the PDB are often similar to procedures in the GIMP library, but have different signatures. Do not confuse the two.) + + +==Programming Languages for GIMP Plug-ins== + +GIMP plug-ins are written in the C, Scheme, Python, or Perl programming languages. + +C language GIMP plug-ins are compiled and linked with Gimp libraries. They can access functions in those libraries or functions in the PDB. They are distributed as executable files with suffix ".exe". + +Scheme language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as the functions built into the Scheme language. They are distributed as text files called scripts with suffix ".scm". + +Python language GIMP plug-ins are interpreted. They can access procedures in the GIMP Procedural Database (PDB) as well as functions provided by the PyGimp set of Python modules (chiefly, the module named "gimpfu") and functions provided by the Python modules in a standard Python distribution. They are distributed as text files with suffix ".py". + + +==Choosing a Language for a GIMP Plug-in== + +Plug-ins are usually usually written in the C language if they implement fundamental algorithms at the pixel level. Such plug-ins might need the speed of a compiled language and full access to the GIMP libraries. However, such plug-ins need to be separately compiled for each platform. + +Plug-ins written in Scheme or Python usually implement less compute intensive algorithms. Often they implement recipes: step-by-step sequences of actions a user could do manually using the GIMP. They are limited to GIMP functions found in the PDB (they can't directly access the Gimp C libraries. For Python plug-ins the gimpfu module wraps many GIMP C library functions.) They are very portable (assuming the separate Python interpreter is installed for Python plug-ins.) + +Plug-ins in C can provide any user interface using, for example, the GTK toolkit. Plug-ins written in Scheme or Python can easily provide a dialog for plug-in settings using a standard set of widgets provided (by the Scheme interpreter and the PyGimp modules) for the parameters of the plug-in. Plug-ins written in Python can provide fuller user interfaces by using, for example the PyGTK toolkit, which is in a standard Python distribution. + +C is an older language, the traditional programming language for systems level programming with full access to the underlying hardware and operating system. It is powerful but unforgiving. + +[http://en.wikipedia.org/wiki/Scheme_%28programming_language%29 Scheme] is a Lisp-like language with a very simple syntax. Some people find it hard to learn and difficult to read. The set of functions distributed with the Scheme interpreter built into Gimp is what the language provides, so you might need to include third party Scheme functions inside your plug-in. + +[http://en.wikipedia.org/wiki/Python_%28programming_language%29 Python] is a more recent, interpreted language. It is open source from [http://www.python.org/ Python.org] and supported on most platforms. It supports programming concepts such as object orientation and exceptions. Since it is interpreted, it supports agile programming or rapid prototyping. Most Python programs are written idiomatically, using common phrases. Some people find Python abstractions and idioms difficult to learn. The set of modules in a standard Python distribution provides a rich set of components. + + +==Debugging GIMP Plug-ins== + +Generally, debugging Scheme and Python plug-ins is easier. Python provides a trace when a plug-in throws an exception. Python also has a convenient logging module. + +You can use the technique of embedding print statements or logging statements in your plug-in. Start GIMP from a console (a terminal window) to see the output of your debugging statements to stdout or stderr (the standard output streams for a program.) + +You can also debug plug-ins using a run-time debugger, such as the GNU debugger, gdb, or a memory debugger, such as valgrind or purify. Since a plug-in is started from within GIMP and runs as a separate process from GIMP, you generally "attach" a running plug-in to a debugger. Or, for example, instead of you starting the debugger, GIMP starts the debugger when you start a plug-in from within GIMP. See [http://developer.gimp.org/debug-plug-ins.txt [1]] for more information. Generally a debugger is more useful for C-language programs. Using a debugger you might find yourself reading GIMP code instead of your plug-in code. + + +==Community of GIMP Plug-in Authors== + +Many authors of GIMP Scheme and Python plug-ins lurk at: + +[http://registry.gimp.org/ Gimp Plugin Registry] +[http://www.gimptalk.com/ Gimptalk] + +Generally, there are fewer authors of C-language GIMP plug-ins. The community of GIMP developers are mostly C programmers but they don't often write plug-ins. Questions to GIMP developers concerning C-language plug-ins are discouraged for all but difficult questions. Bugs in third-party plug-ins (those not distributed with GIMP) should NOT be reported as GIMP bugs, only reported to the author or maintainers of the third-party plug-ins. + + +==References for Programming GIMP Plug-ins== + +[[Hacking:How_to_write_a_GIMP_plug-in| A tutorial on programming GIMP plug-ins in the C language]]. + +[[Hacking:ScriptFu| ScriptFu: programming GIMP plug-ins in the Scheme language]] +[http://www.gimp.org/docs/scheme_plugin/ A tutorial on programming GIMP plug-ins in the Scheme language.] +[http://www.gimp.org/docs/python/index.html GIMP Python Documentation.] +[http://www.ibm.com/developerworks/opensource/library/os-autogimp/index.html#resources A tutorial on programming GIMP plug-ins in Python.] +[http://developer.gimp.org/api/2.0/index.html The GIMP 2.0 API Reference] This documents the GIMP C library, not the GIMP Procedural Database! The PDB is best examined from within GIMP using Help>Procedure Browser + +A few questions about plug-in development are answered in [http://developer.gimp.org/faq.html#id462307 GIMP Developer Frequently Asked Questions.] + + +==Templates for GIMP Plug-ins== + +A template is a canonical, minimal shell of, or a fill-in-the-blanks version, or an empty prototype for, a plug-in. + +A template for a C-language plug-in can be downloaded from GIMP's FTP server. A more current version is in the [https://git.gnome.org/browse/gimp-plugin-template/ GIMP plug-in template project's repository]. The template includes all necessary features of a well-behaved plug-in and includes build files for compiling the template. You don't have to care for [http://www.gnu.org/software/autoconf/ autoconf], [http://www.gnu.org/software/automake/ automake], internationalisation etc. + +There is also a [http://www.home.unix-ag.org/simon/files/script-fu-template.scm template for a Scheme language plug-in]. + +A template for a Python language plug-in is near the start of [http://www.gimp.org/docs/python/index.html the GIMP Python Documentation.] + +A template demonstrating how GIMP Python displays GUI widgets (for each parameter type) in the settings dialog of a Python plug-in is in the [http://registry.gimp.org/node/22349 plug-in registry]. + + +==GIMP Plug-in Architecture== + +Plug-ins are invoked by GIMP (whether interactive GIMP or batch-mode GIMP.) Plug-ins run as separate, independent processes from GIMP. That is, they have a separate execution environment. When a plug-in crashes, it does not usually affect the separate GIMP process. The GIMP and plug-in processes communicate using shared memory inter-process communication, but that does not concern most plug-in developers. The inter-process communication is hidden and established automatically by the canonical framework for a plug-in. + +A GIMP user can continue to use GIMP while a plug-in executes. However, usually a user waits and a plug-in returns quickly. + +A plug-in can open dialog windows with the user. The plug-in framework provides an initial "settings" dialog, for the parameters of a plug-in, before a plug-in begins its substantive work. A C-language plug-in should return a result code to GIMP and let GIMP display an error dialog if any. A Scheme or Python language plug-in should call the PDB procedure gimp_message() to display an error dialog. Or a Python plug-in can raise an exception, which results in the GIMP process displaying an error dialog. + +A plug-in that operates on an existing drawable (image, layer, or channel) should finally flush the display to show results to a user. + +A plug-in can also open separate displays (windows, for example on images.) A plug-in creates a display, then flushes it to show or refresh it to a user. + +A plug-in is invoked with a "run mode": + + +* interactive: shows a settings dialog for the user to modify parameters and can show GUI dialogs and windows to the user +* non-interactive: runs with the passed parameters and should not interact with a user +* run with last values: runs with previously used values for parameters (does not display a settings dialog) but can otherwise interact with the user + +It is the responsibility of a well-behaved plug-in to adhere to these rules. For example, a plug-in that is invoked with run mode non-interactive should not attempt to open a display. + + +==Installation of GIMP Plug-ins== + +Scheme and Python plug-ins are readable text files. C-language and Python plug-in files must have permissions set to allow execution. + +When GIMP starts, it examines the standard installation directories for plug-ins, and registers the plug-ins it finds. The plug-ins registered in the PDB are not persistent: if you delete a plug-in file, it disappears from the PDB. If you install a plug-in file, it will not appear in the PDB until you restart GIMP (except for Scheme plug-ins, which can be refreshed while GIMP is running using the menu item Filters>Script-Fu>Refresh Scripts.) (Also, as long as you don't change the registration signature of a C-language or Python plug-in, you can modify the plug-in file and rerun it without restarting GIMP.) + +Plug-ins distributed with GIMP are installed in standard subdirectories of the GIMP installation: all users on a multi-user computer can use them. A user can install third-party plug-ins in the same place, although it is not recommended. A user should install third-party plug-ins in a standard subdirectory of the user's home directory, so that on a multi-user computer, each user has their own plug-ins, and so that after a re-installation or update of GIMP, the user's third-party plug-ins in their home directory are not affected. + +You can determine the path to the two standard installation directories (all users, and user local) for plug-ins on any platform by installing GIMP and examining the Folders/Plug-Ins item of the Edit>Preferences dialog. + +Typically, third-party Scheme plug-ins are installed in ~/.gimp-2.x/scripts and C-language and Python language plug-ins are installed in ~/.gimp-2.x/plug-ins directories. Here, ~ means the user's home directory, the "." means the directory is a hidden file, and "x" is the minor version of GIMP, for example "7" for GIMP version 2.7. + + +==Internationalization of GIMP Plug-ins== + +GIMP is used around the world. Well-behaved plug-ins should be internationalized (translated into other languages, I18N.) The plug-in templates demonstrate internationalization. + +The GIMP project maintains the translation files for the plug-ins distributed with GIMP. + +For now, there does not seem to be any organization maintaining translation files for most third-party plug-ins. + + \ No newline at end of file diff --git a/wiki/Hacking:Plugins_v3-20210622040546-edit.txt b/wiki/Hacking:Plugins_v3-20210622040546-edit.txt new file mode 100644 index 0000000..c668eff --- /dev/null +++ b/wiki/Hacking:Plugins_v3-20210622040546-edit.txt @@ -0,0 +1,106 @@ + + + +This describes Gimp 3 plugins. For Gimp 2, see [[Hacking:Plugins]]. Much of what is written there still applies. + + +== General == + +Gimp version 3 supports plugins using GObject Introspection (GI). + +See an example below. + +A GIMP Python plugin: + +* imports the PyGObject module using "import gi" and imports the GIMP bindings +* inherits the class Gimp.PlugIn +* implements the virtual methods do_query_procedures(self) and do_create_procedure(self) +* implements the meat of the plugin in a "run procedure" of any name, registered with GIMP +* calls Gimp.main() + +Similarly for other languages? + +== GimpFu == + +Just as in Gimp version 2, there is: +* a full API for writing a plugin +* and a simplified GimpFu API. + +GimpFu has not been ported yet, but there is an effort to port it. + +The full API is more complex than the GimpFu API. +It exists now. + +== Other notes about GIMP 3 plugins == + +In version 2, PyGimp/GimpFu (and ScriptFu, etc.) did these things: + +* saved the "default" control values for a plugin so that it could be run again with the previous values +* implemented a plugin's control panel GUI from a declarative specification + +In version 3, these things will be done by GIMP itself (and thus available to all languages.) However, as of this writing, they are not quite ready. + + +== Backward compatibilility == + +When GimpFu is ported, existing version 2 plugins will require minor changes: + +* for Python 3 syntax and standard module changes +* some deprecated GIMP procedures might become obsolete +* miscellaneous changes + +== Language bindings == + +Any language that supports GI can be used. + +There are examples for the languages: C, Python, Scheme, Lua, and Javascript + +== Example code == + +In the GIMP repository, see gimp/plug-ins/goat-exercises. +A "goat-exercise" is a demo. There is one for each language binding. + +For Python language examples, also see gimp/plug-ins/python. + +== Generating documents for language bindings == + +Use the g-ir-doc-tool, available for example in the developer package gobject-introspection. + +This example creates a yelp browsable document for the Python binding to Gimp, in your home directory: + + g-ir-doc-tool --language=Python -o ~/gimp-doc /usr/local/share/gir-1.0/Gimp-3.0.gir + +The .gir file might be installed with GIMP, or might require building GIMP. +Or GIMP 3 might ship with the documents already generated. + +Other .gir files should be installed with your distribution, in /usr/share/gir-1.0 : + + GLib-2.0.gir + GObject-2.0.gir + Gio-2.0.gir + Gdk-3.0.gir + +== Strategy == + +A plugin that implements a compute intensive image processing algorithm should probably be implemented in C as a GEGL plugin. + +A plugin that is a simple recipe for calling a sequence of GIMP procedures, +or that otherwise simplifies a GIMP user's life, +can be written in the high-level scripting language of your choice. + +== Notes == + +-- Passing native sequence types e.g. list for GIMP array types -- + +In a binding, where it specifies a length and a native sequence, use just a native sequence in the call. +For example if the binding specifies (..., int, [float]), pass only a list of floats. +In other words, there is a discrepancy in the count of formal arguments as specified for the binding, +and the count of actual arguments passed. +The language binding performs magic in converting a native sequence like list to the two GObjects (int and "array") that GIMP wants. + +== Disambiguation == + +In version 2: +* PyGimp was a set of modules implementing the full API and other niceties +* GimpFu was a single module that implemented the simplified API, but imported some niceties from PyGimp +* PythonFu was used as a prefix of names of plugins using Python, and also to refer the the Python console diff --git a/wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20201025001535-edit.txt b/wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20201025001535-edit.txt new file mode 100644 index 0000000..18358bb --- /dev/null +++ b/wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20201025001535-edit.txt @@ -0,0 +1,186 @@ += New file loaders/exporters = + +==Porting to GEGL== + +TODO + +==Porting to GIO== + +GIO is a file access library and part of GLib. + +This is the general process to port a file loader or exporter to the GIO library: + +See the git log of the files that are already ported or work in progress and also the [https://developer.gnome.org/gio/2.35/ GIO reference manual]. + +To query for the existing GIO ports: +# open a terminal window +# change into your GIMP workspace folder +# run '''git checkout master''' +# on Linux, OS X or Windows with Cygwin run '''grep -r gimp_register_file_handler_uri plug-ins/ | sort'''. On Windows without Cygwin use the '''find''' command instead of '''grep''' (see '''find /?''' for syntax help). + +This will return a list with all occurences of the function '''gimp_register_file_handler_uri''' which indicates a GIO port. + +==Status== + +'''Legend''' + +Columns 'GEGL operation', 'GEGL port', 'Uses GIO': +{| +! scope="col" width="50px" | +|- +| {{no|}} || completely unimplemented yet +|- +| {{wip| }} || implementation unfinished +|- +| {{yes| }} || implementation finished, no matter of the test results +|- +| {{unknown| }} || doesn't need porting +|} + + +Column 'Test result': +{| +! scope="col" width="50px" | +|- +| {{no|}} || tests failed (please also describe the failure shortly +in the comment field or link to a Bugzilla bug report) +|- +| {{wip| }} || tests unfinished +|- +| {{yes| }} || tests ok +|- +| {{unknown| }} || not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + +{| class="wikitable sortable" style="text-align: left;" +! '''GIMP filter''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +!style="text-align: center;"| '''GEGL Test result''' +! style="text-align: center;"| '''GIO port''' +!style="text-align: center;"| '''GIO Test result''' +! '''Comment''' +|- +| file-aa || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-bmp || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-cel || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-compressor || {{unknown| }} || {{unknown| }} || {{unknown|}}||{{unknown|}} || {{unknown| }} || doesn't need porting +|- +| file-csource || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-desktop-link|| {{unknown| }} || {{unknown| }} || {{unknown|}}||{{unknown|}} || {{unknown| }} || doesn't need porting +|- +| file-dicom || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-exr-load || {{wip|exr-load }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-exr-save || {{wip|exr-save }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-faxg3 || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-fits || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-fli || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-gbr || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-gif-load || {{unknown| }} ||{{yes}} ||{{unknown|untested}}|| {{no}} || {{unknown|untested}}|| +|- +| file-gif-save || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-gih || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-glob || {{unknown| }} || {{unknown| }} || {{unknown|}}||{{unknown|}} || {{unknown| }} || doesn't need porting +|- +| file-header || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-html-table || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-ico || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-jp2-load || {{yes|jp2-load }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-jpeg || {{wip|jpg-load, jpg-save }} ||{{yes}} || {{Yes|OK}} || {{no}} || {{unknown|untested}}|| +|- +| file-mng || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-pat || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-pcx || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-pdf-load || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-pdf-save || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-pix || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-png || {{wip|png-load, png-save }} ||{{yes}} || {{Yes|OK}}|| {{no}} || {{unknown|untested}}|| +|- +| file-pnm || {{wip|ppm-load, ppm-save }} ||{{yes}} || {{unknown|untested}}|| {{yes}} || {{unknown|untested}}|| +|- +| file-ps || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{wip}} || {{unknown|untested}}|| [https://git.gnome.org/browse/gimp/commit/?id=591b2d356bd84dd380f1c5b61318a77d0086a0b8 only the saving code ported] +|- +| file-psd || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-psp || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-raw-data || {{Unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}||Unrelated to raw camera files +|- +| file-sgi || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-sunras || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-svg || {{wip|svg-load }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-tga || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-tiff-load || {{unknown| }} ||{{wip}} || {{unknown|untested}}||{{yes}} || {{No|Failing}}||GIMP doesn't respect layer order of multi-layer TIFFs. +|- +| file-tiff-save || {{unknown| }} ||{{wip}} || {{No|Failing}}|| {{yes}} ||{{unknown|untested}}||GIMP flattens multi-layer TIFFs. +|- +| file-uri || {{unknown| }} || {{unknown| }} || {{unknown|}}||{{unknown|}} || {{unknown| }} || doesn't need porting +|- +| file-wmf || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-xbm || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +| file-xmc || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-xpm || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +| file-xwd || {{unknown| }} ||{{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|} + +== New File loaders/exporters == + +These file loaders/savers are implemented in GEGL, but may not be part of GIMP (yet). +Currently they are listed here for completeness. + +{| class="wikitable sortable" style="text-align: left;" +!'''GEGL filter''' +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GIMP filter''' ] +! style="text-align: center;"| '''Test result''' +! '''Comment''' +|- +|ff-load || {{no}} || {{unknown|untested}}||FFmpeg video frame importer +|- +|ff-save || {{no}} || {{unknown|untested}}||FFmpeg video frame output sink. GEGL op is work in progress. +|- +|npy-save || {{no}} || {{unknown|untested}}||Numerical Python (NumPy) file saver. +|- +|rawbayer-load || {{no}} || {{unknown|untested}}|| RAWBAYER and RAWBAYERS format. GEGL op is work in progress +|- +|rgbe-load || {{no}} || {{unknown|untested}}||for Radiance HDR format with extensions HDR and PIC +|- +|rgbe-save || {{no}} || {{unknown|untested}}||for Radiance HDR format with extensions HDR and PIC +|- +|webp-load || {{wip}} || {{unknown|untested}}||for WebP image format +|- +|webp-save || {{wip}} || {{unknown|untested}}||for WebP image format +|} diff --git a/wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20210816235742-show.txt b/wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20210816235742-show.txt new file mode 100644 index 0000000..a71e843 --- /dev/null +++ b/wiki/Hacking:Porting_file_plugins_to_GEGL_and_GIO-20210816235742-show.txt @@ -0,0 +1,203 @@ + + +__TOC__ + +=New file loaders/exporters= + +==Porting to GEGL== + +TODO + + +==Porting to GIO== + +GIO is a file access library and part of GLib. + +This is the general process to port a file loader or exporter to the GIO library: + +See the git log of the files that are already ported or work in progress and also the [https://developer.gnome.org/gio/2.35/ GIO reference manual]. + +To query for the existing GIO ports: + + +# open a terminal window +# change into your GIMP workspace folder +# run '''git checkout master''' +# on Linux, OS X or Windows with Cygwin run '''grep -r gimp_register_file_handler_uri plug-ins/ | sort'''. On Windows without Cygwin use the '''find''' command instead of '''grep''' (see '''find /?''' for syntax help). + +This will return a list with all occurences of the function '''gimp_register_file_handler_uri''' which indicates a GIO port. + + +==Status== + +'''Legend''' +__Columns 'GEGL operation', 'GEGL port', 'Uses GIO':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Column 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''GEGL Test result''' +! '''GIO port''' +! '''GIO Test result''' +! '''Comment''' +|- +| file-aa | | Yes | untested| No | untested| +|- +| file-bmp | | Yes | untested| No | untested| +|- +| file-cel | | Yes | untested| Yes | untested| +|- +| file-compressor | | | | | | doesn't need porting +|- +| file-csource | | Yes | untested| Yes | untested| +|- +| file-desktop-link| | | | | | doesn't need porting +|- +| file-dicom | | Yes | untested| No | untested| +|- +| file-exr-load | exr-load | Yes | untested| No | untested| +|- +| file-exr-save | exr-save | Yes | untested| No | untested| +|- +| file-faxg3 | | Yes | untested| No | untested| +|- +| file-fits | | Yes | untested| No | untested| +|- +| file-fli | | Yes | untested| No | untested| +|- +| file-gbr | | Yes | untested| Yes | untested| +|- +| file-gif-load | | Yes | untested| No | untested| +|- +| file-gif-save | | Yes | untested| Yes | untested| +|- +| file-gih | | Yes | untested| Yes | untested| +|- +| file-glob | | | | | | doesn't need porting +|- +| file-header | | Yes | untested| Yes | untested| +|- +| file-html-table | | Yes | untested| Yes | untested| +|- +| file-ico | | Yes | untested| No | untested| +|- +| file-jp2-load | jp2-load | Yes | untested| No | untested| +|- +| file-jpeg | jpg-load, jpg-save | Yes | OK | No | untested| +|- +| file-mng | | Yes | untested| No | untested| +|- +| file-pat | | Yes | untested| Yes | untested| +|- +| file-pcx | | Yes | untested| No | untested| +|- +| file-pdf-load | | Yes | untested| No | untested| +|- +| file-pdf-save | | Yes | untested| No | untested| +|- +| file-pix | | Yes | untested| Yes | untested| +|- +| file-png | png-load, png-save | Yes | OK| No | untested| +|- +| file-pnm | ppm-load, ppm-save | Yes | untested| Yes | untested| +|- +| file-ps | | Yes | untested| work in progress | untested| [https://git.gnome.org/browse/gimp/commit/?id=591b2d356bd84dd380f1c5b61318a77d0086a0b8 only the saving code ported] +|- +| file-psd | | Yes | untested| No | untested| +|- +| file-psp | | Yes | untested| No | untested| +|- +| file-raw-data | | Yes | untested| No | untested| Unrelated to raw camera files +|- +| file-sgi | | Yes | untested| No | untested| +|- +| file-sunras | | Yes | untested| No | untested| +|- +| file-svg | svg-load | Yes | untested| No | untested| +|- +| file-tga | | Yes | untested| No | untested| +|- +| file-tiff-load | | work in progress | untested| Yes | Failing| GIMP doesn't respect layer order of multi-layer TIFFs. +|- +| file-tiff-save | | work in progress | Failing| Yes | untested| GIMP flattens multi-layer TIFFs. +|- +| file-uri | | | | | | doesn't need porting +|- +| file-wmf | | Yes | untested| No | untested| +|- +| file-xbm | | Yes | untested| Yes | untested| +|- +| file-xmc | | Yes | untested| No | untested| +|- +| file-xpm | | Yes | untested| No | untested| +|- +| file-xwd | | Yes | untested| Yes | untested| +|} + +==New File loaders/exporters== + +These file loaders/savers are implemented in GEGL, but may not be part of GIMP (yet). +Currently they are listed here for completeness. + + +{| class="wikitable" +|- +! '''GEGL filter''' +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GIMP filter''' ] +! '''Test result''' +! '''Comment''' +|- +| ff-load | No | untested| FFmpeg video frame importer +|- +| ff-save | No | untested| FFmpeg video frame output sink. GEGL op is work in progress. +|- +| npy-save | No | untested| Numerical Python (NumPy) file saver. +|- +| rawbayer-load | No | untested| RAWBAYER and RAWBAYERS format. GEGL op is work in progress +|- +| rgbe-load | No | untested| for Radiance HDR format with extensions HDR and PIC +|- +| rgbe-save | No | untested| for Radiance HDR format with extensions HDR and PIC +|- +| webp-load | work in progress | untested| for WebP image format +|- +| webp-save | work in progress | untested| for WebP image format +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20201028005243-edit.txt b/wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20201028005243-edit.txt new file mode 100644 index 0000000..bc86a6e --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20201028005243-edit.txt @@ -0,0 +1,38 @@ +Reviewing UI & properties of ported operations: what changed, whether rendering is the same, which properties need renaming etc. + +{| class="wikitable sortable" style="text-align: left;" +!'''GIMP filter''' +!'''Menu group''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +!style="text-align: center;"|'''OK?''' +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +|Antialias|| Filters/Enhance ||{{yes|antialias}} || {{yes}} || {{yes|tested}}|| OK +|- +|Deinterlace|| Filters/Enhance ||{{yes|deinterlace}} || {{yes}} || {{yes|tested}}|| OK. The operation got extra options: orientation and block size. +|- +|Supernova|| Filters/Light & Shadow ||{{yes|supernova}} || {{no}} || {{yes|tested}}|| Center coordinates are defined in relative units, max radius has been changed to 3,000 from 1,000, seed option added to reproduce original renders +|- +|Lens Flare|| Filters/Light & Shadow ||{{yes|lens-flare}} || {{no}} || {{yes|tested}}|| Center coordinates are defined in relative units +|- +|Drop Shadow|| Filters/Light & Shadow ||{{yes|dropshadow}} || {{no}} || {{no|tested}}|| Does not visibly affect layers, X/Y labels in sliders need to be changed to mention that the sliders control displacement, 'Allow resizing' feature from the original script is lost, opacity's max value is 2.0 +|- +|Cell noise|| Filters/Render/Noise ||{{yes|noise-cell}} || {{no}} || {{yes|tested}}|| UI makes mostly sense. 2 discrete step Rank value slider is odd, but tolerable +|- +|Perlin Noise|| Filters/Render/Noise ||{{yes|noise-perlin}} || {{yes}} || {{yes|tested}}|| OK +|- +|Plasma || Filters/Render/Noise ||{{yes|plasma }} || {{yes}} || {{yes|tested}}|| OK +|- +|Simplex noise|| Filters/Render/Noise ||{{yes|noise-simplex}} || {{no}} || {{yes|tested}}|| Scale value may need gamma to make the smaller scale factors (that make noise bigger) usable +|- +|Checkerboard|| Filters/Render/Pattern ||{{yes|checkerboard}} || {{yes}} || {{yes|tested}}|| OK +|- +|Grid|| Filters/Render/Pattern ||{{yes|grid}} || {{yes}} || {{yes|tested}}|| OK +|- +|Channel Mixer|| Colours/Components ||{{yes|channel-mixer}} || {{yes}} || {{yes|tested}}|| Fixed with custom UI. Monchrome mode functionality moved to Mono Mixer +|- +|Unsharp Mask || Filters/Enhance ||{{wip|unsharp-mask}} || {{no}} || {{no|tested}} || Parameters differ in naming and essence in OP, threshold parameter is totally missing. +|- +|Wind || Filters/Distorts ||{{wip|wind}} || {{no}} || {{no|tested}} || Left and right effect directions are mixed up +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20210518054200-edit.txt b/wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20210518054200-edit.txt new file mode 100644 index 0000000..bc86a6e --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL%2FUI_review-20210518054200-edit.txt @@ -0,0 +1,38 @@ +Reviewing UI & properties of ported operations: what changed, whether rendering is the same, which properties need renaming etc. + +{| class="wikitable sortable" style="text-align: left;" +!'''GIMP filter''' +!'''Menu group''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +!style="text-align: center;"|'''OK?''' +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +|Antialias|| Filters/Enhance ||{{yes|antialias}} || {{yes}} || {{yes|tested}}|| OK +|- +|Deinterlace|| Filters/Enhance ||{{yes|deinterlace}} || {{yes}} || {{yes|tested}}|| OK. The operation got extra options: orientation and block size. +|- +|Supernova|| Filters/Light & Shadow ||{{yes|supernova}} || {{no}} || {{yes|tested}}|| Center coordinates are defined in relative units, max radius has been changed to 3,000 from 1,000, seed option added to reproduce original renders +|- +|Lens Flare|| Filters/Light & Shadow ||{{yes|lens-flare}} || {{no}} || {{yes|tested}}|| Center coordinates are defined in relative units +|- +|Drop Shadow|| Filters/Light & Shadow ||{{yes|dropshadow}} || {{no}} || {{no|tested}}|| Does not visibly affect layers, X/Y labels in sliders need to be changed to mention that the sliders control displacement, 'Allow resizing' feature from the original script is lost, opacity's max value is 2.0 +|- +|Cell noise|| Filters/Render/Noise ||{{yes|noise-cell}} || {{no}} || {{yes|tested}}|| UI makes mostly sense. 2 discrete step Rank value slider is odd, but tolerable +|- +|Perlin Noise|| Filters/Render/Noise ||{{yes|noise-perlin}} || {{yes}} || {{yes|tested}}|| OK +|- +|Plasma || Filters/Render/Noise ||{{yes|plasma }} || {{yes}} || {{yes|tested}}|| OK +|- +|Simplex noise|| Filters/Render/Noise ||{{yes|noise-simplex}} || {{no}} || {{yes|tested}}|| Scale value may need gamma to make the smaller scale factors (that make noise bigger) usable +|- +|Checkerboard|| Filters/Render/Pattern ||{{yes|checkerboard}} || {{yes}} || {{yes|tested}}|| OK +|- +|Grid|| Filters/Render/Pattern ||{{yes|grid}} || {{yes}} || {{yes|tested}}|| OK +|- +|Channel Mixer|| Colours/Components ||{{yes|channel-mixer}} || {{yes}} || {{yes|tested}}|| Fixed with custom UI. Monchrome mode functionality moved to Mono Mixer +|- +|Unsharp Mask || Filters/Enhance ||{{wip|unsharp-mask}} || {{no}} || {{no|tested}} || Parameters differ in naming and essence in OP, threshold parameter is totally missing. +|- +|Wind || Filters/Distorts ||{{wip|wind}} || {{no}} || {{no|tested}} || Left and right effect directions are mixed up +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL%2UI_review-20210818214334-show.txt b/wiki/Hacking:Porting_filters_to_GEGL%2UI_review-20210818214334-show.txt new file mode 100644 index 0000000..028802e --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL%2UI_review-20210818214334-show.txt @@ -0,0 +1,42 @@ + + +Reviewing UI & properties of ported operations: what changed, whether rendering is the same, which properties need renaming etc. + + +{| class="wikitable" +|- +! '''GIMP filter''' +! '''Menu group''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! '''OK?''' +! '''Test result''' +! '''Comment''' +|- +| Antialias| Filters/Enhance | antialias | Yes | tested| OK +|- +| Deinterlace| Filters/Enhance | deinterlace | Yes | tested| OK. The operation got extra options: orientation and block size. +|- +| Supernova| Filters/Light & Shadow | supernova | No | tested| Center coordinates are defined in relative units, max radius has been changed to 3,000 from 1,000, seed option added to reproduce original renders +|- +| Lens Flare| Filters/Light & Shadow | lens-flare | No | tested| Center coordinates are defined in relative units +|- +| Drop Shadow| Filters/Light & Shadow | dropshadow | No | tested| Does not visibly affect layers, X/Y labels in sliders need to be changed to mention that the sliders control displacement, 'Allow resizing' feature from the original script is lost, opacity's max value is 2.0 +|- +| Cell noise| Filters/Render/Noise | noise-cell | No | tested| UI makes mostly sense. 2 discrete step Rank value slider is odd, but tolerable +|- +| Perlin Noise| Filters/Render/Noise | noise-perlin | Yes | tested| OK +|- +| Plasma | Filters/Render/Noise | plasma | Yes | tested| OK +|- +| Simplex noise| Filters/Render/Noise | noise-simplex | No | tested| Scale value may need gamma to make the smaller scale factors (that make noise bigger) usable +|- +| Checkerboard| Filters/Render/Pattern | checkerboard | Yes | tested| OK +|- +| Grid| Filters/Render/Pattern | grid | Yes | tested| OK +|- +| Channel Mixer| Colours/Components | channel-mixer | Yes | tested| Fixed with custom UI. Monchrome mode functionality moved to Mono Mixer +|- +| Unsharp Mask | Filters/Enhance | unsharp-mask | No | tested | Parameters differ in naming and essence in OP, threshold parameter is totally missing. +|- +| Wind | Filters/Distorts | wind | No | tested | Left and right effect directions are mixed up +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20141226014626-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20141226014626-show.txt new file mode 100644 index 0000000..51594b9 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20141226014626-show.txt @@ -0,0 +1,533 @@ + + +Last updated: see tab 'history' + + +{| class="wikitable" +|- +|

    Contents

    + +** 1.1 GEGL part +** 1.2 GIMP part +** 1.1 GEGL part +** 1.2 GIMP part +* 1.1 GEGL part +* 1.2 GIMP part +** 2.1 GIMP core (Layer modes, Transformation and Color Adjustment Tools) +** 2.2 Processing, color grading and effects +** 2.3 Display filters +** 2.1 GIMP core (Layer modes, Transformation and Color Adjustment Tools) +** 2.2 Processing, color grading and effects +** 2.3 Display filters +* 2.1 GIMP core (Layer modes, Transformation and Color Adjustment Tools) +* 2.2 Processing, color grading and effects +* 2.3 Display filters +* 3 Port of new GEGL ops to OpenCL +|} + += How to port = + +== GEGL part == + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. There's no need to register it in a particular Makefile, because GEGL's build system will build every C file present in the operations directory. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +== GIMP part == + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + += Porting matrix = + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +== GIMP core (Layer modes, Transformation and Color Adjustment Tools) == + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +== Processing, color grading and effects == + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | work in progress | untested| No | untested| +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | work in progress | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checker-board | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | | No | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| No | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | | No | untested| No | untested| +|- +| Dilate | | No | untested| No | untested| +|- +| Displace | displace | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | | No | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | No | untested| No | untested| +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | | No | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | | No | untested| No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | | No | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | No | untested| No | untested| +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | | No | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | | No | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | No | untested| No | untested| +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | | No | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | | No | untested| No | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | work in progress | untested| No | untested| GEGL op parameters differ from GIMP filter. +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +== Display filters == + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + += Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20150905062156-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20150905062156-show.txt new file mode 100644 index 0000000..bc8affb --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20150905062156-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | work in progress | untested| No | untested| +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | | No | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | No | untested| No | untested| +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| No | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20151007050152-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20151007050152-show.txt new file mode 100644 index 0000000..bc8affb --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20151007050152-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | work in progress | untested| No | untested| +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | | No | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | No | untested| No | untested| +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| No | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20160112231213-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20160112231213-show.txt new file mode 100644 index 0000000..acdb123 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20160112231213-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | No | untested| No | untested| +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| No | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20160630022533-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20160630022533-show.txt new file mode 100644 index 0000000..2dff15f --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20160630022533-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20160927041606-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20160927041606-show.txt new file mode 100644 index 0000000..2dff15f --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20160927041606-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20161028235537-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20161028235537-show.txt new file mode 100644 index 0000000..2dff15f --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20161028235537-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20161120184915-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20161120184915-show.txt new file mode 100644 index 0000000..2dff15f --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20161120184915-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| It doesn't honor GeglOperationAreaFilter's area, among other things. +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | | No | untested| No | untested| +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | No | untested| No | untested| +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20170710172113-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20170710172113-show.txt new file mode 100644 index 0000000..4bad384 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20170710172113-show.txt @@ -0,0 +1,514 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| CSS stylesheet | | No | untested| No | untested| +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| No | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | gradient-map | Yes | untested| No | untested| +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Probably doesn't need porting +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Java map | | No | untested| No | untested| Probably doesn't need porting +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| No | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | work in progress | untested| No | untested | Complete in abyss branch +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| No | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20180812150558-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20180812150558-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20180812150558-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20190507091745-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20190507091745-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20190507091745-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20190910220828-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20190910220828-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20190910220828-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20201112031545-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20201112031545-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20201112031545-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20201113064505-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20201113064505-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20201113064505-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20201129020105-edit.txt b/wiki/Hacking:Porting_filters_to_GEGL-20201129020105-edit.txt new file mode 100644 index 0000000..7d980ec --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20201129020105-edit.txt @@ -0,0 +1,473 @@ +Last updated: see tab 'history' + += How to port = + +== GEGL part == +This is the general process for writing a new GEGL operation: + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +== GIMP part == +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + += Porting matrix = +'''Legend''' + +Columns 'GEGL port', 'OpenCL version': +{| +! scope="col" width="50px" | +|- +| {{no|}} || completely unimplemented yet +|- +| {{wip| }} || implementation unfinished +|- +| {{yes| }} || implementation finished, no matter of the test results +|- +| {{unknown| }} || doesn't need porting +|} + + +Columns 'Test result': +{| +! scope="col" width="50px" | +|- +| {{no|}} || tests failed (please also describe the failure shortly +in the comment field or link to a Bugzilla bug report) +|- +| {{wip| }} || tests unfinished +|- +| {{yes| }} || tests ok +|- +| {{unknown| }} || not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + +== GIMP core (Layer modes, Transformation and Color Adjustment Tools) == +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + +== Processing, color grading and effects == + +{| class="wikitable sortable" style="text-align: left;" +!'''GIMP filter''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +!style="text-align: center;"|[https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! style="text-align: center;"| '''Test result''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +|Alien Map || {{yes|alien-map }} || {{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +|Align Visible Layers || {{unknown| }} || {{unknown| }} || {{unknown|}}|| {{unknown|}} ||{{unknown|}}|| Doesn't need porting +|- +|Animation Playback || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Antialias || {{yes|antialias }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Apply Canvas || {{yes|texturize-canvas }} || {{wip}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}||texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +|Apply Lens || {{yes|apply-lens}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +|Assign Color Profile || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Autocrop Image || {{unknown| }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}||Done in core +|- +|Autocrop Layer || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Done in core +|- +|Border Average || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Bump Map || {{yes|bump-map }}|| {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Cartoon || {{wip|cartoon }} || {{wip}} || {{unknown|untested}} ||{{no}} ||{{unknown|untested}}|| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +|Channel Mixer || {{yes|channel-mixer }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Checkerboard || {{wip|checkerboard }} || {{wip}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Missing Psychobilly Option +|- +|CML Explorer || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Color Enhance || {{yes|color-enhance}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Color Exchange || {{yes|color-exchange}} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Color to Alpha || {{wip|color-to-alpha }} || {{wip}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| The pdb wrapper needs some more love (see comment in there) +|- +|Colorcube Analysis || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Compose || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +|Convert to Color Profile || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Convolution Matrix || {{wip|convolution-matrix }} || {{no}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +|Cubism || {{wip|cubism }} || {{wip}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| It doesn't honnor the GeglOperationAreaFilter class properly +|- +|Curve Bend || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Decompose || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +|Deinterlace || {{wip|deinterlace }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +|Depth Merge || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Despeckle || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Destripe || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Difference of Gaussians || {{wip|difference-of-gaussians }} || {{wip}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||The port is missing Normalize and Invert options +|- +|Diffraction Patterns || {{yes|diffraction-patterns }} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Dilate || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Provided by the value-propagate operation +|- +|Displace || {{yes|displace}} || {{yes}} ||{{unknown|untested}}|| {{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Drop Shadow || {{wip|dropshadow }} || {{wip}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Shadow effect only seen in transparent areas inside the layer bounds. +|- +|Edge-Detect (Edge...) || {{yes|edge}} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +|Edge-Detect (Laplace) || {{yes|edge-laplace}} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Edge-Detect (Neon) || {{unknown| }} || {{no}} ||{{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Edge-Detect (Sobel) || {{wip|edge-sobel}} || {{wip}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Emboss || {{wip|emboss }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Engrave || {{yes|engrave }} || {{yes}} ||{{unknown|untested}}|| {{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Erode || {{unknown| }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}||Provided by the value-propagate operation +|- +|Filmstrip || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Filterpack || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Flame || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Fractal Explorer || {{wip|fractal-explorer}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Fractal Trace || {{wip|fractal-trace}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|From Webpage|| {{unknown| }} || {{unknown| }} || {{unknown|untested}}||{{unknown| }} || {{unknown| }}||Doesn't need porting +|- +|Gaussian blur || {{wip|gaussian-blur}} || {{wip}} ||{{unknown|untested}}||{{wip}} || {{unknown|untested}}||https://bugzilla.gnome.org/show_bug.cgi?id=721396 +|- +|Gfig || {{unknown| }} || {{unknown| }} || {{unknown| }}||{{unknown| }} || {{unknown| }}||Doesn't need porting +|- +|GIMPressionist || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Glass Tile || {{yes|tile-glass }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Gradient Flare || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Gradient Map || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Ported as a gimp plug-in +|- +|Grey || {{wip|grey}} || {{no}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}||Similar to the Desaturation tool, but without its options +|- +|Grid || {{wip|grid }} || {{wip}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}||Missing intersection option, is it needed ? +|- +|Hot || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|IFS Fractal || {{unknown| }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Illusion || {{yes|illusion}} || {{yes}} || {{yes}}||{{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Image Map || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} || {{unknown|untested}}||Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +|Invert || {{wip|invert-gamma }} || {{no}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}||The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp || {{unknown| }} || {{unknown| }} || {{unknown| }}|| {{unknown| }} || {{unknown| }}||To be replaced with Warp Transform tool +|- +|Jigsaw || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Lens Distortion || {{yes|lens-distortion }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Lens Flare || {{yes|lens-flare }} || {{yes}} || {{yes}} ||{{no}} ||{{unknown|untested}}|| +|- +|Lighting Effects || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Make Seamless || {{yes|tile-seamless }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Maximum RGB || {{unknown| }} || {{unknown| }} || {{unknown| }}|| {{unknown| }} || {{unknown| }}||Will be removed without replacement +|- +|Maze || {{yes|maze}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Mosaic || {{wip|mosaic }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| The GEGL op tries to allocate the whole input. +|- +|Motion Blur (circular)|| {{wip|motion-blur-circular}} || {{yes}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Is allocating the whole input +|- +|Motion Blur (linear)|| {{wip|motion-blur-linear}} || {{yes}} || {{unknown|untested}} ||{{yes}} || {{unknown|untested}}||Is allocating the whole input +|- +|Motion Blur (zoom) || {{wip|motion-blur-zoom}} || {{yes}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Is allocating the whole input +|- +|Newsprint || {{yes|newsprint}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at https://pippin.gimp.org/spachrotyzer/ +|- +|NL Filter || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Noise (HSV Noise) || {{yes|noise-hsv}} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}||The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +|Noise (Hurl) || {{yes|noise-hurl }} || {{yes}} || {{yes}}||{{yes}} ||{{yes}}|| +|- +|Noise (Pick) || {{yes|noise-pick }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Noise (RGB Noise) || {{wip|noise-rgb }} || {{wip}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Noise (Slur) || {{yes|noise-slur}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Noise (Spread) || {{yes|noise-spread}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Normalize || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Provided by the stretch-contrast operation when "keep colors" is checked +|- +|Oilify || {{wip|oilify }} || {{wip}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Optimize (Difference) || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Optimize (for GIF) || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Pagecurl || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Palette Map || {{unknown| }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Paper Tile || {{yes|tile-paper}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Photocopy || {{wip|photocopy }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Pixelize || {{yes|pixelize }} || {{yes}} ||{{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +|Plasma || {{yes|plasma }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Polar Coordinates || {{wip|polar-coordinates}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Currently renders partially garbage +|- +|Qbist || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Rearrange Colormap || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Not to be confused with GEGL's 'remap' operation. +|- +|Recompose || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| See compose +|- +|Red Eye Removal || {{wip|red-eye-removal }} || {{wip}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Retinex || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Ripple || {{yes|ripple}} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}} || +|- +|Rotate Colors || {{wip|color-rotate}} || {{no}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Sample Colorize || {{unknown| }} || {{no}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Screenshot || {{unknown| }} || {{yes}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Selection to Path || {{unknown| }} || {{yes}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Selective Gaussian Blur || {{yes|gaussian-blur-selective }} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Set Colormap || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Not to be confused with GEGL's 'remap' operation. +|- +|Shift || {{yes|shift }} || {{yes}} || {{yes}}||{{no}} ||{{unknown|untested}}|| +|- +|Sinus || {{yes|sinus}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Smooth Palette || {{unknown| }} || {{wip}} ||{{unknown|untested}}|| {{yes}} ||{{unknown|untested}}|| See https://bugzilla.gnome.org/show_bug.cgi?id=774807 and https://bugzilla.gnome.org/show_bug.cgi?id=749220 +|- +|Softglow || {{wip|softglow }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +|Solid Noise || {{yes|noise-solid| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Sparkle || {{wip|sparkle }} || {{wip}} || {{unknown|untested}}||{{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Sphere Designer || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Stretch Contrast || {{yes|stretch-contrast}} || {{yes}} || {{yes}}||{{yes}} || {{yes}}|| +|- +|Stretch HSV || {{yes|stretch-contrast-hsv}} || {{yes}} || {{yes}}||{{no}} ||{{unknown|untested}}|| +|- +|Supernova || {{yes|supernova}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Tile || {{yes|tile}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +|Unoptimize || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Unsharp Mask || {{wip|unsharp-mask}} || {{wip}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Value Invert || {{wip|value-invert}} || {{wip}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Value Propagate || {{yes|value-propagate }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Van Gogh (LIC) || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}||The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +|Video || {{yes|video-degradation }} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Waves || {{wip|waves }} || {{wip}} ||{{unknown|untested}}|| {{no}} || {{unknown|untested}}||Missing reflective option that produce strange result, I suggest dropping that. +|- +|Whirl and Pinch || {{wip|whirl-pinch}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Wind || {{yes|wind }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Zealous Crop || {{unknown|N/A}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +== Display filters == + +{| class="wikitable sortable" style="text-align: left;" +!'''Display filter''' +!style="text-align: center;"|[https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! style="text-align: center;"| '''Test result''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +| Color deficient vision|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Color management || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Color proof|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Contrast|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Gamma|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|} + + += Port of new GEGL ops to OpenCL= + +{| class="wikitable sortable" style="text-align: left;" +!'''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +|Bilateral filter ||{{yes}} || {{unknown|untested}}|| +|- +|Box blur ||{{yes}} || {{unknown|untested}}|| +|- +|Box max || {{yes}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Box min || {{yes}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Box percentile || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Brightness and Contrast ||{{yes}} || {{unknown|untested}}|| +|- +|Buffer cache || {{no}} || {{unknown|untested}}||GEGL op is work in progress. Does this need an OpenCL port? +|- +|C2g ||{{yes}} || {{unknown|untested}}||HDR related +|- +|Cell Noise || {{yes}} || {{unknown|untested}}|| +|- +|Checkerboard || {{yes}} || {{unknown|untested}}|| +|- +|Cielch Noise || {{no}} || {{unknown|untested}}|| +|- +|Color || {{no}} || {{unknown|untested}}|| +|- +|Color Reduction || {{no}} || {{unknown|untested}}|| +|- +|Color Temperature ||{{yes}} || {{unknown|untested}}|| +|- +|Contrast Curve || {{wip}} || {{unknown|untested}}|| +|- +|Demosaic (bimedian) || {{no}} || {{unknown|untested}}|| GEGL op is work in progress. +|- +|Demosaic (simple) || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Disc percentile || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Display || {{no}} || {{unknown|untested}}||Does this need an OpenCL port? +|- +|Ditto || {{no}} || {{unknown|untested}}||GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +|Exp combine || {{no}} || {{unknown|untested}}||HDR related +|- +|Exposure || {{no}} || {{unknown|untested}}|| HDR related +|- +|Fattal02 || {{no}} || {{unknown|untested}}||HDR related +|- +|gluas || {{no}} || {{unknown|untested}}||GEGL op is work in progress. Does this need an OpenCL port? +|- +|Gnomonic projection || {{no}} || {{unknown|untested}} +|- +|HStack || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Hue-Chroma || {{yes}} || {{unknown|untested}}|| +|- +|Image compare || {{no}} ||{{unknown|untested}}|| +|- +|Ink simulator || {{no}} ||{{unknown|untested}}|| +|- +|Introspect || {{no}} || {{unknown|untested}}||Does this need an OpenCL port? +|- +|Kuwahara || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Lens correction || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Line profile || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Linear gradient || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Mandelbrot || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Mantiuk06 || {{no}} || {{unknown|untested}}||HDR related +|- +|Mirrors || {{no}} || {{unknown|untested}}|| +|- +|Mono mixer ||{{yes}} || {{unknown|untested}}|| +|- +|Noise || {{no}} || {{unknown|untested}}||Perlin noise generator +|- +|Noise Reduction ||{{yes}} || {{unknown|untested}}|| +|- +|Over || {{no}} || {{unknown|untested}}||Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +|Radial gradient || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Reinhard05 ||{{yes}} || {{unknown|untested}}||HDR related +|- +|Remap || {{no}} || {{unknown|untested}}|| +|- +|Shadows-Highlights ||{{yes}} || {{unknown|untested}}|| +|- +|SNN (mean) ||{{yes}} || {{unknown|untested}}|| +|- +|SNN (percentile) || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Stereographic projection || {{no}} || {{unknown|untested}} +|- +|SVG Hue rotate|| {{no}} || {{unknown|untested}}|| +|- +|SVG Luminance to Alpha || {{no}} || {{unknown|untested}}|| +|- +|SVG Matrix || {{no}} || {{unknown|untested}}|| +|- +|SVG Saturate || {{no}} || {{unknown|untested}}|| +|- +|Unpremul || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Vignette ||{{yes}} || {{unknown|untested}}|| +|- +|Weighted Blend || {{yes}} || {{unknown|untested}}|| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20210505211634-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20210505211634-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20210505211634-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20210506133935-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20210506133935-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20210506133935-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20210620064607-edit.txt b/wiki/Hacking:Porting_filters_to_GEGL-20210620064607-edit.txt new file mode 100644 index 0000000..7d980ec --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20210620064607-edit.txt @@ -0,0 +1,473 @@ +Last updated: see tab 'history' + += How to port = + +== GEGL part == +This is the general process for writing a new GEGL operation: + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +== GIMP part == +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + += Porting matrix = +'''Legend''' + +Columns 'GEGL port', 'OpenCL version': +{| +! scope="col" width="50px" | +|- +| {{no|}} || completely unimplemented yet +|- +| {{wip| }} || implementation unfinished +|- +| {{yes| }} || implementation finished, no matter of the test results +|- +| {{unknown| }} || doesn't need porting +|} + + +Columns 'Test result': +{| +! scope="col" width="50px" | +|- +| {{no|}} || tests failed (please also describe the failure shortly +in the comment field or link to a Bugzilla bug report) +|- +| {{wip| }} || tests unfinished +|- +| {{yes| }} || tests ok +|- +| {{unknown| }} || not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + +== GIMP core (Layer modes, Transformation and Color Adjustment Tools) == +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + +== Processing, color grading and effects == + +{| class="wikitable sortable" style="text-align: left;" +!'''GIMP filter''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +!style="text-align: center;"|[https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! style="text-align: center;"| '''Test result''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +|Alien Map || {{yes|alien-map }} || {{yes}} || {{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +|Align Visible Layers || {{unknown| }} || {{unknown| }} || {{unknown|}}|| {{unknown|}} ||{{unknown|}}|| Doesn't need porting +|- +|Animation Playback || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Antialias || {{yes|antialias }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Apply Canvas || {{yes|texturize-canvas }} || {{wip}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}||texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +|Apply Lens || {{yes|apply-lens}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +|Assign Color Profile || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Autocrop Image || {{unknown| }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}||Done in core +|- +|Autocrop Layer || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Done in core +|- +|Border Average || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Bump Map || {{yes|bump-map }}|| {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Cartoon || {{wip|cartoon }} || {{wip}} || {{unknown|untested}} ||{{no}} ||{{unknown|untested}}|| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +|Channel Mixer || {{yes|channel-mixer }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Checkerboard || {{wip|checkerboard }} || {{wip}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Missing Psychobilly Option +|- +|CML Explorer || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Color Enhance || {{yes|color-enhance}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Color Exchange || {{yes|color-exchange}} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Color to Alpha || {{wip|color-to-alpha }} || {{wip}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| The pdb wrapper needs some more love (see comment in there) +|- +|Colorcube Analysis || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Compose || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +|Convert to Color Profile || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Convolution Matrix || {{wip|convolution-matrix }} || {{no}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +|Cubism || {{wip|cubism }} || {{wip}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| It doesn't honnor the GeglOperationAreaFilter class properly +|- +|Curve Bend || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Decompose || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +|Deinterlace || {{wip|deinterlace }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +|Depth Merge || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Despeckle || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Destripe || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Difference of Gaussians || {{wip|difference-of-gaussians }} || {{wip}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||The port is missing Normalize and Invert options +|- +|Diffraction Patterns || {{yes|diffraction-patterns }} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Dilate || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Provided by the value-propagate operation +|- +|Displace || {{yes|displace}} || {{yes}} ||{{unknown|untested}}|| {{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Drop Shadow || {{wip|dropshadow }} || {{wip}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Shadow effect only seen in transparent areas inside the layer bounds. +|- +|Edge-Detect (Edge...) || {{yes|edge}} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}|| +|- +|Edge-Detect (Laplace) || {{yes|edge-laplace}} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Edge-Detect (Neon) || {{unknown| }} || {{no}} ||{{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Edge-Detect (Sobel) || {{wip|edge-sobel}} || {{wip}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Emboss || {{wip|emboss }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Engrave || {{yes|engrave }} || {{yes}} ||{{unknown|untested}}|| {{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Erode || {{unknown| }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}||Provided by the value-propagate operation +|- +|Filmstrip || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Filterpack || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Flame || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Fractal Explorer || {{wip|fractal-explorer}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Fractal Trace || {{wip|fractal-trace}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|From Webpage|| {{unknown| }} || {{unknown| }} || {{unknown|untested}}||{{unknown| }} || {{unknown| }}||Doesn't need porting +|- +|Gaussian blur || {{wip|gaussian-blur}} || {{wip}} ||{{unknown|untested}}||{{wip}} || {{unknown|untested}}||https://bugzilla.gnome.org/show_bug.cgi?id=721396 +|- +|Gfig || {{unknown| }} || {{unknown| }} || {{unknown| }}||{{unknown| }} || {{unknown| }}||Doesn't need porting +|- +|GIMPressionist || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Glass Tile || {{yes|tile-glass }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Gradient Flare || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Gradient Map || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Ported as a gimp plug-in +|- +|Grey || {{wip|grey}} || {{no}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}||Similar to the Desaturation tool, but without its options +|- +|Grid || {{wip|grid }} || {{wip}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}||Missing intersection option, is it needed ? +|- +|Hot || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|IFS Fractal || {{unknown| }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Illusion || {{yes|illusion}} || {{yes}} || {{yes}}||{{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Image Map || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} || {{unknown|untested}}||Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +|Invert || {{wip|invert-gamma }} || {{no}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}||The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp || {{unknown| }} || {{unknown| }} || {{unknown| }}|| {{unknown| }} || {{unknown| }}||To be replaced with Warp Transform tool +|- +|Jigsaw || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Lens Distortion || {{yes|lens-distortion }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Lens Flare || {{yes|lens-flare }} || {{yes}} || {{yes}} ||{{no}} ||{{unknown|untested}}|| +|- +|Lighting Effects || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Make Seamless || {{yes|tile-seamless }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Maximum RGB || {{unknown| }} || {{unknown| }} || {{unknown| }}|| {{unknown| }} || {{unknown| }}||Will be removed without replacement +|- +|Maze || {{yes|maze}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Mosaic || {{wip|mosaic }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| The GEGL op tries to allocate the whole input. +|- +|Motion Blur (circular)|| {{wip|motion-blur-circular}} || {{yes}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Is allocating the whole input +|- +|Motion Blur (linear)|| {{wip|motion-blur-linear}} || {{yes}} || {{unknown|untested}} ||{{yes}} || {{unknown|untested}}||Is allocating the whole input +|- +|Motion Blur (zoom) || {{wip|motion-blur-zoom}} || {{yes}} || {{unknown|untested}} ||{{no}} || {{unknown|untested}}||Is allocating the whole input +|- +|Newsprint || {{yes|newsprint}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at https://pippin.gimp.org/spachrotyzer/ +|- +|NL Filter || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Noise (HSV Noise) || {{yes|noise-hsv}} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}||The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +|Noise (Hurl) || {{yes|noise-hurl }} || {{yes}} || {{yes}}||{{yes}} ||{{yes}}|| +|- +|Noise (Pick) || {{yes|noise-pick }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Noise (RGB Noise) || {{wip|noise-rgb }} || {{wip}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Noise (Slur) || {{yes|noise-slur}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Noise (Spread) || {{yes|noise-spread}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Normalize || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Provided by the stretch-contrast operation when "keep colors" is checked +|- +|Oilify || {{wip|oilify }} || {{wip}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Optimize (Difference) || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Optimize (for GIF) || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Pagecurl || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Palette Map || {{unknown| }} || {{yes}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Paper Tile || {{yes|tile-paper}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Photocopy || {{wip|photocopy }} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Pixelize || {{yes|pixelize }} || {{yes}} ||{{unknown|untested}}||{{yes}} || {{unknown|untested}}|| +|- +|Plasma || {{yes|plasma }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Polar Coordinates || {{wip|polar-coordinates}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Currently renders partially garbage +|- +|Qbist || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Rearrange Colormap || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Not to be confused with GEGL's 'remap' operation. +|- +|Recompose || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| See compose +|- +|Red Eye Removal || {{wip|red-eye-removal }} || {{wip}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Retinex || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Ripple || {{yes|ripple}} || {{yes}} || {{unknown|untested}}||{{no}} || {{unknown|untested}} || +|- +|Rotate Colors || {{wip|color-rotate}} || {{no}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Sample Colorize || {{unknown| }} || {{no}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Screenshot || {{unknown| }} || {{yes}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Selection to Path || {{unknown| }} || {{yes}} || {{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Selective Gaussian Blur || {{yes|gaussian-blur-selective }} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Set Colormap || {{unknown| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Not to be confused with GEGL's 'remap' operation. +|- +|Shift || {{yes|shift }} || {{yes}} || {{yes}}||{{no}} ||{{unknown|untested}}|| +|- +|Sinus || {{yes|sinus}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Smooth Palette || {{unknown| }} || {{wip}} ||{{unknown|untested}}|| {{yes}} ||{{unknown|untested}}|| See https://bugzilla.gnome.org/show_bug.cgi?id=774807 and https://bugzilla.gnome.org/show_bug.cgi?id=749220 +|- +|Softglow || {{wip|softglow }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +|Solid Noise || {{yes|noise-solid| }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Sparkle || {{wip|sparkle }} || {{wip}} || {{unknown|untested}}||{{wip}} ||{{unknown|untested}}||Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +|Sphere Designer || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Stretch Contrast || {{yes|stretch-contrast}} || {{yes}} || {{yes}}||{{yes}} || {{yes}}|| +|- +|Stretch HSV || {{yes|stretch-contrast-hsv}} || {{yes}} || {{yes}}||{{no}} ||{{unknown|untested}}|| +|- +|Supernova || {{yes|supernova}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Tile || {{yes|tile}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}||Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +|Unoptimize || {{unknown| }} || {{no}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Unsharp Mask || {{wip|unsharp-mask}} || {{wip}} ||{{unknown|untested}}|| {{no}} ||{{unknown|untested}}|| +|- +|Value Invert || {{wip|value-invert}} || {{wip}} ||{{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Value Propagate || {{yes|value-propagate }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Van Gogh (LIC) || {{unknown| }} || {{no}} || {{unknown|untested}}||{{no}} || {{unknown|untested}}||The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +|Video || {{yes|video-degradation }} || {{yes}} || {{unknown|untested}}||{{yes}} ||{{unknown|untested}}|| +|- +|Waves || {{wip|waves }} || {{wip}} ||{{unknown|untested}}|| {{no}} || {{unknown|untested}}||Missing reflective option that produce strange result, I suggest dropping that. +|- +|Whirl and Pinch || {{wip|whirl-pinch}} || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Wind || {{yes|wind }} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +|Zealous Crop || {{unknown|N/A}} || {{yes}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +== Display filters == + +{| class="wikitable sortable" style="text-align: left;" +!'''Display filter''' +!style="text-align: center;"|[https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! style="text-align: center;"| '''Test result''' +!style="text-align: center;"|[https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +| Color deficient vision|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Color management || {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Color proof|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Contrast|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|- +| Gamma|| {{wip}} || {{unknown|untested}}||{{no}} ||{{unknown|untested}}|| +|} + + += Port of new GEGL ops to OpenCL= + +{| class="wikitable sortable" style="text-align: left;" +!'''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! style="text-align: center;"| '''Test result''' +!'''Comment''' +|- +|Bilateral filter ||{{yes}} || {{unknown|untested}}|| +|- +|Box blur ||{{yes}} || {{unknown|untested}}|| +|- +|Box max || {{yes}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Box min || {{yes}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Box percentile || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Brightness and Contrast ||{{yes}} || {{unknown|untested}}|| +|- +|Buffer cache || {{no}} || {{unknown|untested}}||GEGL op is work in progress. Does this need an OpenCL port? +|- +|C2g ||{{yes}} || {{unknown|untested}}||HDR related +|- +|Cell Noise || {{yes}} || {{unknown|untested}}|| +|- +|Checkerboard || {{yes}} || {{unknown|untested}}|| +|- +|Cielch Noise || {{no}} || {{unknown|untested}}|| +|- +|Color || {{no}} || {{unknown|untested}}|| +|- +|Color Reduction || {{no}} || {{unknown|untested}}|| +|- +|Color Temperature ||{{yes}} || {{unknown|untested}}|| +|- +|Contrast Curve || {{wip}} || {{unknown|untested}}|| +|- +|Demosaic (bimedian) || {{no}} || {{unknown|untested}}|| GEGL op is work in progress. +|- +|Demosaic (simple) || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Disc percentile || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Display || {{no}} || {{unknown|untested}}||Does this need an OpenCL port? +|- +|Ditto || {{no}} || {{unknown|untested}}||GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +|Exp combine || {{no}} || {{unknown|untested}}||HDR related +|- +|Exposure || {{no}} || {{unknown|untested}}|| HDR related +|- +|Fattal02 || {{no}} || {{unknown|untested}}||HDR related +|- +|gluas || {{no}} || {{unknown|untested}}||GEGL op is work in progress. Does this need an OpenCL port? +|- +|Gnomonic projection || {{no}} || {{unknown|untested}} +|- +|HStack || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Hue-Chroma || {{yes}} || {{unknown|untested}}|| +|- +|Image compare || {{no}} ||{{unknown|untested}}|| +|- +|Ink simulator || {{no}} ||{{unknown|untested}}|| +|- +|Introspect || {{no}} || {{unknown|untested}}||Does this need an OpenCL port? +|- +|Kuwahara || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Lens correction || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Line profile || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Linear gradient || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Mandelbrot || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Mantiuk06 || {{no}} || {{unknown|untested}}||HDR related +|- +|Mirrors || {{no}} || {{unknown|untested}}|| +|- +|Mono mixer ||{{yes}} || {{unknown|untested}}|| +|- +|Noise || {{no}} || {{unknown|untested}}||Perlin noise generator +|- +|Noise Reduction ||{{yes}} || {{unknown|untested}}|| +|- +|Over || {{no}} || {{unknown|untested}}||Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +|Radial gradient || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Reinhard05 ||{{yes}} || {{unknown|untested}}||HDR related +|- +|Remap || {{no}} || {{unknown|untested}}|| +|- +|Shadows-Highlights ||{{yes}} || {{unknown|untested}}|| +|- +|SNN (mean) ||{{yes}} || {{unknown|untested}}|| +|- +|SNN (percentile) || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Stereographic projection || {{no}} || {{unknown|untested}} +|- +|SVG Hue rotate|| {{no}} || {{unknown|untested}}|| +|- +|SVG Luminance to Alpha || {{no}} || {{unknown|untested}}|| +|- +|SVG Matrix || {{no}} || {{unknown|untested}}|| +|- +|SVG Saturate || {{no}} || {{unknown|untested}}|| +|- +|Unpremul || {{no}} || {{unknown|untested}}||GEGL op is work in progress. +|- +|Vignette ||{{yes}} || {{unknown|untested}}|| +|- +|Weighted Blend || {{yes}} || {{unknown|untested}}|| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20210818145443-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20210818145443-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20210818145443-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Porting_filters_to_GEGL-20220205071048-show.txt b/wiki/Hacking:Porting_filters_to_GEGL-20220205071048-show.txt new file mode 100644 index 0000000..48cd9e8 --- /dev/null +++ b/wiki/Hacking:Porting_filters_to_GEGL-20220205071048-show.txt @@ -0,0 +1,516 @@ + + +Last updated: see tab 'history' + + +__TOC__ + +=How to port= + +==GEGL part== + +This is the general process for writing a new GEGL operation: + + +# Gather information: +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +## Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +## Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +## Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +## You may wish to find a similar existing operation and get inspiration from it. +# Go over the source code of the plugin you wish to port. Understand the algorithm it implements. +# Read the [http://gegl.org/ GEGL website] carefully. There is lot of information there. +# Read the [http://gegl.org/babl/ babl website]. Understand the differences between color models. +# You may wish to find a similar existing operation and get inspiration from it. +# Choose a [http://gegl.org/#_operation_api base class]. This is the general structure of your operation, the number of inputs and outputs, and what kind of optimizations GEGL can do. +# Create a new file for your operation. The exact directory where you should put your file into is explained at [http://www.gegl.org/#_directory_overview GEGL's website]. +# Register the operation in Makefile.am. Exactly how this is done depends on which directory you're placing your files into. For operations in operations/common/ (should be most operations), you need to add a single line mentioning your operation to the variable op_LTLIBRARIES. For example, if your c file is named edge.c, you would add a line that says "edge.la \". Please keep it in alphabetical order. +# Copy another operation with the same base class and clean it up to have your operation skeleton. GEGL uses a macro system called [https://git.gnome.org/browse/gegl/plain/gegl/gegl-chant.h GEGL chant]. It makes it unnecessary for you to write all the GObject boilerplate, and eases your work registering parameters for your operation. Look at other operations to see how it works. +# Use the '''prepare function''' to specify which color model your op will operate with for each input/output. +# Create your operation's parameters using the chant system. You can have integer, floats, string, color, curve, enum ... There are some predefined [https://git.gnome.org/browse/gegl/plain/gegl/gegl-enums.h enums] in the GEGL core, for instance '''GeglSamplerType'''. You can register your own like in the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple op]. +# Write your operation in the '''process function'''. Here are some hints: +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +## GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +## '''ROI''' means region of interest. It's the area you are currently working on. +## Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +## Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +## If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# GEGL stores data in tiles. This imposes some restrictions, especially for transform operations. You usually need to write your algorithm backwards, i.e. iterate over the output, compute where the data come from, and use a sampler to get it and affect the output. +# '''ROI''' means region of interest. It's the area you are currently working on. +# Sometimes you need to know the size of the full input, not just the ROI. You can have it using '''gegl_operation_source_get_bounding_box'''. +# Rather than carrying a lot of parameters in your various functions, you can register a custom aggregate structure in the chant system, like the '''WarpPrivate''' structure in the [https://git.gnome.org/browse/gegl/plain/operations/common/warp.c Warp operation]. +# If you fetch data from outside of the input buffer (in its '''abyss'''), you get zeroed memory by default. The abyss policy allows you to chose what you want here. In particular you can choose to clamp to the border, loop in the buffer extent, or it allows you to implement a more intelligent algorithm. For instance see the [https://git.gnome.org/browse/gegl/plain/operations/common/ripple.c Ripple operation]. Setting the abyss policy to '''GEGL_ABYSS_LOOP''' adds the tileability to the operation for free. +# Test your operation. You can use the GEGL binary to run an XML file or use the GEGL tool in GIMP. + +==GIMP part== + +'''Alternative 1:''' +Use a GeglBuffer to work on. For instance see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-aa.c /plug-ins/common/file-aa.c]. + +'''Alternative 2:''' +In your program, create a GEGL graph and let it call gegl_node_process on it. See the column 'GEGL operation' below to see what has already been done in GEGL. For instance, see [https://git.gnome.org/browse/gimp/tree/plug-ins/common/file-gegl.c /plug-ins/common/file-gegl.c]. + +For more inspiration, see the other files that have already been ported. + + +=Porting matrix= + +'''Legend''' +__Columns 'GEGL port', 'OpenCL version':__ + +{| class="wikitable" +|- +! +|- +| | completely unimplemented yet +|- +| | implementation unfinished +|- +| | implementation finished, no matter of the test results +|- +| | doesn't need porting +|} + + +__Columns 'Test result':__ + +{| class="wikitable" +|- +! +|- +| | tests failed (please also describe the failure shortly + +in the comment field or link to a Bugzilla bug report) + +|- +| | tests unfinished +|- +| | tests ok +|- +| | not tested at all yet +|} + + +You can sort the following tables by clicking the little arrow symbol in the column headers. If that doesn't work out of the box, please activate Javascript for this page. + + + + + +==GIMP core (Layer modes, Transformation and Color Adjustment Tools)== + +The GIMP core is already migrated to GEGL. See [http://gimpfoo.de/2012/04/17/goat-invasion-in-gimp/ Michael Natterers blogposting] and an [http://libregraphicsworld.org/blog/entry/gimp-2.8-released-next-version-to-get-high-bit-depth-precision article at libgregraphicsworld.org]. + + +==Processing, color grading and effects== + +{| class="wikitable" +|- +! '''GIMP filter''' +! [https://git.gnome.org/browse/gegl/log/operations '''GEGL operation'''] +! [https://git.gnome.org/browse/gimp/log/plug-ins '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Alien Map | alien-map | Yes | untested| Yes | untested| +|- +| Align Visible Layers | | | | | | Doesn't need porting +|- +| Animation Playback | | Yes | untested| No | untested| +|- +| Antialias | antialias | Yes | untested| No | untested| +|- +| Apply Canvas | texturize-canvas | work in progress | untested| Yes | untested| texturize-canvas should be more generic and allow any input texture instead of the hard-coded one only. +|- +| Apply Lens | apply-lens | Yes | untested| No | untested| get_required_for_output and get_invalidated_by_change methods need a better implementation +|- +| Assign Color Profile | | No | untested| No | untested| +|- +| Autocrop Image | | Yes | untested| No | untested| Done in core +|- +| Autocrop Layer | | Yes | untested| No | untested| Done in core +|- +| Border Average | | Yes | untested| No | untested| +|- +| Bump Map | bump-map | Yes | untested| No | untested| +|- +| Cartoon | cartoon | work in progress | untested | No | untested| Result is a bit different compared to original plugin, because it uses another color format to proceed (Y'CbCr instead of HSL) +|- +| Channel Mixer | channel-mixer | Yes | untested| No | untested| +|- +| Checkerboard | checkerboard | work in progress | untested | No | untested| Missing Psychobilly Option +|- +| CML Explorer | | No | untested| No | untested| +|- +| Color Enhance | color-enhance | Yes | untested| No | untested| +|- +| Color Exchange | color-exchange | Yes | untested| Yes | untested| +|- +| Color to Alpha | color-to-alpha | work in progress | untested| Yes | untested| The pdb wrapper needs some more love (see comment in there) +|- +| Colorcube Analysis | | No | untested| No | untested| +|- +| Compose | | Yes | untested| No | untested| Compatibility with 2.8 is currently not maintained : An image decomposed in 2.8 won't be recomposed correctly in 2.10. Also it's inconsistent with gimp's gamma policy. Nobody know who is right currently. +|- +| Convert to Color Profile | | No | untested| No | untested| +|- +| Convolution Matrix | convolution-matrix | No | untested| No | untested| Not sure the wip GEGL operation is the right approach for that op. Shouldn't that matrix be given as an aux input, instead of the chant property ? +|- +| Cubism | cubism | work in progress | untested| No | untested| It doesn't honnor the GeglOperationAreaFilter class properly +|- +| Curve Bend | | No | untested| No | untested| +|- +| Decompose | | Yes | untested| No | untested| inconsistent with gimp's gamma policy currently. Nobody know who is right currently. See also Compose +|- +| Deinterlace | deinterlace | work in progress | untested| No | untested| The current GEGL implementation is wrong (just try it on a black/white 1px grid), and not sure what the parameter size is for... +|- +| Depth Merge | | No | untested| No | untested| +|- +| Despeckle | | No | untested| No | untested| +|- +| Destripe | | No | untested| No | untested| +|- +| Difference of Gaussians | difference-of-gaussians | work in progress | untested | No | untested| The port is missing Normalize and Invert options +|- +| Diffraction Patterns | diffraction-patterns | Yes | untested| Yes | untested| +|- +| Dilate | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Displace | displace | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Drop Shadow | dropshadow | work in progress | untested | No | untested| Shadow effect only seen in transparent areas inside the layer bounds. +|- +| Edge-Detect (Edge...) | edge | Yes | untested| No | untested| +|- +| Edge-Detect (Laplace) | edge-laplace | Yes | untested| Yes | untested| +|- +| Edge-Detect (Neon) | | No | untested| No | untested| +|- +| Edge-Detect (Sobel) | edge-sobel | work in progress | untested| Yes | untested| +|- +| Emboss | emboss | work in progress | untested| No | untested| +|- +| Engrave | engrave | Yes | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Erode | | Yes | untested| No | untested| Provided by the value-propagate operation +|- +| Filmstrip | | No | untested| No | untested| +|- +| Filterpack | | No | untested| No | untested| +|- +| Flame | | No | untested| No | untested| +|- +| Fractal Explorer | fractal-explorer | work in progress | untested| No | untested| +|- +| Fractal Trace | fractal-trace | work in progress | untested| No | untested| +|- +| From Webpage| | | untested| | | Doesn't need porting +|- +| Gaussian blur | gaussian-blur | work in progress | untested| work in progress | untested| [https://bugzilla.gnome.org/show_bug.cgi?id=721396 https://bugzilla.gnome.org/show_bug.cgi?id=721396] +|- +| Gfig | | | | | | Doesn't need porting +|- +| GIMPressionist | | No | untested| No | untested| +|- +| Glass Tile | tile-glass | Yes | untested| No | untested| +|- +| Gradient Flare | | No | untested| No | untested| +|- +| Gradient Map | | Yes | untested| No | untested| Ported as a gimp plug-in +|- +| Grey | grey | No | untested| Yes | untested| Similar to the Desaturation tool, but without its options +|- +| Grid | grid | work in progress | untested| No | untested| Missing intersection option, is it needed ? +|- +| Hot | | No | untested| No | untested| +|- +| IFS Fractal | | work in progress | untested| No | untested| +|- +| Illusion | illusion | Yes | Yes| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Image Map | | No | untested| No | untested| Deprecated code has to be ported to gegl (GimpDrawable, GimpPixelRgn, ...) +|- +| Invert | invert-gamma | No | untested| Yes | untested| The pdb documentation needs to be updated. Apart from that it's done. +|- +| iWarp | | | | | | To be replaced with Warp Transform tool +|- +| Jigsaw | | No | untested| No | untested| +|- +| Lens Distortion | lens-distortion | Yes | untested| No | untested| +|- +| Lens Flare | lens-flare | Yes | Yes | No | untested| +|- +| Lighting Effects | | No | untested| No | untested| +|- +| Make Seamless | tile-seamless | Yes | untested| No | untested| +|- +| Maximum RGB | | | | | | Will be removed without replacement +|- +| Maze | maze | Yes | untested| No | untested| +|- +| Mosaic | mosaic | Yes | untested| No | untested| The GEGL op tries to allocate the whole input. +|- +| Motion Blur (circular)| motion-blur-circular | Yes | untested | No | untested| Is allocating the whole input +|- +| Motion Blur (linear)| motion-blur-linear | Yes | untested | Yes | untested| Is allocating the whole input +|- +| Motion Blur (zoom) | motion-blur-zoom | Yes | untested | No | untested| Is allocating the whole input +|- +| Newsprint | newsprint | Yes | untested| No | untested| Reimplementation of scratch of most of the functionality of GIMP's newsprint plug-in with additional color based modulation of halftoned results. More documentation/exampels of this op will appear at [https://pippin.gimp.org/spachrotyzer/ https://pippin.gimp.org/spachrotyzer/] +|- +| NL Filter | | No | untested| No | untested| +|- +| Noise (HSV Noise) | noise-hsv | Yes | untested| Yes | untested| The GEGL implementation is not strictly identical to the legacy one, but similar enough... +|- +| Noise (Hurl) | noise-hurl | Yes | Yes| Yes | Yes| +|- +| Noise (Pick) | noise-pick | Yes | untested| No | untested| +|- +| Noise (RGB Noise) | noise-rgb | work in progress | untested| No | untested| +|- +| Noise (Slur) | noise-slur | Yes | untested| No | untested| +|- +| Noise (Spread) | noise-spread | work in progress | untested| No | untested| +|- +| Normalize | | Yes | untested| No | untested| Provided by the stretch-contrast operation when "keep colors" is checked +|- +| Oilify | oilify | work in progress | untested| Yes | untested| +|- +| Optimize (Difference) | | No | untested| No | untested| +|- +| Optimize (for GIF) | | No | untested| No | untested| +|- +| Pagecurl | | No | untested| No | untested| +|- +| Palette Map | | Yes | untested| No | untested| +|- +| Paper Tile | tile-paper | Yes | untested| No | untested| +|- +| Photocopy | photocopy | work in progress | untested| No | untested| +|- +| Pixelize | pixelize | Yes | untested| Yes | untested| +|- +| Plasma | plasma | Yes | untested| No | untested| +|- +| Polar Coordinates | polar-coordinates | work in progress | untested| No | untested| Currently renders partially garbage +|- +| Qbist | | No | untested| No | untested| +|- +| Rearrange Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Recompose | | Yes | untested| No | untested| See compose +|- +| Red Eye Removal | red-eye-removal | work in progress | untested| Yes | untested| +|- +| Retinex | | No | untested| No | untested| +|- +| Ripple | ripple | Yes | untested| No | untested | +|- +| Rotate Colors | color-rotate | No | untested| No | untested| +|- +| Sample Colorize | | No | untested| No | untested| +|- +| Screenshot | | Yes | untested| No | untested| +|- +| Selection to Path | | Yes | untested| No | untested| +|- +| Selective Gaussian Blur | gaussian-blur-selective | Yes | untested| Yes | untested| +|- +| Set Colormap | | Yes | untested| No | untested| Not to be confused with GEGL's 'remap' operation. +|- +| Shift | shift | Yes | Yes| No | untested| +|- +| Sinus | sinus | Yes | untested| No | untested| +|- +| Smooth Palette | | work in progress | untested| Yes | untested| See [https://bugzilla.gnome.org/show_bug.cgi?id=774807 https://bugzilla.gnome.org/show_bug.cgi?id=774807] and [https://bugzilla.gnome.org/show_bug.cgi?id=749220 https://bugzilla.gnome.org/show_bug.cgi?id=749220] +|- +| Softglow | softglow | Yes | untested| No | untested| Also it uses a different intensity function (Y' instead of (max(R', G', B') + min (R', G', B')) / 2). I suggest the new behaviour is better. +|- +| Solid Noise | noise-solid | Yes | untested| No | untested| +|- +| Sparkle | sparkle | work in progress | untested| work in progress | untested| Is currently being ported by some students as an university project focused on OpenCL. Results can be expected in 2015. +|- +| Sphere Designer | | No | untested| No | untested| +|- +| Stretch Contrast | stretch-contrast | Yes | Yes| Yes | Yes| +|- +| Stretch HSV | stretch-contrast-hsv | Yes | Yes| No | untested| +|- +| Supernova | supernova | Yes | untested| No | untested| +|- +| Tile | tile | Yes | untested| No | untested| Kept as a gimp plug-in to resize drawables or create new image ; use gegl:tile operation internally. +|- +| Unoptimize | | No | untested| No | untested| +|- +| Unsharp Mask | unsharp-mask | work in progress | untested| No | untested| +|- +| Value Invert | value-invert | work in progress | untested| Yes | untested| +|- +| Value Propagate | value-propagate | Yes | untested| No | untested| +|- +| Van Gogh (LIC) | | No | untested| No | untested| The filter has nothing to do with van-Gogh-style art and has no obvious function. We should remove it. +|- +| Video | video-degradation | Yes | untested| Yes | untested| +|- +| Waves | waves | work in progress | untested| No | untested| Missing reflective option that produce strange result, I suggest dropping that. +|- +| Whirl and Pinch | whirl-pinch | work in progress | untested| No | untested| +|- +| Wind | wind | Yes | untested| No | untested| +|- +| Zealous Crop | N/A | Yes | untested| No | untested| Zealous Crop can't be performed as a GEGL operation because get_bounding_box depends on the image content. It was ported as a gimp plugin instead. +|} + +==Display filters== + +{| class="wikitable" +|- +! '''Display filter''' +! [https://git.gnome.org/browse/gimp/log/modules '''GEGL port'''] +! '''Test result''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Color deficient vision| work in progress | untested| No | untested| +|- +| Color management | work in progress | untested| No | untested| +|- +| Color proof| work in progress | untested| No | untested| +|- +| Contrast| work in progress | untested| No | untested| +|- +| Gamma| work in progress | untested| No | untested| +|} + + + + +=Port of new GEGL ops to OpenCL= + +{| class="wikitable" +|- +! '''GEGL operation''' +! [https://git.gnome.org/browse/gegl/log/opencl '''OpenCL version'''] +! '''Test result''' +! '''Comment''' +|- +| Bilateral filter | Yes | untested| +|- +| Box blur | Yes | untested| +|- +| Box max | Yes | untested| GEGL op is work in progress. +|- +| Box min | Yes | untested| GEGL op is work in progress. +|- +| Box percentile | No | untested| GEGL op is work in progress. +|- +| Brightness and Contrast | Yes | untested| +|- +| Buffer cache | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| C2g | Yes | untested| HDR related +|- +| Cell Noise | Yes | untested| +|- +| Checkerboard | Yes | untested| +|- +| Cielch Noise | No | untested| +|- +| Color | No | untested| +|- +| Color Reduction | No | untested| +|- +| Color Temperature | Yes | untested| +|- +| Contrast Curve | work in progress | untested| +|- +| Demosaic (bimedian) | No | untested| GEGL op is work in progress. +|- +| Demosaic (simple) | No | untested| GEGL op is work in progress. +|- +| Disc percentile | No | untested| GEGL op is work in progress. +|- +| Display | No | untested| Does this need an OpenCL port? +|- +| Ditto | No | untested| GEGL op is work in progress. Test op - does this need an OpenCL port? +|- +| Exp combine | No | untested| HDR related +|- +| Exposure | No | untested| HDR related +|- +| Fattal02 | No | untested| HDR related +|- +| gluas | No | untested| GEGL op is work in progress. Does this need an OpenCL port? +|- +| Gnomonic projection | No | untested +|- +| HStack | No | untested| GEGL op is work in progress. +|- +| Hue-Chroma | Yes | untested| +|- +| Image compare | No | untested| +|- +| Ink simulator | No | untested| +|- +| Introspect | No | untested| Does this need an OpenCL port? +|- +| Kuwahara | No | untested| GEGL op is work in progress. +|- +| Lens correction | No | untested| GEGL op is work in progress. +|- +| Line profile | No | untested| GEGL op is work in progress. +|- +| Linear gradient | No | untested| GEGL op is work in progress. +|- +| Mandelbrot | No | untested| GEGL op is work in progress. +|- +| Mantiuk06 | No | untested| HDR related +|- +| Mirrors | No | untested| +|- +| Mono mixer | Yes | untested| +|- +| Noise | No | untested| Perlin noise generator +|- +| Noise Reduction | Yes | untested| +|- +| Over | No | untested| Porter Duff operation over (d = cA + cB * (1 - aA)) +|- +| Radial gradient | No | untested| GEGL op is work in progress. +|- +| Reinhard05 | Yes | untested| HDR related +|- +| Remap | No | untested| +|- +| Shadows-Highlights | Yes | untested| +|- +| SNN (mean) | Yes | untested| +|- +| SNN (percentile) | No | untested| GEGL op is work in progress. +|- +| Stereographic projection | No | untested +|- +| SVG Hue rotate| No | untested| +|- +| SVG Luminance to Alpha | No | untested| +|- +| SVG Matrix | No | untested| +|- +| SVG Saturate | No | untested| +|- +| Unpremul | No | untested| GEGL op is work in progress. +|- +| Vignette | Yes | untested| +|- +| Weighted Blend | Yes | untested| +|} diff --git a/wiki/Hacking:Problems_and_solutions-20150212064210-show.txt b/wiki/Hacking:Problems_and_solutions-20150212064210-show.txt new file mode 100644 index 0000000..d66e16f --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20150212064210-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [http://eclipse.org/egit/support/ Eclipse EGit support site] +* [http://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [http://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://git-scm.com/community Git community support] +* [http://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + + + + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20150905105223-show.txt b/wiki/Hacking:Problems_and_solutions-20150905105223-show.txt new file mode 100644 index 0000000..d66e16f --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20150905105223-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [http://eclipse.org/egit/support/ Eclipse EGit support site] +* [http://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [http://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://git-scm.com/community Git community support] +* [http://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + + + + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20151008021106-show.txt b/wiki/Hacking:Problems_and_solutions-20151008021106-show.txt new file mode 100644 index 0000000..d66e16f --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20151008021106-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [http://eclipse.org/egit/support/ Eclipse EGit support site] +* [http://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [http://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://git-scm.com/community Git community support] +* [http://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + + + + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20160111063721-show.txt b/wiki/Hacking:Problems_and_solutions-20160111063721-show.txt new file mode 100644 index 0000000..d66e16f --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20160111063721-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [http://eclipse.org/egit/support/ Eclipse EGit support site] +* [http://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [http://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://git-scm.com/community Git community support] +* [http://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + + + + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20160630081500-show.txt b/wiki/Hacking:Problems_and_solutions-20160630081500-show.txt new file mode 100644 index 0000000..e9452c1 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20160630081500-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20161007061623-show.txt b/wiki/Hacking:Problems_and_solutions-20161007061623-show.txt new file mode 100644 index 0000000..e9452c1 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20161007061623-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20161107214435-show.txt b/wiki/Hacking:Problems_and_solutions-20161107214435-show.txt new file mode 100644 index 0000000..e9452c1 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20161107214435-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20161126033518-show.txt b/wiki/Hacking:Problems_and_solutions-20161126033518-show.txt new file mode 100644 index 0000000..e9452c1 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20161126033518-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20170710222754-show.txt b/wiki/Hacking:Problems_and_solutions-20170710222754-show.txt new file mode 100644 index 0000000..e9452c1 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20170710222754-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20190507091739-show.txt b/wiki/Hacking:Problems_and_solutions-20190507091739-show.txt new file mode 100644 index 0000000..e9452c1 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20190507091739-show.txt @@ -0,0 +1,980 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + + + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20200126023318-show.txt b/wiki/Hacking:Problems_and_solutions-20200126023318-show.txt new file mode 100644 index 0000000..a3f2a6c --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20200126023318-show.txt @@ -0,0 +1,1083 @@ + + +This page describes problems that hamper the developers work and their solution. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Libraries versions too low==== + +I’m getting an error about a too low of GTK+/GLib while compiling XXX + +You can either update your version of GTK+/GLib using your system’s package manager, or compile GTK+/GLib from source! Compiling these is done exactly like we compiled babl – download the source (either the latest from Git, or a package from the official site), compile and install. You may also need to do something like this to a library called ATK. + + + + + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + +====Absolute DESTDIR required==== + +If you have weird errors at installation, they may be due to DESTDIR being a relative path. + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + + + + +====Configure fails with a syntax error near unexpected token `x11,'==== + +'''Problem: configure fails with a message about a syntax error but there's no obvious syntax error.''' + +Example: + +
    +./configure: line 22865: syntax error near unexpected token `x11,'
    +./configure: line 22865: `GTK_CHECK_BACKEND(x11, gtk_required_version,'
    +
    +'''Cause:''' +You're missing /usr/share/aclocal/gtk-3.0.m4, which is part of the GTK3 development package. + +'''Solution:''' +Make sure you have libgtk-3-0 installed, including any associated -dev or -devel package. + + + + + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message: + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. You might have GEGL master installed in your GIMP prefix, but however GIMP fails to find it. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + +==Runtime Errors== + +Warnings and errors displayed in a terminal/console in which you started GIMP from a command line. + +Most are just annoyances, unless you are watching the terminal for severe errors from code you are testing. + + + + + +====Chain of python exceptions beginning with gi.RepositoryError: Typelib file for namespace 'Gegl', version '0.4' not found==== + +'''Problem:''' +On startup, GIMP starts but shows a long chain of Python exceptions. The root exception (the first in the list) is as above. Affects loading of plugins. + +'''Cause:''' +Python is using GLib introspection, but can't find the typelibs for GIMP. Typelibs are in a directory named girepository-1.0. The GIMP typelib is named like "Gimp-3.0.typelib". + +'''Solution:''' +Define environment variable GI_TYPELIB_PATH. For example, export GI_TYPELIB_PATH=/usr/local/lib/x86_64-linux-gnu/girepository-1.0:/usr/local/lib/girepository-1.0 . The example is for Ubuntu 19.10. You may want to change the prefix of the paths, for example using the GIMP_PREFIX environment variable (if you use it.) + +The typelibs for GIMP, Gegl, and Babl might be on different paths (as in the example.) + + + + + +====Gtk-Message: 19:04:46.797: Failed to load module "canberra-gtk-module"==== + +'''Problem:''' +Terminal often displays message like above. Does not affect operation, except sounds may be missing? + +'''Cause:''' +Package libcanberra-gtk3-module is missing. + +'''Solution:''' +Install missing package, for example: sudo apt-get install libcanberra-gtk3-module + + + + + +====(gimp-2.99:4): dbind-WARNING **: 09:35:43.023: Couldn't register with accessibility bus:==== + +'''Problem:''' +Terminal often shows message like above. Does not affect operation, unless you need accessibility i.e. are visually or hearing impaired. + +'''Cause:''' +Seems to be a long-standing bug in Linux distributions. + +'''Solution:''' +In your environment, export NO_AT_BRIDGE=1 + + + + + +====luajit: ...mp/2.99/plug-ins/goat-exercise-lua/goat-exercise-lua.lua:22: module 'lgi' not found:==== + +'''Problem:''' +On startup, terminal shows a message that begins like above and ends with "GIMP-WARNING: gimp-2.99: gimp_wire_read(): error". +Affects loading of lua language plugins. +In the development branch of GIMP, a set of "goat-exercise-foo" plugins exercise some GObject Introspection language bindings (C, Python, Lua, JS, Scheme, Perl ?) + +'''Cause:''' +Package lua-lgi is missing. + +'''Solution:''' +Install the package. + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20210125182122-show.txt b/wiki/Hacking:Problems_and_solutions-20210125182122-show.txt new file mode 100644 index 0000000..af49679 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20210125182122-show.txt @@ -0,0 +1,1242 @@ + + +This page describes problems/solutions that hamper GIMP developers. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Libraries versions too low==== + +I’m getting an error about a too low of GTK+/GLib while compiling XXX + +You can either update your version of GTK+/GLib using your system’s package manager, or compile GTK+/GLib from source! Compiling these is done exactly like we compiled babl – download the source (either the latest from Git, or a package from the official site), compile and install. You may also need to do something like this to a library called ATK. + + + + + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + +====Absolute DESTDIR required==== + +If you have weird errors at installation, they may be due to DESTDIR being a relative path. + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + + + + +====Building development GIMP 2.99 breaks for missing dependency gegl-0.4 > 0.4.xx==== + +'''Problem: Building the development version of GIMP (2.99) fails with a message that the dependency gegl-0.4 > 0.4.xx is not met.''' +'''Cause:''' + +To build the development version of GIMP (2.99) often requires the development version (bleeding edge) GEGL. In other words, the GIMP unstable version can depend on the GEGL unstable version. + +Cloning the GEGL repository will get the development version of GEGL. (But the latest commit may not be tagged yet in the repository, so you can't ask git for the tagged commit. The meson.build file in the repository will usually show the *next* version that gegl.org will soon tag and release as stable.) + +Tagged versions of GEGL are captured by gimp.org in a tarball at [https://download.gimp.org/pub/gegl/0.4/ https://download.gimp.org/pub/gegl/0.4/], but not always the unstable, development version that a build of unstable GIMP requires. + +'''Solution:''' + +After you have downloaded, built, and installed gegl, to check the installed version, run: + + + +
    pkg-config gegl-0.4 --modversion
    +
    + + + + + + +====Configure fails with a syntax error near unexpected token `x11,'==== + +'''Problem: configure fails with a message about a syntax error but there's no obvious syntax error.''' + +Example: + +
    +./configure: line 22865: syntax error near unexpected token `x11,'
    +./configure: line 22865: `GTK_CHECK_BACKEND(x11, gtk_required_version,'
    +
    +'''Cause:''' +You're missing /usr/share/aclocal/gtk-3.0.m4, which is part of the GTK3 development package. + +'''Solution:''' +Make sure you have libgtk-3-0 installed, including any associated -dev or -devel package. + + + + + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message (or similar, the name might be other than "alien-map") + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. Or you have GEGL master installed in your GIMP prefix, but GIMP fails to find it. +Master means the latest version of the branch named "master" in the GEGL repository. In other words, the GIMP project "tracks" the GEGL project. + +The GEGL version changes. As of this writing, GIMP 2.99 uses gegl-0.4, but that may change in the future. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + +Details: at startup, GIMP checks the GEGL library for the presence of a certain set of GEGL operations. +The operations are present as string literals in the binary. You can test whether your GEGL library contains an operation using e.g.: + +'''grep -R "gegl:alien-map" /usr/local/lib/gegl-04''' + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +====Meson build yields error message: 'meson.build:1:0: ERROR: Value never is not boolean (true or false).'==== + +'''Problem:''' +As above, or 'Value always is not boolean' + +'''Cause:''' + +You have used 'never' or 'always' in the build options of the meson command e.g. '-Djavascript=never' + +'''Solution:''' + +Use 'true' or 'false'. Since about mid 2020. + + + + + +====build configure step stops: missing gtk-encode-symbolic-svg==== + +'''Problem:''' +The executable tool gtk-encode-symbolic-svg could not be found. + + + +'''Cause:''' + +You have not installed the package containing the tool. + +'''Solution:''' + +Use tools provided by your distribution to find which package contains gtk-encode-symbolic-svg, and install that package. +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg is in Ubuntu package libgtk-3-bin. +Formerly in Ubuntu package gtk-3-examples. + + + + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + +==Runtime Errors== + +Warnings and errors displayed in a terminal/console in which you started GIMP from a command line. + +Many are just clutter, that make it hard to find severe errors from code you are testing. + + + + + +===='GEGL-Message: 14:09:17.687: Module '/usr/local/lib/x86_64-linux-gnu/libgegl-npd-0.4.so' load error: Missing gegl_module_query() symbol ?'==== + +'''Problem:''' +GIMP starts, but the terminal displays many messages similar to the above, when plugins are loaded. +It is not clear whether these messages affect functioning, they might just be annoying warnings. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building'. The environment variable GEGL_PATH must reference the top gegl directory, not just its parent. +Referencing the parent is sufficient for GIMP to start, but not for plugins to load without these warnings. + + + + + +====GIMP fails to start with error, 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP starts fails to start, with the message above. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building' + + + + + +====A plugin fails to appear in the menus, with error like "GIMP-WARNING: gimp-2.xx: gimp_wire_read(): error"==== + +'''Problem:''' +GIMP starts, but a plugin does not appear in the GIMP menus as expected, and the terminal shows the above message. + +'''Cause:''' +At startup, GIMP searches certain directories for plugins (executables and interpretable text files) and "queries" them. +This means it starts them in a separate process and then communicates with them over a 'wire' i.e. interprocess communication. +If the plugin crashes or fails to respond, Gimp gives the error above. +You probably installed a plugin that is fatally flawed. + +'''Solution:''' +Remove the plugin. To see which plugin to remove, start Gimp with the '--verbose' flag, and it will print the pathname of plugin files as it queries them. + +To debug the flawed plugin, you can use print statements. + +An interpreted plugin may fail very early in its text, for example in the hashbang i.e. '#!/usr/bin/env python' statement on the first line, +or in an import statement. + + + + + +====Chain of python exceptions beginning with gi.RepositoryError: Typelib file for namespace 'Gegl', version '0.4' not found==== + +'''Problem:''' +On startup, GIMP starts but shows a long chain of Python exceptions. The root exception (the first in the list) is as above. Affects loading of plugins. + +'''Cause:''' +Python is using GLib introspection, but can't find the typelibs for GIMP. Typelibs are in a directory named girepository-1.0. The GIMP typelib is named like "Gimp-3.0.typelib". + +'''Solution:''' +Define environment variable GI_TYPELIB_PATH. For example, export GI_TYPELIB_PATH=/usr/local/lib/x86_64-linux-gnu/girepository-1.0:/usr/local/lib/girepository-1.0 . The example is for Ubuntu 19.10. You may want to change the prefix of the paths, for example using the GIMP_PREFIX environment variable (if you use it.) + +The typelibs for GIMP, Gegl, and Babl might be on different paths (as in the example.) + + + + + +====Gtk-Message: 19:04:46.797: Failed to load module "canberra-gtk-module"==== + +'''Problem:''' +Terminal often displays message like above. Does not affect operation, except sounds may be missing? + +'''Cause:''' +Package libcanberra-gtk3-module is missing. + +'''Solution:''' +Install missing package, for example: sudo apt-get install libcanberra-gtk3-module + + + + + +====(gimp-2.99:xx): dbind-WARNING **: 09:35:43.023: Couldn't register with accessibility bus:==== + +'''Problem:''' +Terminal often shows message like above. Does not affect operation, unless you need accessibility i.e. are visually or hearing impaired. + +'''Cause:''' +Seems to be a long-standing bug in Linux distributions. + +'''Solution:''' +In your environment, export NO_AT_BRIDGE=1 + + + + + +====luajit: ...mp/2.99/plug-ins/goat-exercise-lua/goat-exercise-lua.lua:22: module 'lgi' not found:==== + +'''Problem:''' +On startup, terminal shows a message that begins like above and ends with "GIMP-WARNING: gimp-2.99: gimp_wire_read(): error". +Affects loading of lua language plugins. +In the development branch of GIMP, a set of "goat-exercise-foo" plugins exercise some GObject Introspection language bindings (C, Python, Lua, JS, Scheme, Perl ?) + +'''Cause:''' +Package lua-lgi is missing. + +'''Solution:''' +Install the package. + + + + + +====On Ubuntu: Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Icon 'image-missing' not present in theme Symbolic (gtk-icon-theme-error-quark, 0==== + +'''Problem:''' +On Ubuntu (only?), when using a plugin that opens a Gtk3 file chooser widget, terminal shows a message as above, and plugin crashes. + +'''Cause:''' +Package gnome-icon-theme is missing. See [https://gitlab.gnome.org/GNOME/gimp/-/issues/2029 https://gitlab.gnome.org/GNOME/gimp/-/issues/2029]. + +'''Solution:''' +Install the package. If you are not building Gimp yourself, apparently this issue is fixed by the packaging of Gimp having a dependency on package gnome-icon-theme. + + + + + +====(gimp-2.99:xx): dconf-WARNING **: 13:59:42.430: failed to commit changes to dconf: Failed to execute child process ?dbus-launch? (No such file or directory)==== + +'''Problem:''' +The message appears as you start a plugin. It seems harmless unless you have configured GLib to stop on warnings, or if you want to use the services of [https://en.wikipedia.org/wiki/D-Bus dbus] +'''Cause:''' +This is a warning from GLib. Gimp is usually built to support dbus (but can be configured without that support?) The message means that when Gimp attempted to execute the command 'dbus-launch', it could not be found on the system. + +'''Solution:''' +Install package dbug-x11, or whichever package contains the executable command dbus-launch. + + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20210506184322-show.txt b/wiki/Hacking:Problems_and_solutions-20210506184322-show.txt new file mode 100644 index 0000000..af49679 --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20210506184322-show.txt @@ -0,0 +1,1242 @@ + + +This page describes problems/solutions that hamper GIMP developers. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Libraries versions too low==== + +I’m getting an error about a too low of GTK+/GLib while compiling XXX + +You can either update your version of GTK+/GLib using your system’s package manager, or compile GTK+/GLib from source! Compiling these is done exactly like we compiled babl – download the source (either the latest from Git, or a package from the official site), compile and install. You may also need to do something like this to a library called ATK. + + + + + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + +====Absolute DESTDIR required==== + +If you have weird errors at installation, they may be due to DESTDIR being a relative path. + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + + + + +====Building development GIMP 2.99 breaks for missing dependency gegl-0.4 > 0.4.xx==== + +'''Problem: Building the development version of GIMP (2.99) fails with a message that the dependency gegl-0.4 > 0.4.xx is not met.''' +'''Cause:''' + +To build the development version of GIMP (2.99) often requires the development version (bleeding edge) GEGL. In other words, the GIMP unstable version can depend on the GEGL unstable version. + +Cloning the GEGL repository will get the development version of GEGL. (But the latest commit may not be tagged yet in the repository, so you can't ask git for the tagged commit. The meson.build file in the repository will usually show the *next* version that gegl.org will soon tag and release as stable.) + +Tagged versions of GEGL are captured by gimp.org in a tarball at [https://download.gimp.org/pub/gegl/0.4/ https://download.gimp.org/pub/gegl/0.4/], but not always the unstable, development version that a build of unstable GIMP requires. + +'''Solution:''' + +After you have downloaded, built, and installed gegl, to check the installed version, run: + + + +
    pkg-config gegl-0.4 --modversion
    +
    + + + + + + +====Configure fails with a syntax error near unexpected token `x11,'==== + +'''Problem: configure fails with a message about a syntax error but there's no obvious syntax error.''' + +Example: + +
    +./configure: line 22865: syntax error near unexpected token `x11,'
    +./configure: line 22865: `GTK_CHECK_BACKEND(x11, gtk_required_version,'
    +
    +'''Cause:''' +You're missing /usr/share/aclocal/gtk-3.0.m4, which is part of the GTK3 development package. + +'''Solution:''' +Make sure you have libgtk-3-0 installed, including any associated -dev or -devel package. + + + + + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message (or similar, the name might be other than "alien-map") + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. Or you have GEGL master installed in your GIMP prefix, but GIMP fails to find it. +Master means the latest version of the branch named "master" in the GEGL repository. In other words, the GIMP project "tracks" the GEGL project. + +The GEGL version changes. As of this writing, GIMP 2.99 uses gegl-0.4, but that may change in the future. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + +Details: at startup, GIMP checks the GEGL library for the presence of a certain set of GEGL operations. +The operations are present as string literals in the binary. You can test whether your GEGL library contains an operation using e.g.: + +'''grep -R "gegl:alien-map" /usr/local/lib/gegl-04''' + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +====Meson build yields error message: 'meson.build:1:0: ERROR: Value never is not boolean (true or false).'==== + +'''Problem:''' +As above, or 'Value always is not boolean' + +'''Cause:''' + +You have used 'never' or 'always' in the build options of the meson command e.g. '-Djavascript=never' + +'''Solution:''' + +Use 'true' or 'false'. Since about mid 2020. + + + + + +====build configure step stops: missing gtk-encode-symbolic-svg==== + +'''Problem:''' +The executable tool gtk-encode-symbolic-svg could not be found. + + + +'''Cause:''' + +You have not installed the package containing the tool. + +'''Solution:''' + +Use tools provided by your distribution to find which package contains gtk-encode-symbolic-svg, and install that package. +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg is in Ubuntu package libgtk-3-bin. +Formerly in Ubuntu package gtk-3-examples. + + + + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + +==Runtime Errors== + +Warnings and errors displayed in a terminal/console in which you started GIMP from a command line. + +Many are just clutter, that make it hard to find severe errors from code you are testing. + + + + + +===='GEGL-Message: 14:09:17.687: Module '/usr/local/lib/x86_64-linux-gnu/libgegl-npd-0.4.so' load error: Missing gegl_module_query() symbol ?'==== + +'''Problem:''' +GIMP starts, but the terminal displays many messages similar to the above, when plugins are loaded. +It is not clear whether these messages affect functioning, they might just be annoying warnings. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building'. The environment variable GEGL_PATH must reference the top gegl directory, not just its parent. +Referencing the parent is sufficient for GIMP to start, but not for plugins to load without these warnings. + + + + + +====GIMP fails to start with error, 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP starts fails to start, with the message above. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building' + + + + + +====A plugin fails to appear in the menus, with error like "GIMP-WARNING: gimp-2.xx: gimp_wire_read(): error"==== + +'''Problem:''' +GIMP starts, but a plugin does not appear in the GIMP menus as expected, and the terminal shows the above message. + +'''Cause:''' +At startup, GIMP searches certain directories for plugins (executables and interpretable text files) and "queries" them. +This means it starts them in a separate process and then communicates with them over a 'wire' i.e. interprocess communication. +If the plugin crashes or fails to respond, Gimp gives the error above. +You probably installed a plugin that is fatally flawed. + +'''Solution:''' +Remove the plugin. To see which plugin to remove, start Gimp with the '--verbose' flag, and it will print the pathname of plugin files as it queries them. + +To debug the flawed plugin, you can use print statements. + +An interpreted plugin may fail very early in its text, for example in the hashbang i.e. '#!/usr/bin/env python' statement on the first line, +or in an import statement. + + + + + +====Chain of python exceptions beginning with gi.RepositoryError: Typelib file for namespace 'Gegl', version '0.4' not found==== + +'''Problem:''' +On startup, GIMP starts but shows a long chain of Python exceptions. The root exception (the first in the list) is as above. Affects loading of plugins. + +'''Cause:''' +Python is using GLib introspection, but can't find the typelibs for GIMP. Typelibs are in a directory named girepository-1.0. The GIMP typelib is named like "Gimp-3.0.typelib". + +'''Solution:''' +Define environment variable GI_TYPELIB_PATH. For example, export GI_TYPELIB_PATH=/usr/local/lib/x86_64-linux-gnu/girepository-1.0:/usr/local/lib/girepository-1.0 . The example is for Ubuntu 19.10. You may want to change the prefix of the paths, for example using the GIMP_PREFIX environment variable (if you use it.) + +The typelibs for GIMP, Gegl, and Babl might be on different paths (as in the example.) + + + + + +====Gtk-Message: 19:04:46.797: Failed to load module "canberra-gtk-module"==== + +'''Problem:''' +Terminal often displays message like above. Does not affect operation, except sounds may be missing? + +'''Cause:''' +Package libcanberra-gtk3-module is missing. + +'''Solution:''' +Install missing package, for example: sudo apt-get install libcanberra-gtk3-module + + + + + +====(gimp-2.99:xx): dbind-WARNING **: 09:35:43.023: Couldn't register with accessibility bus:==== + +'''Problem:''' +Terminal often shows message like above. Does not affect operation, unless you need accessibility i.e. are visually or hearing impaired. + +'''Cause:''' +Seems to be a long-standing bug in Linux distributions. + +'''Solution:''' +In your environment, export NO_AT_BRIDGE=1 + + + + + +====luajit: ...mp/2.99/plug-ins/goat-exercise-lua/goat-exercise-lua.lua:22: module 'lgi' not found:==== + +'''Problem:''' +On startup, terminal shows a message that begins like above and ends with "GIMP-WARNING: gimp-2.99: gimp_wire_read(): error". +Affects loading of lua language plugins. +In the development branch of GIMP, a set of "goat-exercise-foo" plugins exercise some GObject Introspection language bindings (C, Python, Lua, JS, Scheme, Perl ?) + +'''Cause:''' +Package lua-lgi is missing. + +'''Solution:''' +Install the package. + + + + + +====On Ubuntu: Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Icon 'image-missing' not present in theme Symbolic (gtk-icon-theme-error-quark, 0==== + +'''Problem:''' +On Ubuntu (only?), when using a plugin that opens a Gtk3 file chooser widget, terminal shows a message as above, and plugin crashes. + +'''Cause:''' +Package gnome-icon-theme is missing. See [https://gitlab.gnome.org/GNOME/gimp/-/issues/2029 https://gitlab.gnome.org/GNOME/gimp/-/issues/2029]. + +'''Solution:''' +Install the package. If you are not building Gimp yourself, apparently this issue is fixed by the packaging of Gimp having a dependency on package gnome-icon-theme. + + + + + +====(gimp-2.99:xx): dconf-WARNING **: 13:59:42.430: failed to commit changes to dconf: Failed to execute child process ?dbus-launch? (No such file or directory)==== + +'''Problem:''' +The message appears as you start a plugin. It seems harmless unless you have configured GLib to stop on warnings, or if you want to use the services of [https://en.wikipedia.org/wiki/D-Bus dbus] +'''Cause:''' +This is a warning from GLib. Gimp is usually built to support dbus (but can be configured without that support?) The message means that when Gimp attempted to execute the command 'dbus-launch', it could not be found on the system. + +'''Solution:''' +Install package dbug-x11, or whichever package contains the executable command dbus-launch. + + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:Problems_and_solutions-20210513103541-edit.txt b/wiki/Hacking:Problems_and_solutions-20210513103541-edit.txt new file mode 100644 index 0000000..80148ed --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20210513103541-edit.txt @@ -0,0 +1,1129 @@ +This page describes problems/solutions that hamper GIMP developers. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + +__TOC__ + +==Build== + + + +===General=== + +==== Libraries versions too low ==== + +I’m getting an error about a too low of GTK+/GLib while compiling XXX + +You can either update your version of GTK+/GLib using your system’s package manager, or compile GTK+/GLib from source! Compiling these is done exactly like we compiled babl – download the source (either the latest from Git, or a package from the official site), compile and install. You may also need to do something like this to a library called ATK. + + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' + +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + +====No rule to make target 'all'==== +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' + +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    + +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + +==== Absolute DESTDIR required ==== +If you have weird errors at installation, they may be due to DESTDIR being a relative path. + +===BABL=== + + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    + +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + #define EPSILON 1.0e-10 + + +2. Use EPSILON instead of == : + +{|class="wikitable" style="text-align:left;" border="1" +|- style="color:white" +! scope="col" bgcolor="red" | wrong +! scope="col" bgcolor="green" | right +|- +|if (value == 0.0) || if (value < EPSILON) +|- +|if (value1 == value2) || if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|- +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels [irc://irc.gimp.org/gimp #gimp] or [irc://irc.gimp.org/gegl #gegl]) and ask. + + + +===GEGL=== + + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + CC gegl-matrix.lo + CCLD libgegl-0.3.la + GISCAN Gegl-0.3.gir + GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init() + GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed + GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed + GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init() + GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed + GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init() + GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed + + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    + +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +#:*If you have built in the GEGL source directory, run '''git clean -xdf''' +#:*If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + +===GIMP=== + + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' + +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +Some more information on building can be found at [[Hacking:Building | the building tutorials]]. + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' + +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + + + +====Building development GIMP 2.99 breaks for missing dependency gegl-0.4 > 0.4.xx==== + +'''Problem: Building the development version of GIMP (2.99) fails with a message that the dependency gegl-0.4 > 0.4.xx is not met.''' + +'''Cause:''' + +To build the development version of GIMP (2.99) often requires the development version (bleeding edge) GEGL. In other words, the GIMP unstable version can depend on the GEGL unstable version. + +Cloning the GEGL repository will get the development version of GEGL. (But the latest commit may not be tagged yet in the repository, so you can't ask git for the tagged commit. The meson.build file in the repository will usually show the *next* version that gegl.org will soon tag and release as stable.) + +Tagged versions of GEGL are captured by gimp.org in a tarball at https://download.gimp.org/pub/gegl/0.4/, but not always the unstable, development version that a build of unstable GIMP requires. + +'''Solution:''' + +After you have downloaded, built, and installed gegl, to check the installed version, run: + + + pkg-config gegl-0.4 --modversion + + + + + +==== Configure fails with a syntax error near unexpected token `x11,' ==== + +'''Problem: configure fails with a message about a syntax error but there's no obvious syntax error.''' + +Example: +
    +./configure: line 22865: syntax error near unexpected token `x11,'
    +./configure: line 22865: `GTK_CHECK_BACKEND(x11, gtk_required_version,'
    +
    + +'''Cause:''' +You're missing /usr/share/aclocal/gtk-3.0.m4, which is part of the GTK3 development package. + +'''Solution:''' +Make sure you have libgtk-3-0 installed, including any associated -dev or -devel package. + + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    + +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    + +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' + +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    + +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    + +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message (or similar, the name might be other than "alien-map") + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. Or you have GEGL master installed in your GIMP prefix, but GIMP fails to find it. +Master means the latest version of the branch named "master" in the GEGL repository. In other words, the GIMP project "tracks" the GEGL project. + +The GEGL version changes. As of this writing, GIMP 2.99 uses gegl-0.4, but that may change in the future. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + +Details: at startup, GIMP checks the GEGL library for the presence of a certain set of GEGL operations. +The operations are present as string literals in the binary. You can test whether your GEGL library contains an operation using e.g.: + +'''grep -R "gegl:alien-map" /usr/local/lib/gegl-04''' + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    + +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + +====Meson build yields error message: 'meson.build:1:0: ERROR: Value never is not boolean (true or false).'==== + +'''Problem:''' +As above, or 'Value always is not boolean' + +'''Cause:''' + +You have used 'never' or 'always' in the build options of the meson command e.g. '-Djavascript=never' + +'''Solution:''' + +Use 'true' or 'false'. Since about mid 2020. + + +====build configure step stops: missing gtk-encode-symbolic-svg==== + +'''Problem:''' +The executable tool gtk-encode-symbolic-svg could not be found. + + +'''Cause:''' + +You have not installed the package containing the tool. + +'''Solution:''' + +Use tools provided by your distribution to find which package contains gtk-encode-symbolic-svg, and install that package. +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg is in Ubuntu package libgtk-3-bin. +Formerly in Ubuntu package gtk-3-examples. + + + + +===Jenkins=== + + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    + +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    + +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + +===JHBuild=== + + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' +# Use the proper syntax: +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + +===See also=== +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* [irc://irc.gimp.org/#gegl GEGL IRC channel] + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* [irc://irc.gimp.org/#gimp GIMP IRC channel] + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + +==Code== + + + + +===Eclipse=== + + + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' + +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' + +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' + +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' + +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.' + +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' + +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + +===See also=== +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* [irc://irc.gimp.org/#gegl GEGL IRC channel] + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* [irc://irc.gimp.org/#gimp GIMP IRC channel] + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + +==Debug== + + +===See also=== +* [irc://irc.freenode.net:6667/#gdb GDB IRC channel] +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* [irc://irc.gimp.org/#gegl GEGL IRC channel] + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* [irc://irc.gimp.org/#gimp GIMP IRC channel] + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + +==Manage versions== + + + +===Git=== + + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + +===Eclipse=== + + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + +[[#Git marks untouched files as dirty | See the related Git error.]] + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* [irc://irc.gimp.org/#gimp GIMP IRC channel] +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* [irc://irc.gimp.org/#gegl GEGL IRC channel] + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' + +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + +====See also==== +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* [irc://irc.gimp.org/#gegl GEGL IRC channel] + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* [irc://irc.gimp.org/#gimp GIMP IRC channel] + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + +==Runtime Errors== + +Warnings and errors displayed in a terminal/console in which you started GIMP from a command line. + +Many are just clutter, that make it hard to find severe errors from code you are testing. + + +===='GEGL-Message: 14:09:17.687: Module '/usr/local/lib/x86_64-linux-gnu/libgegl-npd-0.4.so' load error: Missing gegl_module_query() symbol ?' ==== + +'''Problem:''' +GIMP starts, but the terminal displays many messages similar to the above, when plugins are loaded. +It is not clear whether these messages affect functioning, they might just be annoying warnings. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building'. The environment variable GEGL_PATH must reference the top gegl directory, not just its parent. +Referencing the parent is sufficient for GIMP to start, but not for plugins to load without these warnings. + + +====GIMP fails to start with error, 'GIMP requires the GEGL operation "gegl:alien-map"' ==== + +'''Problem:''' +GIMP starts fails to start, with the message above. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building' + + +==== A plugin fails to appear in the menus, with error like "GIMP-WARNING: gimp-2.xx: gimp_wire_read(): error" ==== + +'''Problem:''' +GIMP starts, but a plugin does not appear in the GIMP menus as expected, and the terminal shows the above message. + +'''Cause:''' +At startup, GIMP searches certain directories for plugins (executables and interpretable text files) and "queries" them. +This means it starts them in a separate process and then communicates with them over a 'wire' i.e. interprocess communication. +If the plugin crashes or fails to respond, Gimp gives the error above. +You probably installed a plugin that is fatally flawed. + +'''Solution:''' +Remove the plugin. To see which plugin to remove, start Gimp with the '--verbose' flag, and it will print the pathname of plugin files as it queries them. + +To debug the flawed plugin, you can use print statements. + +An interpreted plugin may fail very early in its text, for example in the hashbang i.e. '#!/usr/bin/env python' statement on the first line, +or in an import statement. + + + +====Chain of python exceptions beginning with gi.RepositoryError: Typelib file for namespace 'Gegl', version '0.4' not found ==== + +'''Problem:''' +On startup, GIMP starts but shows a long chain of Python exceptions. The root exception (the first in the list) is as above. Affects loading of plugins. + +'''Cause:''' +Python is using GLib introspection, but can't find the typelibs for GIMP. Typelibs are in a directory named girepository-1.0. The GIMP typelib is named like "Gimp-3.0.typelib". + +'''Solution:''' +Define environment variable GI_TYPELIB_PATH. For example, export GI_TYPELIB_PATH=/usr/local/lib/x86_64-linux-gnu/girepository-1.0:/usr/local/lib/girepository-1.0 . The example is for Ubuntu 19.10. You may want to change the prefix of the paths, for example using the GIMP_PREFIX environment variable (if you use it.) + +The typelibs for GIMP, Gegl, and Babl might be on different paths (as in the example.) + + +==== Gtk-Message: 19:04:46.797: Failed to load module "canberra-gtk-module" ==== + +'''Problem:''' +Terminal often displays message like above. Does not affect operation, except sounds may be missing? + +'''Cause:''' +Package libcanberra-gtk3-module is missing. + +'''Solution:''' +Install missing package, for example: sudo apt-get install libcanberra-gtk3-module + + +==== (gimp-2.99:xx): dbind-WARNING **: 09:35:43.023: Couldn't register with accessibility bus: ==== + +'''Problem:''' +Terminal often shows message like above. Does not affect operation, unless you need accessibility i.e. are visually or hearing impaired. + +'''Cause:''' +Seems to be a long-standing bug in Linux distributions. + +'''Solution:''' +In your environment, export NO_AT_BRIDGE=1 + + +==== luajit: ...mp/2.99/plug-ins/goat-exercise-lua/goat-exercise-lua.lua:22: module 'lgi' not found: ==== + +'''Problem:''' +On startup, terminal shows a message that begins like above and ends with "GIMP-WARNING: gimp-2.99: gimp_wire_read(): error". +Affects loading of lua language plugins. +In the development branch of GIMP, a set of "goat-exercise-foo" plugins exercise some GObject Introspection language bindings (C, Python, Lua, JS, Scheme, Perl ?) + +'''Cause:''' +Package lua-lgi is missing. + +'''Solution:''' +Install the package. + + +==== On Ubuntu: Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Icon 'image-missing' not present in theme Symbolic (gtk-icon-theme-error-quark, 0 ==== + +'''Problem:''' +On Ubuntu (only?), when using a plugin that opens a Gtk3 file chooser widget, terminal shows a message as above, and plugin crashes. + +'''Cause:''' +Package gnome-icon-theme is missing. See https://gitlab.gnome.org/GNOME/gimp/-/issues/2029. + +'''Solution:''' +Install the package. If you are not building Gimp yourself, apparently this issue is fixed by the packaging of Gimp having a dependency on package gnome-icon-theme. + + +==== (gimp-2.99:xx): dconf-WARNING **: 13:59:42.430: failed to commit changes to dconf: Failed to execute child process ?dbus-launch? (No such file or directory) ==== + +'''Problem:''' +The message appears as you start a plugin. It seems harmless unless you have configured GLib to stop on warnings, or if you want to use the services of [https://en.wikipedia.org/wiki/D-Bus dbus] + +'''Cause:''' +This is a warning from GLib. Gimp is usually built to support dbus (but can be configured without that support?) The message means that when Gimp attempted to execute the command 'dbus-launch', it could not be found on the system. + +'''Solution:''' +Install package dbug-x11, or whichever package contains the executable command dbus-launch. + + +==Templates== +====Template for investigated solutions==== + + +'''Problem:''' + +'''Cause:''' + +'''Solution:''' + +====Template for workarounds==== + + +'''Problem:''' + +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. diff --git a/wiki/Hacking:Problems_and_solutions-20210818012237-show.txt b/wiki/Hacking:Problems_and_solutions-20210818012237-show.txt new file mode 100644 index 0000000..b6070ce --- /dev/null +++ b/wiki/Hacking:Problems_and_solutions-20210818012237-show.txt @@ -0,0 +1,1258 @@ + + +This page describes problems/solutions that hamper GIMP developers. It's a knowledge base for developers. +Feel free to add your own findings and don't be shy. It makes the work easier for all of us. + + +__TOC__ + +==Build== + +===General=== + +====Libraries versions too low==== + +I’m getting an error about a too low of GTK+/GLib while compiling XXX + +You can either update your version of GTK+/GLib using your system’s package manager, or compile GTK+/GLib from source! Compiling these is done exactly like we compiled babl – download the source (either the latest from Git, or a package from the official site), compile and install. You may also need to do something like this to a library called ATK. + + + + + +====Error while loading shared libraries: No such file or directory==== + +'''Problem: I've built a shared library. However, building fails with the message 'error while loading shared libraries: libmylibrary.so.1: cannot open shared object file: No such file or directory' ''' +'''Cause:''' +The linker doesn't find your library, because it's not in a standard location (such as /usr/lib). + +'''Solution:''' +Set the environment variable LD_LIBRARY_PATH to the directory which contains your compiled library. + +Example: given the library is in /home/username/build/mylibrary/lib then type '''export LD_LIBRARY_PATH=/home/username/build/mylibrary/lib:${LD_LIBRARY_PATH}''' and try again. + + + + + +====No rule to make target 'all'==== + +'''Problem: I've created a new subdirectory and the Makefile.am file there. However, each time the ''make'' command stops at this directory with the error 'No rule to make target all'''' +'''Cause:''' +The directory isn't listed among AC_CONFIG_FILES in the '''configure.ac''' file. Therefore the generated makefile doesn't contain the target 'all' and the ''make'' command doesn't know what to do. + +'''Solution:''' + +# Open '''configure.ac''' in the project's root directory. +# Search for the line AC_CONFIG_FILES. +# In the following list look for a suitable line to place your new directory item. The line after the parent directory, taking care for the alphabetical order, is a good candidate. +# Save '''configure.ac'''. +# Open a terminal window and change to the directory where you build the project. +# Run '''autogen.sh --prefix=$your_prefix''' + + + + +====Make install fails with 'cannot install to a directory'...==== + +'''Problem: make install fails with ''error:cannot install ... to a directory not ending in ...'' ''' + +You get error messages like this + +
    +make[3]: Entering directory `/home/$your_username/build/gegl-master/operations/core'
    +/usr/bin/install -c -d /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3
    +for i in clone.la convert-format.la crop.la nop.la; do \
    +	  /bin/bash ../../libtool --mode=install /usr/bin/install -c $i /home/$your_username/gimp-install/gimp-feature2/lib/gegl-0.3 ; \
    +	done
    +libtool: install: error: cannot install `clone.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `convert-format.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `crop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +libtool: install: error: cannot install `nop.la' to a directory not ending in /home/$your_username/gimp-install/gimp-master/lib/gegl-0.3
    +make[3]: *** [install-exec-local] Error 1
    +make[3]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[2]: *** [install-am] Error 2
    +make[2]: Leaving directory `/home/$your_username/build/gegl-master/operations/core'
    +make[1]: *** [install-recursive] Error 1
    +make[1]: Leaving directory `/home/$your_username/build/gegl-master/operations'
    +make: *** [install-recursive] Error 1
    +
    +'''Cause:''' +In a former step you've built into another prefix. Somehow the newer build reads remains of that in the aforementioned *.la files and stumbles over them. + +'''Solution:''' + +The solution describes the process using the example of GEGL. + + +# Change into the build directory of that previous build (in the given example this is `/home/$your_username/build/gegl-master/operations/core), or into its root folder (here: /home/$your_username/build/gegl-master) +# Run '''make clean'''. +# Set your INSTALL_PREFIX variable properly to the folder where you want GEGL install in. +# Change into the folder where you build GEGL from (if you're not already there). +# Re-run '''configure --prefix=$INSTALL_PREFIX''' (or if you checked GEGL out from Git: '''autogen.sh --prefix=$INSTALL_PREFIX''') '''&& make && make install''' + +====Absolute DESTDIR required==== + +If you have weird errors at installation, they may be due to DESTDIR being a relative path. + + +===BABL=== + +====Unit tests fail==== + +'''Problem: Unit tests pass on one machine, but fail on another - equally configured - machine.''' + +In this particular case the tests RGBA->HSLA and RGBA->HSVA passed on an amd64 platform, but failed on an i386 platform. + +This is the content of file tests/testsuite.log on the i386 machine: + +
    +=======================================
    +babl 0.1.11: tests/test-suite.log
    +=======================================
    +# TOTAL: 19
    +# PASS:  17
    +# SKIP:  0
    +# XFAIL: 0
    +# FAIL:  2
    +# XPASS: 0
    +# ERROR: 0
    +
    +.. contents:: :depth: 2
    +FAIL: hsl
    +=========
    +rgba to hsla  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsla  failed #1[0]  got 0.666667 expected 0.000000
    +FAIL: hsva
    +=========
    +rgba to hsva  failed #0[0]  got 0.166667 expected 0.000000
    +rgba to hsva  failed #1[0]  got 0.166667 expected 0.000000
    +
    +'''Cause:''' +The tested code doesn't take into account that strict equality comparisons (==) will most often lead to different results on different platforms. + +'''Solution:''' +The code must take this fact into account. This means: + + +* '''Don't use == for floating point comparisons!''' + +The following lines show alternatives. + +1. Make sure to have defined EPSILON first: + + + +
    #define EPSILON 1.0e-10
    +
    + + + +2. Use EPSILON instead of == : + + +{| class="wikitable" +|- +! wrong +! right +|- +| if (value == 0.0) | if (value < EPSILON) +|- +| if (value1 == value2) | if (value1 - value2 < EPSILON) or + +if (fabs (value1 - value2)) < EPSILON +|} + +See also [https://git.gnome.org/browse/babl/commit/?id=da3b41274052c23b44ad8eceb9d99106d2739f3a Bugfix for RGBA->HSLA,HSVA conversions]. + + +* Make sure, your code works on all architectures. On a 64 bit machine this would mean also to compile and run make check with '''CFLAGS="-O2 -mfpmath=387"'''. + +If you're unsure, come to IRC (channels #gimp or #gegl) and ask. + + + + + +===GEGL=== + +====GEGL build breaks for failing GLib assertions==== + +'''Problem: Building GEGL master stops with failing assertions related to GLib. The stopped build can't be aborted with Ctrl+C to enter new commands in that terminal session.''' + +The following messages are shown at the screen: + + + +
    CC       gegl-matrix.lo
    +CCLD     libgegl-0.3.la
    +GISCAN Gegl-0.3.gir
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion `G_TYPE_IS_INTERFACE (interface_type)' failed
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +GLib-GObject-CRITICAL **: gtype.c:2720: You forgot to call g_type_init()
    +GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
    +
    + + +'''Cause:''' +You have an old GLib version in your prefix. (Don't be fooled by just looking at the libglib version in your package manager!) + +'''Solution:''' + +# Close this terminal session and open a new one. +# Remove that old GLib version from your prefix and rebuild GEGL from scratch. + + + + +====SPIRO not found==== + +'''Problem: I have SPIRO (packages libspiro0, libspiro-dev) installed. However, at the end GEGLs configure step tells me, that no usable SPIRO was found.''' + +GEGL builds and works anyway, because it is only an optional dependency. + +'''Cause:''' +The package of your distribution doesn't contain the link libspiro.so to the actual SPIRO library. On a Debian testing system this concerns the package libspiro0. + +'''Solution:''' +You have to set that link yourself. +This bug is already known to the responsible [http://lists.alioth.debian.org/pipermail/pkg-fonts-devel/2013-September/012940.html Debian package managers]. + +On an i386 platform: + + +# '''cd /usr/lib/i386-linux-gnu''' +# Find out the actual libspiro file: '''ls -l libspiro.*''' The actual libspiro file is a plain file, not a symbolic link, and has a name similar to libspiro.so.0.0.1 +# Set the link: '''sudo ln -s libspiro.so.0.0.1 libspiro.so'''. You will have to enter your password for this. +# Point your LDFLAGS variable to that directory: '''export LDFLAGS="${LDFLAGS} -L/usr/lib/i386-linux-gnu"''' +# Point your LD_LIBRARY_PATH variable to that directory: '''export LD_LIBRARY_PATH="/usr/lib/i386-linux-gnu:${LD_LIBRARY_PATH}"''' + +If you're working on an AMD64 platform, replace i386-linux-gnu by x86_64-linux-gnu. + + + + + +====GEGL build breaks: 'recipe for target 'Gegl-0.3.gir' failed'==== + +'''Problem:''' + +The GEGL build breaks with a message like this: + +
    +Workspace/gegl/gegl/gegl-introspection-support.h:162: 
    +Warning: Gegl: GObject-Introspection specific GTK-Doc tag "Rename to" has been deprecated, 
    +please use annotations on the identifier instead:
    + * Rename to: gegl_buffer_set
    +   ^
    +/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o:
    +(.data+0x4): undefined reference to `gegl_orientation_get_type'
    +collect2: error: ld returned 1 exit status
    +linking of temporary binary failed: Command '['/bin/bash', '../libtool', 
    +'--mode=link', '--tag=CC', '--silent', 'cc', '-o', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3', 
    +'-export-dynamic', '-I/home/username/Builds/gimp-master-linux/include', 
    +'-I/usr/include', '-g', '-O3', '-mmmx', '-msse', '-ftree-vectorize', 
    +'-ffast-math', '-Wall', '-Wdeclaration-after-statement', '-Wmissing-prototypes', 
    +'-Wmissing-declarations', '-Winit-self', '-Wpointer-arith', '-Wold-style-definition', 
    +'-DG_LOG_DOMAIN="GEGL-"__FILE__', '-L/usr/lib', '-L/usr/lib/i386-linux-gnu', 
    +'-L/home/username/Builds/gimp-master-linux/lib', 
    +'/home/username/Build/gegl-master-linux/gegl/tmp-introspect4OKYKn/Gegl-0.3.o', 
    +'-L.', 'libgegl-0.3.la', '-lgio-2.0', '-lgobject-2.0', '-Wl,--export-dynamic', 
    +'-lgmodule-2.0', '-pthread', '-lglib-2.0']' 
    +returned non-zero exit status 1
    +/usr/share/gobject-introspection-1.0/Makefile.introspection:153: recipe for target 'Gegl-0.3.gir' failed
    +make[3]: *** [Gegl-0.3.gir] Error 1
    +
    +'''Cause:''' + +You triggered regeneration of autogenerated files, which overwrite new ones from the repository. + +'''Solution:''' + +# Clean your build directory: +: +* If you have built in the GEGL source directory, run '''git clean -xdf''' +* If you have built in another directory than your source directory: '''cd $build_directory && rm -rf *''' +# Build GEGL again. + + + + +===GIMP=== + +====GIMP build breaks for missing files in $ANOTHER_PREFIX/lib==== + +'''Problem: Building GIMP fails for instance in libgimpcolor with a message telling you, that some files in $ANOTHER_PREFIX/lib are missing and thus building libgimpcolor.la (or another *.la file) failed.''' +'''Cause:''' +You switched over to another prefix. You already cleaned or removed that old prefix, but in your new prefix are some files referring to other files in that old prefix. +In other words - there's an evil mixture of your new prefix and some old prefix zombies and libtool trips you up ;-) + +'''Solution:''' +Finding out the actually errorneous parts can take you hours, so it's better to make a clean sweep: + + +# Check your environment variables, especially the build environment variables. If they point to that old prefix, change them to point to the new prefix. +# Drop the contents of your new prefix. +# Rebuild from scratch. For BABL, GEGL and GIMP (and other libraries, if you use them): +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +## Change to their directory. +## Save your work (backup your working files or do '''git stash'''). +## Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +## Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +## Run '''make && make install'''. +# Change to their directory. +# Save your work (backup your working files or do '''git stash'''). +# Run '''git clean -xdf''' or drop the contents of the workspace except the .git folder or the source tarball. +# Run '''./configure --prefix=$PREFIX''' (Git users: '''./autogen.sh --prefix=$PREFIX'''). +# Run '''make && make install'''. + +Some more information on building can be found at [[Hacking:Building| the building tutorials]]. + + + + + +====GIMP build breaks for missing dependency gegl-0.2 > 0.2.0==== + +'''Problem: Building GIMP fails with a message, that the dependency gegl-0.2 > 0.2.0 is not met. But in $prefix I see the GEGL files, for instance gegl-0.3.pc in $prefix/lib/pkgconfig.''' +'''Cause:''' +You have mismatched the versions: + +GIMP 2.8 needs GEGL from the branch gegl-0-2. + +GIMP 2.9 (=master) needs GEGL from the branch master. + +Obviously you have mixed GIMP 2.8 with GEGL master. + +'''Solution:''' + +If you want to build GIMP 2.8: + + +# In GEGLs build directory run '''make uninstall'''. +# For GEGL checkout gegl-0-2, run '''make''' and '''make install'''. +# Go to the GIMP build directory and run '''autogen.sh''' again, run '''make''' and '''make install'''. + +If you want to build GIMP master: + + +# In GIMPs workspace run 'git checkout master'. +# Run '''autogen.sh''' again, run '''make''' and '''make install'''. + + + + +====Building development GIMP 2.99 breaks for missing dependency gegl-0.4 > 0.4.xx==== + +'''Problem: Building the development version of GIMP (2.99) fails with a message that the dependency gegl-0.4 > 0.4.xx is not met.''' +'''Cause:''' + +To build the development version of GIMP (2.99) often requires the development version (bleeding edge) GEGL. In other words, the GIMP unstable version can depend on the GEGL unstable version. + +Cloning the GEGL repository will get the development version of GEGL. (But the latest commit may not be tagged yet in the repository, so you can't ask git for the tagged commit. The meson.build file in the repository will usually show the *next* version that gegl.org will soon tag and release as stable.) + +Tagged versions of GEGL are captured by gimp.org in a tarball at [https://download.gimp.org/pub/gegl/0.4/ https://download.gimp.org/pub/gegl/0.4/], but not always the unstable, development version that a build of unstable GIMP requires. + +'''Solution:''' + +After you have downloaded, built, and installed gegl, to check the installed version, run: + + + +
    pkg-config gegl-0.4 --modversion
    +
    + + + + + + +====Configure fails with a syntax error near unexpected token `x11,'==== + +'''Problem: configure fails with a message about a syntax error but there's no obvious syntax error.''' + +Example: + +
    +./configure: line 22865: syntax error near unexpected token `x11,'
    +./configure: line 22865: `GTK_CHECK_BACKEND(x11, gtk_required_version,'
    +
    +'''Cause:''' +You're missing /usr/share/aclocal/gtk-3.0.m4, which is part of the GTK3 development package. + +'''Solution:''' +Make sure you have libgtk-3-0 installed, including any associated -dev or -devel package. + + + + + +====GIMP build fails for missing BABL function==== + +'''Problem: GIMP build fails for missing BABL function''' + +Example: + +
    +  /home/Workspace/gimp/app/core/libappcore.a(gimphistogram.o): In function `gimp_histogram_calculate':
    +  /home/Workspace/gimp/app/core/gimphistogram.c:261: undefined reference to `babl_format_get_model'
    +   operations/libappoperations.a(gimpoperationmaskcomponents.o): In function `gimp_operation_mask_components_prepare':
    +  /home/Workspace/gimp/app/operations/gimpoperationmaskcomponents.c:150: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_base_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:361: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl.o): In function `gimp_babl_format_get_linear':
    +  /home/Workspace/gimp/app/gegl/gimp-babl.c:454: undefined reference to `babl_format_get_model'
    +  gegl/libappgegl.a(gimp-babl-compat.o): In function `gimp_babl_format_get_image_type':
    +  /home/Workspace/gimp/app/gegl/gimp-babl-compat.c:38: undefined reference to `babl_format_get_model'
    +  collect2: error: ld returned 1 exit status
    +
    +'''Cause:''' + +You have an older version of babl installed on your system, either in your local installation prefix +or by a package. In this case the package libbabl-dev 0.1.10-1 was installed. Although the build environment +variables were set to rely on the local installation prefix, the linker checked this old version and failed for +not finding the symbol `babl_format_get_model` in BABL. + +'''Solution:''' + +# Check the file '''$prefix/lib/pkgconfig/babl.pc'''. If you find a line with 'Version: 0.1.10' or older, then your BABL library is too old. In this case, goto step 2, otherwise to step 4. +# Change into your BABL source directory. Fetch the latest BABL source code, i.e. from git (branch 'master'). +# Clean and rebuild BABL from scratch: run '''autogen.sh''' or '''config''', '''make clean && make uninstall && make && make install''' +# In your package manager check the version of the BABL development library (on Debian systems: libbabl-dev, on Mandriva: libbabl-devel, on Red Hat systems:babl*src, on openSuSE systems:babl-devel). If you find version 0.1.10 or older, then your BABL library is too old. In your package manager remove it completely and also the GEGL development package depending on it. +# Also clean and rebuild GEGL from scratch to avoid version mismatch between GEGL and GIMP. +# Clean and rebuild GIMP from scratch. + + + + +====Build of GIMP master fails in gimpcursor.c==== + +'''Problem: Build of GIMP master fails in gimpcursor.c''' + +Error messages: + +
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:90:5: error: ‘cursor_corner_top’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:98:5: error: ‘cursor_corner_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:106:5: error: ‘cursor_corner_bottom’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:114:5: error: ‘cursor_corner_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:126:5: error: ‘cursor_side_top_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:134:5: error: ‘cursor_side_bottom_right’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:142:5: error: ‘cursor_side_bottom_left’ undeclared here (not in a function)
    +/home/Workspace/gimp/app/widgets/gimpcursor.c:150:5: error: ‘cursor_side_top_left’ undeclared here (not in a function)
    +
    +'''Cause:''' + +It's probably a gdk-pixbuf issue. It is for instance known to update the system loaders cache instead the cache of its local installation, if it's installed in a prefix which is in the PATH variable. + +'''Workarounds:''' +''Workaround A (the short tour):'' + +# '''cd cursors''' +# '''make clean''' +# '''cd ..''' +# '''make''' + + +''Workaround B (the big tour):'' + +# '''gdk-pixbuf-query-loaders --update-cache''' (in case this doesnt work run it with sudo) +# add the Pkgconfigpath of libgdk-pixbuf2.0-dev to the PKG_CONFIG_PATH environment variable +# '''configure/autogen''' with your prefix +# '''make clean''' +# '''make''' + + +Anyway, these are just workarounds. If you know the cause and a proper solution, feel free to edit this article. + + + + + +====Errors on linking a static library, for instance with MinGW==== + +'''Problem: Errors on linking a static library, for instance with MinGW''' + +Compiling GIMP fails, because of not finding a library which is actually there (for instance gexiv2). + +The output of make V=1 produces a message like this: + +
    +*** Warning: This system can not link to static lib archive
    +/$your_workspace/share/crossroad/roads/w64/lib/libgexiv2.la.
    +*** I have the capability to make that library automatically link in when
    +*** you link to this library.  But I can only do this if you have a
    +*** shared version of the library, which you do not appear to have.
    +
    +'''Cause:''' + +You have not a shared (=dynamic) binary version, but a static binary of that particular library. Linking static binaries of most libraries is not supported by GIMP. + +You can recognize this by the file file extensions: + +Dynamic libraries have the extensions: '''so''' on Linux, '''dylib''' on OS X, '''dll''' on Windows. + +Static libraries have the extensions: '''a''' on Linux and OS X, '''lib''' on Windows. + +'''Solution:''' + +1. Get a dynamic binary version of that library. Either the package manager of your distribution or the web holds one or you +have to compile it yourself. + +2. Compile GIMP again (starting with configure or autogen.sh to let the Autotools find the new library and make it included.) + + + + + +====GIMP build fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png'==== + +'''Problem: Building GIMP fails with message 'Couldn't recognize the image file format for file ./cursor-bad.png' ''' + +The whole message is + +
    +
    +Making all in cursors
    +make[2]: Entering directory `$your_workspace/gimp/cursors'
    +  GEN    tool-cursors.list
    +  GEN    gimp-tool-cursors.h
    +
    +failed to load "./cursor-bad.png": Couldn't recognize the image file format for file './cursor-bad.png' 
    +
    +'''Cause:''' + +The environment variable XDG_DATA_DIRS is modified in your build environment, which confuses the GLib library (GDK-Pixbuf). + +'''Solution:''' + +# Don't modify the environment variable XDG_DATA_DIRS in your build environment. I.e. if you build from a build script, don't set this variable there. +# make distclean +# autogen.sh or configure +# make +# make install + + + + +====GIMP master refuses to start with error 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP master refuses to start and instead shows this error message (or similar, the name might be other than "alien-map") + +'GEGL operation missing! + +GIMP requires the GEGL operation "gegl:alien-map". +This operation cannot be found. Check your +GEGL install and ensure it has been compiled +with any dependencies required for GIMP.' + +'''Cause:''' + +You have GEGL 0.2 installed on your system, but GIMP master requires GEGL master. Or you have GEGL master installed in your GIMP prefix, but GIMP fails to find it. +Master means the latest version of the branch named "master" in the GEGL repository. In other words, the GIMP project "tracks" the GEGL project. + +The GEGL version changes. As of this writing, GIMP 2.99 uses gegl-0.4, but that may change in the future. + +'''Solution:''' + +To tell GIMP master where GEGL master is run + +'''export GEGL_PATH=${INSTALL_PREFIX}/lib/gegl-0.3''' + +before starting GIMP. + +To avoid a similar version mismatch with Babl, you can also run + +'''export BABL_PATH=${INSTALL_PREFIX}/lib/babl-0.1''' + +before starting GIMP. + +Details: at startup, GIMP checks the GEGL library for the presence of a certain set of GEGL operations. +The operations are present as string literals in the binary. You can test whether your GEGL library contains an operation using e.g.: + +'''grep -R "gegl:alien-map" /usr/local/lib/gegl-04''' + + + + +====Unit tests fail==== + +'''Problem:''' + +Many unit tests fail with an output similar to this: + +
    +FAIL: test-save-and-export
    +==========================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-save-and-export:15852): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-6-compatibility
    +====================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-6-compatibility/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-6-compatibility:16107): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-multi-window
    +=================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-multi-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-multi-window:16351): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-session-2-8-compatibility-single-window
    +==================================================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +/gimp-session-2-8-compatibility-single-window/read_and_write_session_files: GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-session-2-8-compatibility-single-window:16595): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-single-window-mode
    +=============================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-single-window-mode:16839): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead.
    +
    +FAIL: test-tools
    +================
    +
    +Xlib:  extension "RANDR" missing on display ":99".
    +GIMP-Error: Could not open '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/../app/tests/gimpdir/themerc' for writing: Permission denied
    +
    +GIMP-Error: Failed to open file '/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_inst/etc/gimp/2.0/templaterc': open() failed: No such file or directory
    +
    +
    +(/var/lib/jenkins/workspace/gimp-master/gimp-2.9.1/_build/app/tests/.libs/lt-test-tools:17083): Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead
    +
    +'''Cause:''' + +Look at the last error line for each failing test and start your research there. + +'''Solution:''' + +In case of +''Gimp-Widgets-WARNING **: GDK returned bogus values for the monitor resolution, using 96 dpi instead'': + +The function '''g_warning''' was used for an error other than a programming error. Use the ''g_printerr'' function instead. See also [https://git.gnome.org/browse/gimp/commit/?id=a07f2301bbdf44ef00fba738f2ba157cd3546e39 commit a07f230 on GIMP master] + + + + +====Meson build yields error message: 'meson.build:1:0: ERROR: Value never is not boolean (true or false).'==== + +'''Problem:''' +As above, or 'Value always is not boolean' + +'''Cause:''' + +You have used 'never' or 'always' in the build options of the meson command e.g. '-Djavascript=never' + +'''Solution:''' + +Use 'true' or 'false'. Since about mid 2020. + + +====Meson build hangs i.e. never finishes==== + +'''Problem:''' + +In the console where you started the meson build, near the end of the build process, meson stops emitting messages and the command line prompt never comes back. + +'''Cause:''' + +Some step in the build did not complete. +The default for meson is '-j 3', meaning build in parallel, so the last step shown in the console might not be the step that hung. + +'''Solution:''' + +Use 'ps -ef' to determine which process is hung, and debug that build step. +Sometimes it is the g-ir-scanner tool. +Or use '-j 1' so that the last step shown is the step that hung. + + + + + +====build configure step stops: missing gtk-encode-symbolic-svg==== + +'''Problem:''' +The executable tool gtk-encode-symbolic-svg could not be found. + +'''Cause:''' + +You have not installed the package containing the tool. + +'''Solution:''' + +Use tools provided by your distribution to find which package contains gtk-encode-symbolic-svg, and install that package. +Since Ubuntu 20.04 focal, the tool gtk-encode-symbolic-svg is in Ubuntu package libgtk-3-bin. +Formerly in Ubuntu package gtk-3-examples. + + + + + + + +===Jenkins=== + +====The compiler fails for a missing directory, although that directory exists==== + +'''Problem: The compiler fails for a missing directory, although that directory exists''' + +The file config.log contains the lines + +
    +configure:3796: checking whether the C compiler works
    +configure:3818: gcc ... "-L/usr/lib/x86_64-linux-gnu" ...  >&5
    +gcc: error: "-L: No such file or directory
    +gcc: error: /usr/lib/x86_64-linux-gnu": No such file or directory
    +
    +'''Cause:''' + +In Jenkins' global configuration you set the environment variable LDFLAGS="-L/usr/lib/x86_64-linux-gnu". + +The quotes are not necessary here. + +'''Solution:''' + +Remove the quotes, save the global configuration and restart the job. + +If the environment variable PKG_CONFIG_PATH also contains that directory, you can omit it in LDFLAGS. + + + + + +====Jenkins cannot access the Git repository==== + +'''Problem: Jenkins cannot access the Git repository''' + +The console log contains the lines: + +
    +stderr: fatal: unable to connect to git.gnome.org:
    +git.gnome.org[...]: errno=Connection timed out
    +
    +'''Cause:''' + +The Gnome Git server is down for maintenance. + +'''Solution:''' + +Try again later. + + + + + +===JHBuild=== + +====JHBuild ignores autogenargs==== + +'''Problem:''' +JHBuild ignores the '''autogenargs''' parameter for a target. + +'''Cause:''' +A simple typo. In this case it ended with duplicated quotes and was after the closing bracket of the autotools tag. + +'''Solution:''' + +# Use the proper syntax: + +# If the options in the JHBuild menu on the command line don't help, cancel the JHBuild process (option '3'-give up on module') and run it again. + + + + +===See also=== + +* [http://stackoverflow.com/questions/tagged/autotools?sort=frequent&pageSize=15 Autotools questions at Stackoverflow.com] + +* [http://lists.cs.uiuc.edu/mailman/listinfo/cfe-users Clang users mailing list] +* [http://stackoverflow.com/questions/tagged/clang+or+llvm Clang and LLVM questions at Stackoverflow.com] + +* [http://gcc.gnu.org/ml/gcc-help/ The GCC-Help mailing list] +* [http://stackoverflow.com/questions/tagged/gcc GCC questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://jenkins-ci.org/content/mailing-lists Jenkins mailing lists] + + + + + + +==Code== + +===Eclipse=== + +====Menu items 'Reconfigure' and 'Autotools/...' are disabled==== + +'''Problem: When right-clicking on a CDT project, the item Reconfigure and the items in the Autotools submenu are disabled ''' +'''Problem: Reconfiguring a project ends with an error 'The chosen operation is not enabled' ''' + +Neither cleaning or make distclean bring them back. + +'''Cause:''' +Your project configuration is perhaps garbled. + +'''Solution:''' +'''Alt. A''' + +In a terminal window change to the project's workspace folder, enter '''make distclean''' and '''./autogen.sh''' resp. '''./configure''' . Every time you want to reconfigure your project repeat this step. Subsequently building the project in Eclipse works despite the disabled Reconfigure/Autotools menu items. + +'''Alt. B''' + +# Delete the project (but '''don't tick''' 'Delete project contents on disk (cannot be undone)'!!) +# Create the project again: Makefile project from existing sources, then New/Convert to Autotools project +# In the project's properties configure the Autotools, Paths and Symbols (Include Path, Referenced projects) + + + + +====Reconfigure fails with message 'aclocal: error: non-option arguments are not accepted: '-I'==== + +'''Problem: Reconfiguring a CDT Autotools project causes error 'aclocal: error: non-option arguments are not accepted: '-I' ''' +'''Cause:''' +In the global or project specific environments settings the ACLOCAL_FLAGS variable is embraced with quotes and Eclipse somehow can't handle this. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the ACLOCAL_FLAGS variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Remove the quotes from the ACLOCAL_FLAGS variable. + + + + +====Basic tools not found although there==== + +'''Problem: Trying to build, clean or reconfigure the project ends with an error, that either sh, make, gcc or g++ could not be found although they are there.''' +'''Cause:''' +Eclipse doesn't find them in the PATH variable. Either you didn't include ${PATH} in your PATH settings or you included it, but Eclipse doesn't resolve it. + +'''Solution:''' + +# Edit the project's environments settings (Properties/ C/C++ Build / Environment). If the PATH variable doesn't appear here or is not printed boldly, then cancel that dialog and edit them in Window / Preferences / C/C++ Build / Environment). +# Make sure your PATH variable setting contains the string ':${PATH}'. It must have the curly braces around it! If the variable is already there and isn't resolved anyway, then get its value from your operating system and replace ${PATH} with that value. + + + + +====Eclipse doesn't recognize CDT/Autotools project anymore==== + +'''Problem: After starting Eclipse has closed my CDT project. When trying to reopen it I get the message 'The project description file (.project) for '${My project}' is missing. This file contains important information about the project. The project will not function properly until this file is restored.'''' +'''Problem: Eclipse tells in the project's properties that the project is not a CDT project (anymore).''' +'''Cause:''' +Eclipse's projects settings got lost. One candidate is having run 'git clean -xdf' in the workspace (in the first case when + +'''Solution:''' +If you have a backup of the files .project, .cproject, .autotools, then restore them now to the project's folder. If you don't have them at hand: + + +# Create a new dummy C project and convert it to an Autotools C project (New/CDT/Convert to Autotools project). +# Copy the files .project, .cproject, .autotools from that project's folder into the folder of your damaged project. +# Edit the projects CDT or Autotools settings. +# Create a backup of the files .project, .cproject, .autotools. + + + + +===See also=== + +* [http://eclipse.org/cdt/support.php Eclipse CDT support site] +* [http://stackoverflow.com/questions/tagged/cdt Eclipse CDT questions at Stackoverflow.com] + +* [https://www.gnu.org/software/emacs/#HelpMailing Emacs support] +* [http://stackoverflow.com/questions/tagged/emacs Emacs questions at Stackoverflow.com] + +* [http://www.geany.org/Documentation/FAQ Geany FAQ] +* [http://stackoverflow.com/questions/tagged/geany Geany questions at Stackoverflow.com] + +* [https://wiki.gnome.org/Apps/Gedit GEdit support] +* [http://stackoverflow.com/questions/tagged/gedit GEdit questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [https://netbeans.org/community/lists/index.html Netbeans mailing lists and forums] +* [http://stackoverflow.com/questions/tagged/netbeans Netbeans questions at Stackoverflow.com] + +* [http://www.cs.colostate.edu/helpdocs/vi.html Basic vi commands] +* [http://stackoverflow.com/questions/tagged/vi Vi questions at Stackoverflow.com] + + + + + + +==Debug== + +===See also=== + +* GDB IRC channel +* [http://sourceware.org/gdb/wiki/ GDB wiki] +* [http://stackoverflow.com/questions/tagged/gdb GDB questions at Stackoverflow.com] + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://stackoverflow.com/questions/tagged/lldb LLDB questions at Stackoverflow.com] + + + + + + +==Manage versions== + +===Git=== + +====I'm a few commits behind==== + +'''Problem: After checking out a particular branch, Git tells me, that I'm a few commits behind,''' + +for example: 'Your branch is behind 'origin/gimp-2-8' by 2 commits, and can be fast-forwarded.' + +'''Cause:''' +On '''git pull''' Git didn't update the HEAD on your local branch for whatever reason. + +'''Solution:''' +Try '''git pull origin''' to update your local branch. + + + + + +====Git marks untouched files as dirty==== + +'''Problem: git status shows that there are untracked files I haven't touched at all''' + +For instance this: + +
    +$:~/Workspace/gimp$ git status
    +On Branch master
    +
    +Untracked files:
    +
    +	app/base/
    +	app/composite/
    +	app/paint-funcs/
    +	plug-ins/file-xjt/
    +	plug-ins/metadata/
    +
    + +These files are not in the current branch, but in another (for instance gimp-2-8). + +'''Cause:''' +For some reasons a recent '''git checkout''' did not delete them. Now these zombies lie around to frighten poor developers. + +'''Solution:''' + +# Remove them from your disk. +# If you noticed this error in your IDE then refresh your workspace there (in Eclipse: right click on your project, then click '''Refresh'''). + + + + +====Pull error: 'Insufficient permission for adding an object to repository database .git/objects'==== + +'''Problem:''' +On pulling Git shows me the aforementioned error. + +'''Cause:''' +Permission issues in your file system. + +'''Solution:''' + +# Change into your directory where the project's .git folder resides. Usually this is the working directory. +# On Linux or OS X run '''sudo chown -R gituser:gituser .git/objects''' (replace gituser with your user name). On Windows right click on the .git/objects folder, choose 'Properties', choose the 'Security' tab, click the 'Advanced' button, choose the 'Owner' tab, click the 'Edit...' button. Set the file owner for that folder and all files and subdirectories in it. See also the [http://www.techotopia.com/index.php/Understanding_Windows_Server_2008_File_and_Folder_Ownership_and_Permissions#Taking_and_Transferring_Windows_Server_2008_File_and_Folder_Ownership Techotopia tutorial] + + + + + + +===Eclipse=== + +====Eclipse marks untouched files as dirty==== + +'''Problem: Eclipse shows dirty files and folders I have never touched''' + See the related Git error. + + + + +===See also=== + +* [https://git-scm.com/doc Git documentation (man pages, reference manual, videos, links)] +* [https://git-scm.com/book The Git online book] +* [https://git-scm.com/community Git community support] +* [https://stackoverflow.com/questions/tagged/git Git questions at Stackoverflow.com] + + + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + + + +* [https://eclipse.org/egit/support/ Eclipse EGit support site] +* [https://www.eclipse.org/jgit/support/ Eclipse JGit support site] +* [https://stackoverflow.com/questions/tagged/egit Eclipse EGit questions at Stackoverflow.com] + +==Translate== + +====Lots of merge conflicts in GIMP master==== + +'''Problem: I'm translating on the current production branch of GIMP (2-8 etc.) and on master. I'd like to cherry-pick my changes from the production branch to the master branch. But I get lots of merge conflicts and changes I never introduced.''' +'''Cause:''' +Cherry-picking translations from the production branch into the master branch doesn't work. + +'''Solution:''' +Commit your translation updates directly into the master branch or try to merge your translation branch into the master branch. + + + + + +====See also==== + +* [https://mail.gnome.org/archives/gegl-developer-list/ GEGL Developer mailing list] +* GEGL IRC channel + +* [https://mail.gnome.org/archives/gimp-developer-list/ GIMP Developer mailing list] +* GIMP IRC channel + +* [http://www.gnu.org/software/gettext/manual/gettext.html GNU gettext manual] +* [http://www.gnu.org/software/gettext/FAQ.html GNU gettext FAQ] + +* [https://wiki.gnome.org/TranslationProject GNOME Translation project wiki] + +* [http://www.poedit.net/support.php Poedit support] +* [http://stackoverflow.com/questions/tagged/poedit Poedit questions at Stackoverflow.com] + +* [http://docs.translatehouse.org/projects/virtaal/en/latest/ Virtaal documentation] + +==Runtime Errors== + +Warnings and errors displayed in a terminal/console in which you started GIMP from a command line. + +Many are just clutter, that make it hard to find severe errors from code you are testing. + + + + + +===='GEGL-Message: 14:09:17.687: Module '/usr/local/lib/x86_64-linux-gnu/libgegl-npd-0.4.so' load error: Missing gegl_module_query() symbol ?'==== + +'''Problem:''' +GIMP starts, but the terminal displays many messages similar to the above, when plugins are loaded. +It is not clear whether these messages affect functioning, they might just be annoying warnings. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building'. The environment variable GEGL_PATH must reference the top gegl directory, not just its parent. +Referencing the parent is sufficient for GIMP to start, but not for plugins to load without these warnings. + + + + + +====GIMP fails to start with error, 'GIMP requires the GEGL operation "gegl:alien-map"'==== + +'''Problem:''' +GIMP starts fails to start, with the message above. + +'''Cause:''' +Missing environment variables. + +'''Solution:''' +See above under 'Building' + + + + + +====A plugin fails to appear in the menus, with error like "GIMP-WARNING: gimp-2.xx: gimp_wire_read(): error"==== + +'''Problem:''' +GIMP starts, but a plugin does not appear in the GIMP menus as expected, and the terminal shows the above message. + +'''Cause:''' +At startup, GIMP searches certain directories for plugins (executables and interpretable text files) and "queries" them. +This means it starts them in a separate process and then communicates with them over a 'wire' i.e. interprocess communication. +If the plugin crashes or fails to respond, Gimp gives the error above. +You probably installed a plugin that is fatally flawed. + +'''Solution:''' +Remove the plugin. To see which plugin to remove, start Gimp with the '--verbose' flag, and it will print the pathname of plugin files as it queries them. + +To debug the flawed plugin, you can use print statements. + +An interpreted plugin may fail very early in its text, for example in the hashbang i.e. '#!/usr/bin/env python' statement on the first line, +or in an import statement. + + + + + +====Chain of python exceptions beginning with gi.RepositoryError: Typelib file for namespace 'Gegl', version '0.4' not found==== + +'''Problem:''' +On startup, GIMP starts but shows a long chain of Python exceptions. The root exception (the first in the list) is as above. Affects loading of plugins. + +'''Cause:''' +Python is using GLib introspection, but can't find the typelibs for GIMP. Typelibs are in a directory named girepository-1.0. The GIMP typelib is named like "Gimp-3.0.typelib". + +'''Solution:''' +Define environment variable GI_TYPELIB_PATH. For example, export GI_TYPELIB_PATH=/usr/local/lib/x86_64-linux-gnu/girepository-1.0:/usr/local/lib/girepository-1.0 . The example is for Ubuntu 19.10. You may want to change the prefix of the paths, for example using the GIMP_PREFIX environment variable (if you use it.) + +The typelibs for GIMP, Gegl, and Babl might be on different paths (as in the example.) + + + + + +====Gtk-Message: 19:04:46.797: Failed to load module "canberra-gtk-module"==== + +'''Problem:''' +Terminal often displays message like above. Does not affect operation, except sounds may be missing? + +'''Cause:''' +Package libcanberra-gtk3-module is missing. + +'''Solution:''' +Install missing package, for example: sudo apt-get install libcanberra-gtk3-module + + + + + +====(gimp-2.99:xx): dbind-WARNING **: 09:35:43.023: Couldn't register with accessibility bus:==== + +'''Problem:''' +Terminal often shows message like above. Does not affect operation, unless you need accessibility i.e. are visually or hearing impaired. + +'''Cause:''' +Seems to be a long-standing bug in Linux distributions. + +'''Solution:''' +In your environment, export NO_AT_BRIDGE=1 + + + + + +====luajit: ...mp/2.99/plug-ins/goat-exercise-lua/goat-exercise-lua.lua:22: module 'lgi' not found:==== + +'''Problem:''' +On startup, terminal shows a message that begins like above and ends with "GIMP-WARNING: gimp-2.99: gimp_wire_read(): error". +Affects loading of lua language plugins. +In the development branch of GIMP, a set of "goat-exercise-foo" plugins exercise some GObject Introspection language bindings (C, Python, Lua, JS, Scheme, Perl ?) + +'''Cause:''' +Package lua-lgi is missing. + +'''Solution:''' +Install the package. + + + + + +====On Ubuntu: Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Icon 'image-missing' not present in theme Symbolic (gtk-icon-theme-error-quark, 0==== + +'''Problem:''' +On Ubuntu (only?), when using a plugin that opens a Gtk3 file chooser widget, terminal shows a message as above, and plugin crashes. + +'''Cause:''' +Package gnome-icon-theme is missing. See [https://gitlab.gnome.org/GNOME/gimp/-/issues/2029 https://gitlab.gnome.org/GNOME/gimp/-/issues/2029]. + +'''Solution:''' +Install the package. If you are not building Gimp yourself, apparently this issue is fixed by the packaging of Gimp having a dependency on package gnome-icon-theme. + + + + + +====(gimp-2.99:xx): dconf-WARNING **: 13:59:42.430: failed to commit changes to dconf: Failed to execute child process ?dbus-launch? (No such file or directory)==== + +'''Problem:''' +The message appears as you start a plugin. It seems harmless unless you have configured GLib to stop on warnings, or if you want to use the services of [https://en.wikipedia.org/wiki/D-Bus dbus] +'''Cause:''' +This is a warning from GLib. Gimp is usually built to support dbus (but can be configured without that support?) The message means that when Gimp attempted to execute the command 'dbus-launch', it could not be found on the system. + +'''Solution:''' +Install package dbug-x11, or whichever package contains the executable command dbus-launch. + + + + + +==Templates== + +====Template for investigated solutions==== + +'''Problem:''' +'''Cause:''' +'''Solution:''' + + +====Template for workarounds==== + +'''Problem:''' +'''Workaround:''' + +Anyway, this is just a workaround. If you know the cause and a proper solution, feel free to edit this posting. + + \ No newline at end of file diff --git a/wiki/Hacking:ScriptFu-20210515114158-show.txt b/wiki/Hacking:ScriptFu-20210515114158-show.txt new file mode 100644 index 0000000..e3fdbe4 --- /dev/null +++ b/wiki/Hacking:ScriptFu-20210515114158-show.txt @@ -0,0 +1,343 @@ + + +ScriptFu refers to GIMP support for plugins written in the Scheme language. + +The GIMP Scheme interpreter implements TinyScheme, a dialect of the Scheme language, +a dialect of the Lisp language. +The GIMP TinyScheme interpreter specializes it for image processing, adding a few more symbols to the TinyScheme language. + +Some Scheme plug-ins are distributed with GIMP and some are distributed by third parties. + +This describes GIMP 2 and GIMP 3 plugins. ScriptFu is mostly unchanged from GIMP 2 to GIMP 3, except to accomodate changes to GIMP itself. + + + + + +__TOC__ + +==Audience== + +This is mainly for authors of third party plugins. This page is a basic introduction with references to further reading. This is somewhat about programming language theory: ScriptFu as a language. + +There are many Scheme plugins in the GIMP repository, providing important capabilities of GIMP. If you write a particularly useful Scheme plugin, it could find its way into the GIMP repository. + +If you are interested in enhancing the Scheme interpreter of GIMP, it is written in C and its source is in the GIMP repository under /gimp/plug-ins/script-fu. + + + + + +==Overview== + +GIMP plug-ins let you program image manipulation algorithms. Scheme language GIMP plug-ins are interpreted. They can call procedures in the GIMP Procedural Database (PDB) as well as the functions built into the Scheme language. They are distributed as text files called scripts with suffix ".scm". They are registered in the PDB with a name like "script-fu-...". They may appear in the GIMP user interface, in pull-down or pop-up menus. + + + + + +==Tutorials== + +[https://docs.gimp.org/en/gimp-using-script-fu-tutorial.html A tutorial] +[https://gimpbook.com/scripting/ Another tutorial from a paper book.] +[https://www.seul.org/~grumbel/gimp/script-fu/script-fu-tut.html An out-of-date tutorial] + +Installation and debugging is covered in the tutorials. + + + + + +==Scheme plugins and the GIMP Procedural DataBase (PDB)== + +Scheme plugins are ''in'' the PDB and ''call'' the PDB + + +====Calling procedures in the PDB==== + +Scheme language plugins can call PDB procedures, as well as functions of the Scheme language. +(They do not call functions from the libgimp library.) +Example Scheme constructs for calling a PDB procedure: + +: (script-fu-clothify image drawable 1 2 3 4 5) calls the PDB procedure script-fu-clothify, which is another plugin + + +: (gimp-image-get-drawables image ) calls an internal procedure, more or less the get-drawables method of the Image class of the Gimp module + + + +PDB procedures called from a Scheme plugin return a list. + + +====Scheme plugins in the PDB==== + +Scheme language plugins are also ''in'' the PDB. +Plug-ins register themselves in the PDB. +The functions built into the interpreter for registering a plugin are: + + +* script-fu-register +* script-fu-menu-register + +Registration means declaring: + + +* the name and parameters of a plug-in (the signature) +* other metadata such as help and author +* declaring how and where a plug-in will appear in the GIMP menus, if at all. + +ScriptFu plugins can return a value, when the script's run function's last line is a simple reference to a symbol. +Unlike GIMP plugins in other languages, you do not register the types of return values. + +All plugins understand a runtime "run mode". +In NONINTERACTIVE (batch) mode, they do not provide a user interface. +Most plugins take a run mode parameter. +When a plugin calls a plugin, it usually passes a run mode. +PDB procedures that are kind "Internal" do not usually accept a run mode parameter. + + + + + +==The language for defining ScriptFu plugin parameters== + +This is covered by many tutorials. + +The only official documentation seems to be in the comments of the +[https://gitlab.gnome.org/GNOME/gimp/-/blob/master/plug-ins/script-fu/scripts/test-sphere.scm test-sphere.scm plugin in the GIMP repository.] + +Parameters are declared using a set of constants declared by the interpreter, the SF_... constants (an enumeration.) + +Each parameter is declared by a triple of arguments to the script-fu-register function. + +Each triple comprises: + + +* a SF_... constant +* a string name +* a list that further specifies the parameter, the list contents depending on the SF_... constant + +Most SF_... constants denote not only the type of the parameter, but how it appears in the dialog that ScriptFu can present in the GIMP GUI. +(What kind of control widget will appear in the GUI.) + + + + + +==GIMP constants in ScriptFu== + +The ScriptFu interpreter also recognizes symbols for constants defined by GIMP. +You use these symbols as arguments in calls to PDB procedures. +They are generally of the form GIMP-... , that is, upper case with hyphens. + + + + + +==Examples and templates== + +Many examples can be found in the tutorials. + +Many examples are in the [https://gitlab.gnome.org/GNOME/gimp/-/tree/master/plug-ins/script-fu/scripts GIMP repository at /gimp/plug-ins/script-fu/scripts]. + + + +A very brief and incomplete example, giving the basic structure of a plugin, is: + +
    +(define (script-fu-my-plugin 
    +...
    +)      )
    +(script-fu-register "script-fu-my-plugin"
    +...
    +)
    +(script-fu-menu-register "script-fu-my-plugin"
    +...
    +)
    +
    + +In the above example, you define the "run function" of your plugin, then call two functions to register it. +After you install your script, your plugin will be in the PDB, and may appear in the GIMP GUI. + + + + + + + +==The Tiny Scheme language== + +[http://en.wikipedia.org/wiki/Scheme_%28programming_language%29 Scheme] is a dialect of Lisp. Lisp is a pure programmer's language with a very simple syntax. + +GIMP provides a subset of the Scheme language called TinyScheme. +The set of functions implemented by the TinyScheme interpreter of GIMP is smaller than the set implemented by the full Scheme language. +But you can textually include third party Scheme functions inside your plug-in. + +[https://schemers.org/Documents/Standards/R5RS/HTML/ Revised5 Report on the Algorithmic Language Scheme] + +Early versions of GIMP used a different dialect of Lisp for ScriptFu plugins (called SIOD.) You may occasionally find ancient scripts in that dialect. + +[https://www.gimp.org/docs/script-fu-update.html A history and porting guide for GIMP TinyScheme plugins] +[https://gitlab.gnome.org/GNOME/gimp/-/blob/master/plug-ins/script-fu/tinyscheme/Manual.txt The language manual for TinyScheme as used by GIMP.] + +Lisp is beautiful because it is can be interpreted by a small program (an interpreter for Lisp written in Lisp can be a few tens of lines.) +ScriptFu (the plugin support offered by GIMP) is implemented by a small interpreter +written in the C language, part of GIMP + + + + + +==Internationalization== + +You can declare intent to internationalize strings in ScriptFu plugins using "_" notation before strings, for example: + + _"Clothify..." + +You only need to internationalize strings that appear in the GUI. + +Getting people to translate your strings is another matter. + + + + + +==The ScriptFu Console== + +You can open a '''ScriptFu Console''' using the menu item '''Filters>Development>Script-Fu>Script-Fu Console'''. + +The console is a window executing a REPL, a read-evaluate-print-loop. +That is, you enter a construct in the ScriptFu language, enter Return, and see a printed result. + +The console executes in the current context of the GIMP app. +Thus for example, in the console: + + (gimp-get-images) + +will return, and print the representation of, a list whose first element is the number of images, and whose second element is a vector of image ID's. + +The '''ScriptFu Console''' lets you browse the PDB. +It shows the signature of PDB procedures in terms of C language types, +so you must mentally translate into Scheme language. + +The '''Apply''' button in the '''Script-Fu Procedure Browser''' will translate for you and paste a construct into the '''Script-Fu Console'''. +Then you can enter Return in the console to execute the pasted construct. + + + + + +==Debugging ScriptFu scripts== + +===Print GIMP messages=== + +You can print to the message bar of the GIMP app using: + + (gimp-message "my message") + +The messages are ephemeral, only visible until the next message overwrites it. + + +===Enable tracing=== + +You can enable the tracing feature of the interpreter using: + + (trace 1) + +usually at the start of your script. +This will make the interpreter print many messages about its execution, +to the console (terminal, i.e. to stdout/stderr) where the GIMP app was started. +The trace is not easy to understand, +it shows the nested or recursive nature of Lisp interpretation. +The trace is most useful to explain any errors in Scheme syntax. +The trace is less useful to explain errors in calls to PDB procedures. + + +===Write to a console=== + +You can write to the console using: + + (write "my message" (open-output-file "/dev/stderr")) + +That will write to the console where the GIMP app was started. + +You can also use other Scheme I/O functions to say write to a file. +Scheme uses "port" objects. +The call above to open-output-file returns a port object. + + +===Enable ScriptFu logging of PDB calls=== + +Starting with GIMP 3, the ScriptFu interpreter uses GLib logging. +You can enable it by setting an environment variable before starting the GIMP app in a console: + + export G_MESSAGES_DEBUG=scriptfu + +Then the ScriptFu interpreter will print many messages about its interpretation of calls to the PDB. + +For example: + +( script-fu:102): scriptfu-DEBUG: 12:50:33.159: In script_fu_marshal_procedure_call() + + + + +===ScriptFu warnings go to a console=== + +If you suspect errors in a script, it it important to start GIMP in a console, +since ScriptFu prints warnings to the console. + +For example, you may see: + + (script-fu:102): scriptfu-WARNING **: 12:45:44.166: in script, permitting too few args to gimp-edit-copy + +These warnings do not depend on setting the environment variable G_MESSAGES_DEBUG. + + + + + +==ScriptFu uses numeric GIMP object ID's== + +GIMP identifies its objects with numeric ID's (as well as with C pointers.) +ScriptFu uses the numeric ID's internally. + +This is opaque to scripts. That is, ordinarily you need not think about it. +You store returned objects in Scheme variables without worrying about it. +However, a printed representation of a GIMP object appears as a numeral. +And you could use a literal numeral when a reference to a GIMP object is required (in extraordinary circumstances.) + + + + + +==ScriptFu architecture== + +The ScriptFu interpreter and the ScriptFu Console are "GIMP extensions", that is, separate processes. +The ScriptFu interpreter receives a message from the GIMP app when you choose certain menu items. + +If the ScriptFu interpreter crashes, you must restart GIMP. + +The ScriptFu interpreter process reads all scripts when it starts. +If you edit a script, you can ask the running ScriptFu interpreter process to reread the scripts. +Use the menu item '''Filters>Development>Script-Fu>Refresh Scripts''' +You can't do this when a script is already running (while its dialog is up.) + +(The architecture is different for other interpreters, e.g. the Python interpreter, +in which case the interpreter is started, and terminates, when you choose a menu item.) + + + + + +==Future directions using GObject introspection== + +Starting with GIMP 3, the preferred architecture for plugins uses GObject introspection (GI) of the libgimp API. +For example, a GIMP Python plugin usually uses the PyGObject module for GObject introspection. + +GIMP developers are considering replacing the ScriptFu interpreter with a standard Lisp interpreter (Guile) +that might be capable of GObject introspection. + +The ScriptFu interpreter is not capable of GObject introspection. + + \ No newline at end of file diff --git a/wiki/Hacking:Source_Tree-20161024001818-edit.txt b/wiki/Hacking:Source_Tree-20161024001818-edit.txt new file mode 100644 index 0000000..e13965c --- /dev/null +++ b/wiki/Hacking:Source_Tree-20161024001818-edit.txt @@ -0,0 +1,146 @@ +This page describes how the GIMP source is organized - it will describe what's inside each directory of GIMP, and should help you navigate your way through the source. + += The app directory = +The app directory contains the source code of GIMP itself, without any external tools or plugins. The only exception for that is the testing framework of GIMP which is also included here. + +== app/actions == +The files inside this folder include mapping of functions from GIMP's core to visible parts in the user interface. + +== app/base == +This files inside this folder include basic commands to preform on the image - such as Curves, Colorize. It also includes the source for pixel data structures including the PixelRegion and the tiles. Also some utility functions (for example getting the number of processors in a system) and some other algorithms (like SIOX). + +== app/composite == +This folder includes source which is architecture specific, to do the calculations of the paint modes in an optimized-way (by making sure that only things that need to be done will be done). + +== app/config == +This folder includes the files responsible for saving and loading the configurations of GIMP from the rc files. + +== app/core == +This folder is truly the guts of GIMP. It contains most of the objects that GIMP deals with - guides, brushes, drawables, images,... If you want to do something to the way objects in GIMP behave or if you want to implement a new type of objects (for example, angular guides, vector layers, ...) this is the first place you'd want to look at. +Note that almost every change in this directory requires changes in other places - for example, if I want to implement a new type of layers (let's say vector layers) then you would also need to update the layers tree widget (and not to mention many other things). +"Massive" hacks that are not just for implementing one tool or another, but to change/add new objects to GIMP will start here, and will affect many other parts of GIMP so be prepared for lots of work when changing things in here. + +== app/dialogs == +The code of all GIMP's dialogs, is inside this directory. Any dialog including simple ones (like renaming a layer) and the most complex ones (Like the preferences dialog) can be found in this directory. + +Dialogs should not be confused with dockable areas: + +* Dialogs are things which open in response to a specific action. These are not dockable, meaning that they will always be in a floating window of their own +* Dockables (or Docks in short) are parts of the user interface which can be open all of the time and don't have to be available only as a result of a specific action. Dockables can either "float around" like dialogs, or you can drag and drop them to other docks, in order to organize them together in a single window (You "dock" one dockable inside the other). + +Examples: +* Editing a layer's name is done inside a dialog since it's a response to a request to edit the name of a specific layer +* The brushes dialog is a dockable since it makes sense to have it open all the time + +The definition of what should be a dock and what should be a dialog is sometimes unclear. But by taking a brief look inside this directory, it's usually very easy to find from the file names if what you are looking for is a dialog or not. + +The source of the GIMP docks can be found in [[#app/widgets]] + +== app/display == +This directory contains the code of the image display. This includes the image projection (i.e. the process of combining the data from all the layers, channels, etc. to an image which can be displayed on screen), the and various functions to draw on the canvas itself (these functions are used to draw guides, grids, and the controls of some tools). + +Note that although the functions for drawing on the canvas are all located here, the actual code who calls these functions (for example, the code of the rectangle tool which calls these function to draw lines on the canvas) is often located somewhere else + +== app/file == +This folder contains the functions which call the appropriate file handlers when opening/saving different kinds of files. I.E. these folders don't contain nay code to handle any specific file type, but instead they contain the code to identify and call the appropriate file handler. + +== app/gegl == +This folder contains code for interaction between GEGL and GIMP. This includes some of GIMP's operations that were ported to GEGL (such as colorize, brightness and contrast, curves) and other code to transfer data between GIMP and GEGL. + +== app/gui == +This folder contains the code of the skeleton of GIMP's graphical user interface. I.E. it does not contain the code of specific dialogs or widgets - instead it contains base-classes for GIMP's windows and some more code to manage them. An example for a major work here was the implementation of single window mode in GIMP. + +== app/menus == +This folder contains the code of some of the menus. Note that this is NOT where you'll find the menu path of different actions. + +== app/paint == +This folder contains the source of GIMP's '''paint''' tools - which are define to be + +* Tools for painting - Paintbrush, Ink, Clone, ... +* Transformation tools - Move, Rotate, Scale, ... +* The Paths tool + +These should be distinguished from the '''base''' tools - see [[#app/base]] + +Note that the code in this directory only contains the algorithms of the tools. The code for interacting with the user interface is located inside [[#app/tools]] + +== app/paint-funcs == +This folder contains various functions which are commonly used by the paint tools - Layer modes, Image Samplers and conversions between pixel modes (indexed, rgb, etc.) + +== app/pdb == +This folder contains '''auto-generated''' (don't edit files in this folder!) code for exposing internal GIMP functions to the PDB. The code inside this directory is generated by the pdbgen tool which is located under [[#tools/pdbgen]]. + +For more information about pdbgen, see [[Hacking:pdbgen]]. + +== app/tests == +This folder includes many tests for GIMP, which are usually preformed before new releases to try and make sure that all the major features work correctly. + +== app/text == +This folder contains the source of GIMP's text core. This includes the function to render text, and the structures for keeping it's properties. + +== app/tools == +Here is the source code of the tools which are exposed to the user. The code here is mainly the code for the user interface, and not the actual algorithm which performs the tools operation. The actual source of the tools operation can usually be found in [[#app/paint]] and for some tools (such as the selection tools) in [[#app/core]]. +Note that for some tools which are currently in a development phase (such as the text tool), some of the code may hide in different places (for example, some of the text tool's code is currently inside [[#app/widgets]] inside the code of the on-canvas text editor) + +== app/vectors == +Here is the code for handling paths (vectors) inside GIMP. + +== app/widgets == +Most of the custom user interface elements which are used by GIMP, are located inside this folder. This includes everything from simple color buttons to the custom view of the layer stacks. + +As the name states, most of the things in this directory are widgets and not stand-alone dialogs! do not get confused with [[#app/dialogs]] +== app/xcf == + += The cursors directory = +This directory contains all the cursor images which GIMP uses. Directly under this directory, you can find all the bitmap images of the cursors. + +== cursors/xbm == +This directory contains the images of the cursors, converted to XBM files - these are C header files which have the data of the cursors encoded in binary directly into them. + += The data directory = +This directory contains various data files which ship with GIMP - brushes, gradients, palettes, etc. +Details of the subdirectories are omitted as these are obvious =) + += The desktop directory = +This folder contains various data files files which are required for installing GIMP. These are mainly GIMP's icon in different sizes, and some linux .desktop files (similar to shortcut files in windows). + += The devel-docs directory = +This folder contains documentation for developing GIMP. Most of it is autogenerated by a tool called gtk-doc, directly from comments in the source file. + +Some interesting docs there are +* Documentations of the native file formats GIMP uses for it's brushes, images, patterns, etc. +* Notes for developers on the steps required to make a release +* Schedules +* GIMP's dependancies +* more... + += The docs folder = +This folder includes documentation of GIMP's command line options (man pages), and some source files for creating different versions of Wilber (GIMP's mascot!) + += The etc folder = +This folder contains default rc files (configuration files), that should be installed with GIMP. + += The libgimp* directories = +These directories include functions and other stuff which GIMP exposes for usage by plugins and extensions. Some of the files inside these directories are auto-generated by the pdbgen tool (see [[#tools/pdbgen]]) and therefore should not be edited. + += The menus folder = +This folder includes XML files which specify the location to register many of GIMP's actions inside the menus. + += This modules folder = +This folder contains source code of modules for GIMP - such as special color pickers (CMYK and water paint) and some other modules. See [[Hacking::Modules]] for more info + += The plug-ins directory = +This folder includes the source off all of GIMP's plug-ins. Plug-ins which are big and/or require several files are usually located in their own subdirectory, while the smaller/simpler plugins are located under the plug-ins/common. + += The po directories = +The po, po-libgimp, po-plug-ins, po-python, po-script-fu, po-tags and po-tips directories, contain files for internationalization (i18n) of GIMP. Basically, these are text files with strings from GIMP's source, together with their translation to different languages. +Please see [[i18n:How-to]] for more details on the files inside these directories. + += The themes directory = +This directory contains the GIMP's themes. The topic of GIMP themes can be found in [[Hacking:Themes]] + += The tools directory = +This directory contains miscellaneous tools which are used for developing GIMP. Currently, the only tool in that directory is the pdbgen tool. + +== tools/pdbgen == +More on that the pdbgen tool can be found in [[Hacking:pdbgen]]. diff --git a/wiki/Hacking:Source_Tree-20170706070708-show.txt b/wiki/Hacking:Source_Tree-20170706070708-show.txt new file mode 100644 index 0000000..14be8e9 --- /dev/null +++ b/wiki/Hacking:Source_Tree-20170706070708-show.txt @@ -0,0 +1,228 @@ + + +This page describes how the GIMP source is organized - it will describe what's inside each directory of GIMP, and should help you navigate your way through the source. + + +__TOC__ + +=The app directory= + +The app directory contains the source code of GIMP itself, without any external tools or plugins. The only exception for that is the testing framework of GIMP which is also included here. + + +==app/actions== + +The files inside this folder include mapping of functions from GIMP's core to visible parts in the user interface. + + +==app/base== + +This files inside this folder include basic commands to preform on the image - such as Curves, Colorize. It also includes the source for pixel data structures including the PixelRegion and the tiles. Also some utility functions (for example getting the number of processors in a system) and some other algorithms (like SIOX). + + +==app/composite== + +This folder includes source which is architecture specific, to do the calculations of the paint modes in an optimized-way (by making sure that only things that need to be done will be done). + + +==app/config== + +This folder includes the files responsible for saving and loading the configurations of GIMP from the rc files. + + +==app/core== + +This folder is truly the guts of GIMP. It contains most of the objects that GIMP deals with - guides, brushes, drawables, images,... If you want to do something to the way objects in GIMP behave or if you want to implement a new type of objects (for example, angular guides, vector layers, ...) this is the first place you'd want to look at. +Note that almost every change in this directory requires changes in other places - for example, if I want to implement a new type of layers (let's say vector layers) then you would also need to update the layers tree widget (and not to mention many other things). +"Massive" hacks that are not just for implementing one tool or another, but to change/add new objects to GIMP will start here, and will affect many other parts of GIMP so be prepared for lots of work when changing things in here. + + +==app/dialogs== + +The code of all GIMP's dialogs, is inside this directory. Any dialog including simple ones (like renaming a layer) and the most complex ones (Like the preferences dialog) can be found in this directory. + +Dialogs should not be confused with dockable areas: + + +* Dialogs are things which open in response to a specific action. These are not dockable, meaning that they will always be in a floating window of their own +* Dockables (or Docks in short) are parts of the user interface which can be open all of the time and don't have to be available only as a result of a specific action. Dockables can either "float around" like dialogs, or you can drag and drop them to other docks, in order to organize them together in a single window (You "dock" one dockable inside the other). + +Examples: + + +* Editing a layer's name is done inside a dialog since it's a response to a request to edit the name of a specific layer +* The brushes dialog is a dockable since it makes sense to have it open all the time + +The definition of what should be a dock and what should be a dialog is sometimes unclear. But by taking a brief look inside this directory, it's usually very easy to find from the file names if what you are looking for is a dialog or not. + +The source of the GIMP docks can be found in #app/widgets + + +==app/display== + +This directory contains the code of the image display. This includes the image projection (i.e. the process of combining the data from all the layers, channels, etc. to an image which can be displayed on screen), the and various functions to draw on the canvas itself (these functions are used to draw guides, grids, and the controls of some tools). + +Note that although the functions for drawing on the canvas are all located here, the actual code who calls these functions (for example, the code of the rectangle tool which calls these function to draw lines on the canvas) is often located somewhere else + + +==app/file== + +This folder contains the functions which call the appropriate file handlers when opening/saving different kinds of files. I.E. these folders don't contain nay code to handle any specific file type, but instead they contain the code to identify and call the appropriate file handler. + + +==app/gegl== + +This folder contains code for interaction between GEGL and GIMP. This includes some of GIMP's operations that were ported to GEGL (such as colorize, brightness and contrast, curves) and other code to transfer data between GIMP and GEGL. + + +==app/gui== + +This folder contains the code of the skeleton of GIMP's graphical user interface. I.E. it does not contain the code of specific dialogs or widgets - instead it contains base-classes for GIMP's windows and some more code to manage them. An example for a major work here was the implementation of single window mode in GIMP. + + +==app/menus== + +This folder contains the code of some of the menus. Note that this is NOT where you'll find the menu path of different actions. + + +==app/paint== + +This folder contains the source of GIMP's '''paint''' tools - which are define to be + + +* Tools for painting - Paintbrush, Ink, Clone, ... +* Transformation tools - Move, Rotate, Scale, ... +* The Paths tool + +These should be distinguished from the '''base''' tools - see #app/base + +Note that the code in this directory only contains the algorithms of the tools. The code for interacting with the user interface is located inside #app/tools + + +==app/paint-funcs== + +This folder contains various functions which are commonly used by the paint tools - Layer modes, Image Samplers and conversions between pixel modes (indexed, rgb, etc.) + + +==app/pdb== + +This folder contains '''auto-generated''' (don't edit files in this folder!) code for exposing internal GIMP functions to the PDB. The code inside this directory is generated by the pdbgen tool which is located under #tools/pdbgen. + +For more information about pdbgen, see [[Hacking:pdbgen]]. + + +==app/tests== + +This folder includes many tests for GIMP, which are usually preformed before new releases to try and make sure that all the major features work correctly. + + +==app/text== + +This folder contains the source of GIMP's text core. This includes the function to render text, and the structures for keeping it's properties. + + +==app/tools== + +Here is the source code of the tools which are exposed to the user. The code here is mainly the code for the user interface, and not the actual algorithm which performs the tools operation. The actual source of the tools operation can usually be found in #app/paint and for some tools (such as the selection tools) in #app/core. +Note that for some tools which are currently in a development phase (such as the text tool), some of the code may hide in different places (for example, some of the text tool's code is currently inside #app/widgets inside the code of the on-canvas text editor) + + +==app/vectors== + +Here is the code for handling paths (vectors) inside GIMP. + + +==app/widgets== + +Most of the custom user interface elements which are used by GIMP, are located inside this folder. This includes everything from simple color buttons to the custom view of the layer stacks. + +As the name states, most of the things in this directory are widgets and not stand-alone dialogs! do not get confused with #app/dialogs + + +==app/xcf== + +=The cursors directory= + +This directory contains all the cursor images which GIMP uses. Directly under this directory, you can find all the bitmap images of the cursors. + + +==cursors/xbm== + +This directory contains the images of the cursors, converted to XBM files - these are C header files which have the data of the cursors encoded in binary directly into them. + + +=The data directory= + +This directory contains various data files which ship with GIMP - brushes, gradients, palettes, etc. +Details of the subdirectories are omitted as these are obvious =) + + +=The desktop directory= + +This folder contains various data files files which are required for installing GIMP. These are mainly GIMP's icon in different sizes, and some linux .desktop files (similar to shortcut files in windows). + + +=The devel-docs directory= + +This folder contains documentation for developing GIMP. Most of it is autogenerated by a tool called gtk-doc, directly from comments in the source file. + +Some interesting docs there are + + +* Documentations of the native file formats GIMP uses for it's brushes, images, patterns, etc. +* Notes for developers on the steps required to make a release +* Schedules +* GIMP's dependancies +* more... + +=The docs folder= + +This folder includes documentation of GIMP's command line options (man pages), and some source files for creating different versions of Wilber (GIMP's mascot!) + + +=The etc folder= + +This folder contains default rc files (configuration files), that should be installed with GIMP. + + +=The libgimp* directories= + +These directories include functions and other stuff which GIMP exposes for usage by plugins and extensions. Some of the files inside these directories are auto-generated by the pdbgen tool (see #tools/pdbgen) and therefore should not be edited. + + +=The menus folder= + +This folder includes XML files which specify the location to register many of GIMP's actions inside the menus. + + +=This modules folder= + +This folder contains source code of modules for GIMP - such as special color pickers (CMYK and water paint) and some other modules. See [http://wiki.gimp.org/index.php?title=Hacking::Modules&action=edit&redlink=1 Hacking::Modules] for more info + + +=The plug-ins directory= + +This folder includes the source off all of GIMP's plug-ins. Plug-ins which are big and/or require several files are usually located in their own subdirectory, while the smaller/simpler plugins are located under the plug-ins/common. + + +=The po directories= + +The po, po-libgimp, po-plug-ins, po-python, po-script-fu, po-tags and po-tips directories, contain files for internationalization (i18n) of GIMP. Basically, these are text files with strings from GIMP's source, together with their translation to different languages. +Please see [http://wiki.gimp.org/index.php?title=I18n:How-to&action=edit&redlink=1 i18n:How-to] for more details on the files inside these directories. + + +=The themes directory= + +This directory contains the GIMP's themes. The topic of GIMP themes can be found in [http://wiki.gimp.org/index.php?title=Hacking:Themes&action=edit&redlink=1 Hacking:Themes] + + +=The tools directory= + +This directory contains miscellaneous tools which are used for developing GIMP. Currently, the only tool in that directory is the pdbgen tool. + + +==tools/pdbgen== + +More on that the pdbgen tool can be found in [[Hacking:pdbgen]]. + + \ No newline at end of file diff --git a/wiki/Hacking:Source_Tree-20201028001831-edit.txt b/wiki/Hacking:Source_Tree-20201028001831-edit.txt new file mode 100644 index 0000000..e13965c --- /dev/null +++ b/wiki/Hacking:Source_Tree-20201028001831-edit.txt @@ -0,0 +1,146 @@ +This page describes how the GIMP source is organized - it will describe what's inside each directory of GIMP, and should help you navigate your way through the source. + += The app directory = +The app directory contains the source code of GIMP itself, without any external tools or plugins. The only exception for that is the testing framework of GIMP which is also included here. + +== app/actions == +The files inside this folder include mapping of functions from GIMP's core to visible parts in the user interface. + +== app/base == +This files inside this folder include basic commands to preform on the image - such as Curves, Colorize. It also includes the source for pixel data structures including the PixelRegion and the tiles. Also some utility functions (for example getting the number of processors in a system) and some other algorithms (like SIOX). + +== app/composite == +This folder includes source which is architecture specific, to do the calculations of the paint modes in an optimized-way (by making sure that only things that need to be done will be done). + +== app/config == +This folder includes the files responsible for saving and loading the configurations of GIMP from the rc files. + +== app/core == +This folder is truly the guts of GIMP. It contains most of the objects that GIMP deals with - guides, brushes, drawables, images,... If you want to do something to the way objects in GIMP behave or if you want to implement a new type of objects (for example, angular guides, vector layers, ...) this is the first place you'd want to look at. +Note that almost every change in this directory requires changes in other places - for example, if I want to implement a new type of layers (let's say vector layers) then you would also need to update the layers tree widget (and not to mention many other things). +"Massive" hacks that are not just for implementing one tool or another, but to change/add new objects to GIMP will start here, and will affect many other parts of GIMP so be prepared for lots of work when changing things in here. + +== app/dialogs == +The code of all GIMP's dialogs, is inside this directory. Any dialog including simple ones (like renaming a layer) and the most complex ones (Like the preferences dialog) can be found in this directory. + +Dialogs should not be confused with dockable areas: + +* Dialogs are things which open in response to a specific action. These are not dockable, meaning that they will always be in a floating window of their own +* Dockables (or Docks in short) are parts of the user interface which can be open all of the time and don't have to be available only as a result of a specific action. Dockables can either "float around" like dialogs, or you can drag and drop them to other docks, in order to organize them together in a single window (You "dock" one dockable inside the other). + +Examples: +* Editing a layer's name is done inside a dialog since it's a response to a request to edit the name of a specific layer +* The brushes dialog is a dockable since it makes sense to have it open all the time + +The definition of what should be a dock and what should be a dialog is sometimes unclear. But by taking a brief look inside this directory, it's usually very easy to find from the file names if what you are looking for is a dialog or not. + +The source of the GIMP docks can be found in [[#app/widgets]] + +== app/display == +This directory contains the code of the image display. This includes the image projection (i.e. the process of combining the data from all the layers, channels, etc. to an image which can be displayed on screen), the and various functions to draw on the canvas itself (these functions are used to draw guides, grids, and the controls of some tools). + +Note that although the functions for drawing on the canvas are all located here, the actual code who calls these functions (for example, the code of the rectangle tool which calls these function to draw lines on the canvas) is often located somewhere else + +== app/file == +This folder contains the functions which call the appropriate file handlers when opening/saving different kinds of files. I.E. these folders don't contain nay code to handle any specific file type, but instead they contain the code to identify and call the appropriate file handler. + +== app/gegl == +This folder contains code for interaction between GEGL and GIMP. This includes some of GIMP's operations that were ported to GEGL (such as colorize, brightness and contrast, curves) and other code to transfer data between GIMP and GEGL. + +== app/gui == +This folder contains the code of the skeleton of GIMP's graphical user interface. I.E. it does not contain the code of specific dialogs or widgets - instead it contains base-classes for GIMP's windows and some more code to manage them. An example for a major work here was the implementation of single window mode in GIMP. + +== app/menus == +This folder contains the code of some of the menus. Note that this is NOT where you'll find the menu path of different actions. + +== app/paint == +This folder contains the source of GIMP's '''paint''' tools - which are define to be + +* Tools for painting - Paintbrush, Ink, Clone, ... +* Transformation tools - Move, Rotate, Scale, ... +* The Paths tool + +These should be distinguished from the '''base''' tools - see [[#app/base]] + +Note that the code in this directory only contains the algorithms of the tools. The code for interacting with the user interface is located inside [[#app/tools]] + +== app/paint-funcs == +This folder contains various functions which are commonly used by the paint tools - Layer modes, Image Samplers and conversions between pixel modes (indexed, rgb, etc.) + +== app/pdb == +This folder contains '''auto-generated''' (don't edit files in this folder!) code for exposing internal GIMP functions to the PDB. The code inside this directory is generated by the pdbgen tool which is located under [[#tools/pdbgen]]. + +For more information about pdbgen, see [[Hacking:pdbgen]]. + +== app/tests == +This folder includes many tests for GIMP, which are usually preformed before new releases to try and make sure that all the major features work correctly. + +== app/text == +This folder contains the source of GIMP's text core. This includes the function to render text, and the structures for keeping it's properties. + +== app/tools == +Here is the source code of the tools which are exposed to the user. The code here is mainly the code for the user interface, and not the actual algorithm which performs the tools operation. The actual source of the tools operation can usually be found in [[#app/paint]] and for some tools (such as the selection tools) in [[#app/core]]. +Note that for some tools which are currently in a development phase (such as the text tool), some of the code may hide in different places (for example, some of the text tool's code is currently inside [[#app/widgets]] inside the code of the on-canvas text editor) + +== app/vectors == +Here is the code for handling paths (vectors) inside GIMP. + +== app/widgets == +Most of the custom user interface elements which are used by GIMP, are located inside this folder. This includes everything from simple color buttons to the custom view of the layer stacks. + +As the name states, most of the things in this directory are widgets and not stand-alone dialogs! do not get confused with [[#app/dialogs]] +== app/xcf == + += The cursors directory = +This directory contains all the cursor images which GIMP uses. Directly under this directory, you can find all the bitmap images of the cursors. + +== cursors/xbm == +This directory contains the images of the cursors, converted to XBM files - these are C header files which have the data of the cursors encoded in binary directly into them. + += The data directory = +This directory contains various data files which ship with GIMP - brushes, gradients, palettes, etc. +Details of the subdirectories are omitted as these are obvious =) + += The desktop directory = +This folder contains various data files files which are required for installing GIMP. These are mainly GIMP's icon in different sizes, and some linux .desktop files (similar to shortcut files in windows). + += The devel-docs directory = +This folder contains documentation for developing GIMP. Most of it is autogenerated by a tool called gtk-doc, directly from comments in the source file. + +Some interesting docs there are +* Documentations of the native file formats GIMP uses for it's brushes, images, patterns, etc. +* Notes for developers on the steps required to make a release +* Schedules +* GIMP's dependancies +* more... + += The docs folder = +This folder includes documentation of GIMP's command line options (man pages), and some source files for creating different versions of Wilber (GIMP's mascot!) + += The etc folder = +This folder contains default rc files (configuration files), that should be installed with GIMP. + += The libgimp* directories = +These directories include functions and other stuff which GIMP exposes for usage by plugins and extensions. Some of the files inside these directories are auto-generated by the pdbgen tool (see [[#tools/pdbgen]]) and therefore should not be edited. + += The menus folder = +This folder includes XML files which specify the location to register many of GIMP's actions inside the menus. + += This modules folder = +This folder contains source code of modules for GIMP - such as special color pickers (CMYK and water paint) and some other modules. See [[Hacking::Modules]] for more info + += The plug-ins directory = +This folder includes the source off all of GIMP's plug-ins. Plug-ins which are big and/or require several files are usually located in their own subdirectory, while the smaller/simpler plugins are located under the plug-ins/common. + += The po directories = +The po, po-libgimp, po-plug-ins, po-python, po-script-fu, po-tags and po-tips directories, contain files for internationalization (i18n) of GIMP. Basically, these are text files with strings from GIMP's source, together with their translation to different languages. +Please see [[i18n:How-to]] for more details on the files inside these directories. + += The themes directory = +This directory contains the GIMP's themes. The topic of GIMP themes can be found in [[Hacking:Themes]] + += The tools directory = +This directory contains miscellaneous tools which are used for developing GIMP. Currently, the only tool in that directory is the pdbgen tool. + +== tools/pdbgen == +More on that the pdbgen tool can be found in [[Hacking:pdbgen]]. diff --git a/wiki/Hacking:Source_Tree-20210515084512-edit.txt b/wiki/Hacking:Source_Tree-20210515084512-edit.txt new file mode 100644 index 0000000..e13965c --- /dev/null +++ b/wiki/Hacking:Source_Tree-20210515084512-edit.txt @@ -0,0 +1,146 @@ +This page describes how the GIMP source is organized - it will describe what's inside each directory of GIMP, and should help you navigate your way through the source. + += The app directory = +The app directory contains the source code of GIMP itself, without any external tools or plugins. The only exception for that is the testing framework of GIMP which is also included here. + +== app/actions == +The files inside this folder include mapping of functions from GIMP's core to visible parts in the user interface. + +== app/base == +This files inside this folder include basic commands to preform on the image - such as Curves, Colorize. It also includes the source for pixel data structures including the PixelRegion and the tiles. Also some utility functions (for example getting the number of processors in a system) and some other algorithms (like SIOX). + +== app/composite == +This folder includes source which is architecture specific, to do the calculations of the paint modes in an optimized-way (by making sure that only things that need to be done will be done). + +== app/config == +This folder includes the files responsible for saving and loading the configurations of GIMP from the rc files. + +== app/core == +This folder is truly the guts of GIMP. It contains most of the objects that GIMP deals with - guides, brushes, drawables, images,... If you want to do something to the way objects in GIMP behave or if you want to implement a new type of objects (for example, angular guides, vector layers, ...) this is the first place you'd want to look at. +Note that almost every change in this directory requires changes in other places - for example, if I want to implement a new type of layers (let's say vector layers) then you would also need to update the layers tree widget (and not to mention many other things). +"Massive" hacks that are not just for implementing one tool or another, but to change/add new objects to GIMP will start here, and will affect many other parts of GIMP so be prepared for lots of work when changing things in here. + +== app/dialogs == +The code of all GIMP's dialogs, is inside this directory. Any dialog including simple ones (like renaming a layer) and the most complex ones (Like the preferences dialog) can be found in this directory. + +Dialogs should not be confused with dockable areas: + +* Dialogs are things which open in response to a specific action. These are not dockable, meaning that they will always be in a floating window of their own +* Dockables (or Docks in short) are parts of the user interface which can be open all of the time and don't have to be available only as a result of a specific action. Dockables can either "float around" like dialogs, or you can drag and drop them to other docks, in order to organize them together in a single window (You "dock" one dockable inside the other). + +Examples: +* Editing a layer's name is done inside a dialog since it's a response to a request to edit the name of a specific layer +* The brushes dialog is a dockable since it makes sense to have it open all the time + +The definition of what should be a dock and what should be a dialog is sometimes unclear. But by taking a brief look inside this directory, it's usually very easy to find from the file names if what you are looking for is a dialog or not. + +The source of the GIMP docks can be found in [[#app/widgets]] + +== app/display == +This directory contains the code of the image display. This includes the image projection (i.e. the process of combining the data from all the layers, channels, etc. to an image which can be displayed on screen), the and various functions to draw on the canvas itself (these functions are used to draw guides, grids, and the controls of some tools). + +Note that although the functions for drawing on the canvas are all located here, the actual code who calls these functions (for example, the code of the rectangle tool which calls these function to draw lines on the canvas) is often located somewhere else + +== app/file == +This folder contains the functions which call the appropriate file handlers when opening/saving different kinds of files. I.E. these folders don't contain nay code to handle any specific file type, but instead they contain the code to identify and call the appropriate file handler. + +== app/gegl == +This folder contains code for interaction between GEGL and GIMP. This includes some of GIMP's operations that were ported to GEGL (such as colorize, brightness and contrast, curves) and other code to transfer data between GIMP and GEGL. + +== app/gui == +This folder contains the code of the skeleton of GIMP's graphical user interface. I.E. it does not contain the code of specific dialogs or widgets - instead it contains base-classes for GIMP's windows and some more code to manage them. An example for a major work here was the implementation of single window mode in GIMP. + +== app/menus == +This folder contains the code of some of the menus. Note that this is NOT where you'll find the menu path of different actions. + +== app/paint == +This folder contains the source of GIMP's '''paint''' tools - which are define to be + +* Tools for painting - Paintbrush, Ink, Clone, ... +* Transformation tools - Move, Rotate, Scale, ... +* The Paths tool + +These should be distinguished from the '''base''' tools - see [[#app/base]] + +Note that the code in this directory only contains the algorithms of the tools. The code for interacting with the user interface is located inside [[#app/tools]] + +== app/paint-funcs == +This folder contains various functions which are commonly used by the paint tools - Layer modes, Image Samplers and conversions between pixel modes (indexed, rgb, etc.) + +== app/pdb == +This folder contains '''auto-generated''' (don't edit files in this folder!) code for exposing internal GIMP functions to the PDB. The code inside this directory is generated by the pdbgen tool which is located under [[#tools/pdbgen]]. + +For more information about pdbgen, see [[Hacking:pdbgen]]. + +== app/tests == +This folder includes many tests for GIMP, which are usually preformed before new releases to try and make sure that all the major features work correctly. + +== app/text == +This folder contains the source of GIMP's text core. This includes the function to render text, and the structures for keeping it's properties. + +== app/tools == +Here is the source code of the tools which are exposed to the user. The code here is mainly the code for the user interface, and not the actual algorithm which performs the tools operation. The actual source of the tools operation can usually be found in [[#app/paint]] and for some tools (such as the selection tools) in [[#app/core]]. +Note that for some tools which are currently in a development phase (such as the text tool), some of the code may hide in different places (for example, some of the text tool's code is currently inside [[#app/widgets]] inside the code of the on-canvas text editor) + +== app/vectors == +Here is the code for handling paths (vectors) inside GIMP. + +== app/widgets == +Most of the custom user interface elements which are used by GIMP, are located inside this folder. This includes everything from simple color buttons to the custom view of the layer stacks. + +As the name states, most of the things in this directory are widgets and not stand-alone dialogs! do not get confused with [[#app/dialogs]] +== app/xcf == + += The cursors directory = +This directory contains all the cursor images which GIMP uses. Directly under this directory, you can find all the bitmap images of the cursors. + +== cursors/xbm == +This directory contains the images of the cursors, converted to XBM files - these are C header files which have the data of the cursors encoded in binary directly into them. + += The data directory = +This directory contains various data files which ship with GIMP - brushes, gradients, palettes, etc. +Details of the subdirectories are omitted as these are obvious =) + += The desktop directory = +This folder contains various data files files which are required for installing GIMP. These are mainly GIMP's icon in different sizes, and some linux .desktop files (similar to shortcut files in windows). + += The devel-docs directory = +This folder contains documentation for developing GIMP. Most of it is autogenerated by a tool called gtk-doc, directly from comments in the source file. + +Some interesting docs there are +* Documentations of the native file formats GIMP uses for it's brushes, images, patterns, etc. +* Notes for developers on the steps required to make a release +* Schedules +* GIMP's dependancies +* more... + += The docs folder = +This folder includes documentation of GIMP's command line options (man pages), and some source files for creating different versions of Wilber (GIMP's mascot!) + += The etc folder = +This folder contains default rc files (configuration files), that should be installed with GIMP. + += The libgimp* directories = +These directories include functions and other stuff which GIMP exposes for usage by plugins and extensions. Some of the files inside these directories are auto-generated by the pdbgen tool (see [[#tools/pdbgen]]) and therefore should not be edited. + += The menus folder = +This folder includes XML files which specify the location to register many of GIMP's actions inside the menus. + += This modules folder = +This folder contains source code of modules for GIMP - such as special color pickers (CMYK and water paint) and some other modules. See [[Hacking::Modules]] for more info + += The plug-ins directory = +This folder includes the source off all of GIMP's plug-ins. Plug-ins which are big and/or require several files are usually located in their own subdirectory, while the smaller/simpler plugins are located under the plug-ins/common. + += The po directories = +The po, po-libgimp, po-plug-ins, po-python, po-script-fu, po-tags and po-tips directories, contain files for internationalization (i18n) of GIMP. Basically, these are text files with strings from GIMP's source, together with their translation to different languages. +Please see [[i18n:How-to]] for more details on the files inside these directories. + += The themes directory = +This directory contains the GIMP's themes. The topic of GIMP themes can be found in [[Hacking:Themes]] + += The tools directory = +This directory contains miscellaneous tools which are used for developing GIMP. Currently, the only tool in that directory is the pdbgen tool. + +== tools/pdbgen == +More on that the pdbgen tool can be found in [[Hacking:pdbgen]]. diff --git a/wiki/Hacking:TODO-20160927032812-show.txt b/wiki/Hacking:TODO-20160927032812-show.txt new file mode 100644 index 0000000..8015923 --- /dev/null +++ b/wiki/Hacking:TODO-20160927032812-show.txt @@ -0,0 +1,276 @@ + + +__TOC__ + +=2.10= + +This list is [http://bugzilla.gnome.org/buglist.cgi?product=GIMP&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED⌖_milestone=2.10 all 2.10 bugs with 2.10 milestone] sorted into: + + +* '''Blocks the release''' = something that had worked before got broken / only partially works after major changes +* '''Would be nice to have''' = feature request we have no time for, or a minor bug that doesn't affect too many people + +==Blocks the release== + +{| class="wikitable" +|- +! '''#''' +! '''Description''' +! '''Status''' +! '''Comment''' +|- +| | test and fix the merged PSD GSoC branch | Yes | +|- +| | port all file plugins to [http://wiki.gimp.org/index.php/Hacking:Porting_file_plugins_to_GEGL_and_GIO GEGL and GIO] | work in progress | +|- +| | deprecate all of libgimp/gimpcolor_pdb.h, replacements in libgimp/gimpdrawablecolor_pdb.h | No | +|- +| | Exporting animation barely works after the GEGL port | work in progress | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=762443 #762443] | Levels tool Output Level sliders works incorrectly | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=519503 #519503] | Healing Tool - Sample Merged option does not work | No | Initial patch was rejected +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=723213 #723213] | colors/levels/auto is broken for high bitdepth images | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=728607 #728607] | Patch to make divide blend mode work at 32-bit floating point | work in progress | initial patch available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=736701 #736701] | LCMS2 rounding errors cause problems with certain GIMP blend modes | Yes | [https://git.gnome.org/browse/gimp/commit/?id=0ce364ee4dd2200e6607a4575af0cc657600afc9 0ce364e] +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=753412 #753412] | New Canvas rotation feature rotates brush | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=316479 #316479] | The Perspective Tool creates an empy image instead of transforming it | work in progress | initial patch available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=768772 #768772] | Apply dynamics to MyPaint brush | No | +|- +| | MyPaint brushes on its own package | work in progress | [https://github.com/mypaint/mypaint/pull/538 https://github.com/mypaint/mypaint/pull/538] +|} + +==Would be nice to have== + +{| class="wikitable" +|- +! '''#''' +! '''Description''' +! '''Status''' +! '''Comment''' +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=344684 #344684] | Greyscale (no alpha) clipboard brushes are of the wrong type | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=363738 #363738] | pick better size and position of the initial image window | No | patch prototyped only +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=676768 #676768] | Filters not working on layer groups | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=553855 #553855] | Bucket fill colour is always blended with filled pixel colour when threshold > 0 | Yes | [https://git.gnome.org/browse/gimp/commit/?id=572d55664314a0deb58a336924e08eba2d30441a 572d556] +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=664748 #664748] | Move Tool doesn't move | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=637313 #637313] | Should be possible to copy/paste whole layers in a single step | Yes | [https://git.gnome.org/browse/gimp/commit/?id=67863dabf92e45ac5bda18c814e893f55d62cc9a 67863da] +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=122862 #122862] | Some settings in Tool Options are too long | work in progress | Mostly done, still need to set the "ellipsize" property of the combos +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=667862 #667862] | Allow mouse to optionally configure tablet devices | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=358141 #358141] | Add session management for plug-in windows | work in progress | patch with a workaround available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=640613 #640613] | support for exporting CMYK TIFF format | work in progress | outdated patch available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=745360 #745360] | Feature-Request n-point-deformation tool | work in progress | probably won't have the time to polish it to enable by default for 2.10 +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=750940 #750940] | Make the histogram (dialog, Levels, Curves, etc) default to show RGB instead of Value | work in progress | patch available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=727270 #727270] | Proposal to add gimp_metadata_set_from_iptc | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=735895 #735895] | Precision Conversion "Dithering" dialog | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=743034 #743034] | file-tiff-load crashes if I try to open a BigTIFF file | No | needs to be checked against the new tiff loader +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=575744 #575744] | exif tags and embedded color space profile not synchronized | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=757057 #757057] | The installation of .dll's into the plug-ins-subdirectory by additional plug-ins can cause malfunction of others | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=751548 #751548] | Support for Cineon and DPX file formats | No | Outdated initial plugin available, needs much work +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=748060 #748060] | Force parameter on Tool Options is ignored when there is dynamics force | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=51112 #51112] | Support layer masks on layer groups | No | it's originally among 2.10 goals, so maybe it's a blocker? +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=690265 #690265] | libgimp/gimptilebackendplugin.c provides no pyramid | No | probably is a blocker +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=765163 #765163] | Properly support the new-style built-in full screen mode of Mac OS X (version 10.7 and later) | No | depends on changes in GTK+, needs checking +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=556608 #556608] | Monitor color profile is not applied to filter preview | work in progress | most likely should be closed as resolved +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=750180 #750180] | Fix different ways of writing Plug-in Plug-In Plugin | No | available patch didn't pass sanity check +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=661953 #661953] | Modernize autotools configuration | No | initial patch provided, didn't pass sanity check +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=382688 #382688] | Export layers as pages to PDF file | work in progress | available patch doesn't apply to master anymore +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=766988 #766988] | Colors applied to images are not color managed | work in progress | most likely should be closed as resolved +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=642938 #642938] | scripts that require brushes that GIMP no longer installs | work in progress | initial patch available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=158192 #158192] | add thumbnail loader for TIFF images | No | new tiff plugin needs checking +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=728633 #728633] | Improvements to the file-raw plugin | work in progress | the three remaining patches are available in branch bug-728633 +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=601821 #601821] | Retrieve multiple images from TWAIN data source | work in progress | patches are in the bug-357818 branch +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=357818 #357818] | TWAIN plug-in should skip scanner selection if there is just one scanner available | work in progress | patches are in the bug-357818 branch +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=767662 #767662] | MyPaint Brush with parse error aborts GIMP | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=767650 #767650] | Uncommitted scissors selection is discarded in cases where some other selections get committed | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=589371 #589371] | Improve default set of resources | work in progress | Patches available +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=735992 #735992] | Add more resolutions/templates to the New file dialog of GIMP | work in progress | Patch available in the icons-wip branch +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=731279 #731279] | Tool Preset Editor not working correctly | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=648776 #648776] | Mirror painting | work in progress | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=706309 #706309] | GIMP does not display “Save As” button In “Quit GIMP” pop up | work in progress | Jehan was going to provide a new patch +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=769550 #769550] | Test GTK+ patch for keyboard shortcuts for non-English locales | work in progress | We only need to test the patched GTK+, then bump deps +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=320447 #320447] | Fast switching between "color managed display" and "softproof" | work in progress | Elle is unhappy, there seems to be a compromise reached +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=769976 #769976] | [PATCH] Save as JPEG ignore quality setting | work in progress | Patch available, needs checking +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=770171 #770171] | Mypaint eraser won't work unless there is an alpha channel | Yes | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=769820 #769820] | Cannot enter Iptc information when no metadata is available and fails to write it to file when it is | work in progress | mitch promised to apply the patch with some changes +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=770241 #770241] | GeglBuffer leaks when using GIMP to cut a selection | No | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=769960 #769960] | animated WebP loader is not properly handling blending and transparency | work in progress | patch available for further review (code style improved) +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=599573 #599573] | Remember dialog defaults between Gimp sessions | work in progress | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=759904 #759904] | Some icons can't be set from the icon theme | work in progress | +|- +| [https://bugzilla.gnome.org/show_bug.cgi?id=770424 #770424] | Themes: insensitive menu item are not readable | No | +|- +| | complete the Unified Transform tool | No | +|- +| | complete the Warp Transform tool | No | +|- +| | complete the Seamless Clone tool | No | +|- +| | public API for handling text layers data, so that the PSD plugin could make use of text layers | No | +|- +| | merge and complete the new [http://git.gnome.org/browse/gimp/log/?h=soc-2011-gimpunitentry unit entry widget] | No | +|} + +=3.0= + +==Blocks the release== + +* make sure all custom widgets are themed on GTK+3 + +==Would be nice to have== + +To be decided upon. + + +=Mindstorm: Miscellaneous ideas= + +This chapter is a very un-organized list of ideas/suggestions that were discussed by GIMP developers. It contains enough ideas for enhancement requests and other small changes, and it should be the perfect place for new GIMP developers to find an idea on what should they do. + +I'm rating the ideas by an approximation of how hard do they seem so you'll know what to tackle first. However, remember that this is just an approximation. + + +==More accepted separator characters inside GimpNumberPairEntry== + +Estimated Hacking level: easy + +GimpNumberPairEntry is the widget used in all the rectangle selection tools, for specifying the ratio between the width and height of the selection. This widget is like a regular entry, except for the fact that it can accept two numbers separated by some predefined separator character. + +It was recently discussed on the IRC (July 2010) that GimpNumberPairEntry's should have the possibility of accepting any non-digit character as a separator. For example :/ are a valid separators for ratios, xX,are a valid separators for exact sizes and in some cases even more separators would be considered logical. + +Instead of trying to guess what should be considered a valid separator, it was suggested that any non-digit character would be accepted as a separator (we don't say that just punctuation characters are valid since then we ignore x and X). Now, in order to not change the api of the widget we can't omit the separator argument on the constructor. + +We should either add a new function that enables using any non-digit character as a separator or make this the default behaviour. If anyone wants to do this, consult guiguru before also about what to do with erroneous inputs (such as "100:50:20" - should this be 100 and 50? or maybe 100 and 5020? The current behaviour is that if an erroneous input is given, it's ignored and the previous state is restored). + + +==Export/Save specifications for non-dirty (clean) images== + +Estimated Hacking level: ? + +Should we allow to re-export/re-save an image which was opened and no changes were made to it? + +In addition to the fact that there doesn't seem to be any reason to export what you just imported back to the same file, this may even cause loss of quality/information. For example, when using lossy formats such as JPEG you will probably lose quality with each time you import and then export. Also,this is especially critical with images that were imported from one of the non-native formats (i.e. non XCF formats) since we may loose information in every such export (For example, gimp can import PSDs and ignore features it doesn't support, but if we re-export it the original information which is not supported by gimp will be lost). It doesn't seem smart to encourage this loss of quality and information... + +Note that this should probably be consistent between saving and exporting; We won't allow saving an image to the original file if it wasn't modified only if we also apply the same restriction on exporting. + +One last note: some file plugins import images and make changes to them during the import (for example, the JPEG plugin can rotate an image during import based on it's exif data). Should we allow these plugins to mark the imported image as dirty so that it can be saved again? +[Editors note]: As far as I know there is no function to mark an image as dirty, so this will probably require the addition of a new PDB procedure. + + +==Add support for angular guides== + +Estimated Hacking level: Easy-Medium Medium-Hard + +In short: add support for guides with an arbitary angle (and not limited to 0 degrees/90 degrees. +You'll need to take a look (at least) at the following files app/display/gimpdisplayshell-draw.c, app/core/gimpimage-guides.c, app/core/gimpguide.c). + +Edit: Actually, any api change you'll make to existing function will force you to change these: + + +* app/core/gimpimage-guides.c +* app/core/gimpguideundo.c +* app/core/gimpimage-flip.c +* app/core/gimpguideundo.h +* app/core/gimpguide.c +* app/core/gimpimage-duplicate.c +* app/core/gimpimage-crop.c +* app/core/gimpimage-arrange.c +* app/core/gimpimage-scale.c +* app/core/gimpimage-snap.c +* app/core/gimpimage-rotate.c +* app/core/gimpimage-resize.c +* app/display/gimpdisplayshell-expose.c +* app/display/gimpdisplayshell-draw.c +* app/tests/test-xcf.c +* app/tools/gimpaligntool.c +* app/tools/gimpmovetool.c +* app/xcf/xcf-save.c + +That's many many files - so annoying... It may be easier to introduce angular guides as new types of objects... + + +==Support capturing the cursor inside the Screenshot plugin for Windows== + +Estimated Hacking level: Easy (If you have some windows programming expirience) + +As the title states, unlike the unix version of the screenshot plugin, the windows version can not capture the cursor. Adding a support for this would be great! +For thos who want to get a reference, you can see an article about how to get the bitmap of the cursor here: [http://msdn.microsoft.com/en-us/magazine/cc301524.aspx http://msdn.microsoft.com/en-us/magazine/cc301524.aspx]. Note that some of the links in the article are broken, but you should be able to find the ones with the code. + + +==Support layer modes/masks in transform previews== + +Estimated Hacking level: ? + +Layer blending modes are currently disabled during transformation previews, due to the fact that they require a bit more processing. A small enhancement would be to add a check-box to enable layer modes during transformation previews. This is sometimes essential for getting the transformation right =) +The same goes for enabling layer masks during transformation previews. + + +==Support selecting guides by location with the align tool== + +Estimated Hacking level: Easy-Medium + +Allow to pick a guide by it's x/y location with the align tool instead of fighting the cursor to select it + + +==Create a plugin for laying out text inside the selection== + +Estimated Hacking level: ? Requires some knowledge of pango and cairo + +Create a plugin that will allow taking a text layer and adding spaces/line-breaks so that it will flow into the selection. You may get some basic hints on how to do this from the following mail that was sent to the Pango mailing list - [http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html] + + +=See also= + +[[Roadmap]] diff --git a/wiki/Hacking:TODO-20201025000632-edit.txt b/wiki/Hacking:TODO-20201025000632-edit.txt new file mode 100644 index 0000000..4cc3dd9 --- /dev/null +++ b/wiki/Hacking:TODO-20201025000632-edit.txt @@ -0,0 +1,95 @@ +__TOC__ + += Version 3.0 release blockers= + +We list here release blockers for v3.0. These are the bugs and lacking features that prevent us from releasing v3.0: + +* make sure all custom widgets are themed on GTK+3 + +For the list of regular bugs and feature requests, please see [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 all 3.0 bug reports with 3.0 milestone]. Some of [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 bug reports with 2.10 milestone] may apply as well. + +=Mindstorm: Miscellaneous ideas= +This chapter is a very unorganized list of ideas/suggestions that were discussed by GIMP developers. It contains enough ideas for enhancement requests and other small changes, and it should be the perfect place for new GIMP developers to find an idea on what should they do. + +I'm rating the ideas by an approximation of how hard do they seem so you'll know what to tackle first. However, remember that this is just an approximation. + +== More accepted separator characters inside GimpNumberPairEntry == + +Estimated Hacking level: easy + +GimpNumberPairEntry is the widget used in all the rectangle selection tools, for specifying the ratio between the width and height of the selection. This widget is like a regular entry, except for the fact that it can accept two numbers separated by some predefined separator character. + +It was recently discussed on the IRC (July 2010) that GimpNumberPairEntry's should have the possibility of accepting any non-digit character as a separator. For example :/ are a valid separators for ratios, xX,are a valid separators for exact sizes and in some cases even more separators would be considered logical. + +Instead of trying to guess what should be considered a valid separator, it was suggested that any non-digit character would be accepted as a separator (we don't say that just punctuation characters are valid since then we ignore x and X). Now, in order to not change the api of the widget we can't omit the separator argument on the constructor. + +We should either add a new function that enables using any non-digit character as a separator or make this the default behaviour. If anyone wants to do this, consult guiguru before also about what to do with erroneous inputs (such as "100:50:20" - should this be 100 and 50? or maybe 100 and 5020? The current behaviour is that if an erroneous input is given, it's ignored and the previous state is restored). + +==Export/Save specifications for non-dirty (clean) images== +Estimated Hacking level: ? + +Should we allow to re-export/re-save an image which was opened and no changes were made to it? + +In addition to the fact that there doesn't seem to be any reason to export what you just imported back to the same file, this may even cause loss of quality/information. For example, when using lossy formats such as JPEG you will probably lose quality with each time you import and then export. Also,this is especially critical with images that were imported from one of the non-native formats (i.e. non XCF formats) since we may loose information in every such export (For example, gimp can import PSDs and ignore features it doesn't support, but if we re-export it the original information which is not supported by gimp will be lost). It doesn't seem smart to encourage this loss of quality and information... + +Note that this should probably be consistent between saving and exporting; We won't allow saving an image to the original file if it wasn't modified only if we also apply the same restriction on exporting. + +One last note: some file plugins import images and make changes to them during the import (for example, the JPEG plugin can rotate an image during import based on it's exif data). Should we allow these plugins to mark the imported image as dirty so that it can be saved again? +[Editors note]: As far as I know there is no function to mark an image as dirty, so this will probably require the addition of a new PDB procedure. + +==Add support for angular guides== + +Estimated Hacking level: Easy-Medium Medium-Hard + +In short: add support for guides with an arbitrary angle (and not limited to 0 degrees/90 degrees. +You'll need to take a look (at least) at the following files app/display/gimpdisplayshell-draw.c, app/core/gimpimage-guides.c, app/core/gimpguide.c). + +Edit: Actually, any api change you'll make to existing function will force you to change these: +* app/core/gimpimage-guides.c +* app/core/gimpguideundo.c +* app/core/gimpimage-flip.c +* app/core/gimpguideundo.h +* app/core/gimpguide.c +* app/core/gimpimage-duplicate.c +* app/core/gimpimage-crop.c +* app/core/gimpimage-arrange.c +* app/core/gimpimage-scale.c +* app/core/gimpimage-snap.c +* app/core/gimpimage-rotate.c +* app/core/gimpimage-resize.c +* app/display/gimpdisplayshell-expose.c +* app/display/gimpdisplayshell-draw.c +* app/tests/test-xcf.c +* app/tools/gimpaligntool.c +* app/tools/gimpmovetool.c +* app/xcf/xcf-save.c +That's many many files - so annoying... It may be easier to introduce angular guides as new types of objects... + +==Support capturing the cursor inside the Screenshot plugin for Windows== + +Estimated Hacking level: Easy (If you have some windows programming experience) + +As the title states, unlike the Unix version of the screenshot plugin, the windows version cannot capture the cursor. Adding a support for this would be great! +For thos who want to get a reference, you can see an article about how to get the bitmap of the cursor here: http://msdn.microsoft.com/en-us/magazine/cc301524.aspx. Note that some of the links in the article are broken, but you should be able to find the ones with the code. + +==Support layer modes/masks in transform previews== + +Estimated Hacking level: ? + +Layer blending modes are currently disabled during transformation previews, due to the fact that they require a bit more processing. A small enhancement would be to add a check-box to enable layer modes during transformation previews. This is sometimes essential for getting the transformation right =) +The same goes for enabling layer masks during transformation previews. + +==Support selecting guides by location with the align tool== + +Estimated Hacking level: Easy-Medium + +Allow to pick a guide by it's x/y location with the align tool instead of fighting the cursor to select it + +==Create a plugin for laying out text inside the selection== +Estimated Hacking level: ? Requires some knowledge of Pango and Cairo + +Create a plugin that will allow taking a text layer and adding spaces/line-breaks so that it will flow into the selection. You may get some basic hints on how to do this from the following mail that was sent to the Pango mailing list - http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html + +=See also= + +[[Roadmap]] diff --git a/wiki/Hacking:TODO-20210125182125-show.txt b/wiki/Hacking:TODO-20210125182125-show.txt new file mode 100644 index 0000000..3558c1f --- /dev/null +++ b/wiki/Hacking:TODO-20210125182125-show.txt @@ -0,0 +1,113 @@ + + +__TOC__ + +=Version 3.0 release blockers= + +We list here release blockers for v3.0. These are the bugs and lacking features that prevent us from releasing v3.0: + + +* make sure all custom widgets are themed on GTK+3 + +For the list of regular bugs and feature requests, please see [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 all 3.0 bug reports with 3.0 milestone]. Some of [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 bug reports with 2.10 milestone] may apply as well. + + +=Mindstorm: Miscellaneous ideas= + +This chapter is a very unorganized list of ideas/suggestions that were discussed by GIMP developers. It contains enough ideas for enhancement requests and other small changes, and it should be the perfect place for new GIMP developers to find an idea on what should they do. + +I'm rating the ideas by an approximation of how hard do they seem so you'll know what to tackle first. However, remember that this is just an approximation. + + +==More accepted separator characters inside GimpNumberPairEntry== + +Estimated Hacking level: easy + +GimpNumberPairEntry is the widget used in all the rectangle selection tools, for specifying the ratio between the width and height of the selection. This widget is like a regular entry, except for the fact that it can accept two numbers separated by some predefined separator character. + +It was recently discussed on the IRC (July 2010) that GimpNumberPairEntry's should have the possibility of accepting any non-digit character as a separator. For example :/ are a valid separators for ratios, xX,are a valid separators for exact sizes and in some cases even more separators would be considered logical. + +Instead of trying to guess what should be considered a valid separator, it was suggested that any non-digit character would be accepted as a separator (we don't say that just punctuation characters are valid since then we ignore x and X). Now, in order to not change the api of the widget we can't omit the separator argument on the constructor. + +We should either add a new function that enables using any non-digit character as a separator or make this the default behaviour. If anyone wants to do this, consult guiguru before also about what to do with erroneous inputs (such as "100:50:20" - should this be 100 and 50? or maybe 100 and 5020? The current behaviour is that if an erroneous input is given, it's ignored and the previous state is restored). + + +==Export/Save specifications for non-dirty (clean) images== + +Estimated Hacking level: ? + +Should we allow to re-export/re-save an image which was opened and no changes were made to it? + +In addition to the fact that there doesn't seem to be any reason to export what you just imported back to the same file, this may even cause loss of quality/information. For example, when using lossy formats such as JPEG you will probably lose quality with each time you import and then export. Also,this is especially critical with images that were imported from one of the non-native formats (i.e. non XCF formats) since we may loose information in every such export (For example, gimp can import PSDs and ignore features it doesn't support, but if we re-export it the original information which is not supported by gimp will be lost). It doesn't seem smart to encourage this loss of quality and information... + +Note that this should probably be consistent between saving and exporting; We won't allow saving an image to the original file if it wasn't modified only if we also apply the same restriction on exporting. + +One last note: some file plugins import images and make changes to them during the import (for example, the JPEG plugin can rotate an image during import based on it's exif data). Should we allow these plugins to mark the imported image as dirty so that it can be saved again? +[Editors note]: As far as I know there is no function to mark an image as dirty, so this will probably require the addition of a new PDB procedure. + + +==Add support for angular guides== + +Estimated Hacking level: Easy-Medium Medium-Hard + +In short: add support for guides with an arbitrary angle (and not limited to 0 degrees/90 degrees. +You'll need to take a look (at least) at the following files app/display/gimpdisplayshell-draw.c, app/core/gimpimage-guides.c, app/core/gimpguide.c). + +Edit: Actually, any api change you'll make to existing function will force you to change these: + + +* app/core/gimpimage-guides.c +* app/core/gimpguideundo.c +* app/core/gimpimage-flip.c +* app/core/gimpguideundo.h +* app/core/gimpguide.c +* app/core/gimpimage-duplicate.c +* app/core/gimpimage-crop.c +* app/core/gimpimage-arrange.c +* app/core/gimpimage-scale.c +* app/core/gimpimage-snap.c +* app/core/gimpimage-rotate.c +* app/core/gimpimage-resize.c +* app/display/gimpdisplayshell-expose.c +* app/display/gimpdisplayshell-draw.c +* app/tests/test-xcf.c +* app/tools/gimpaligntool.c +* app/tools/gimpmovetool.c +* app/xcf/xcf-save.c + +That's many many files - so annoying... It may be easier to introduce angular guides as new types of objects... + + +==Support capturing the cursor inside the Screenshot plugin for Windows== + +Estimated Hacking level: Easy (If you have some windows programming experience) + +As the title states, unlike the Unix version of the screenshot plugin, the windows version cannot capture the cursor. Adding a support for this would be great! +For thos who want to get a reference, you can see an article about how to get the bitmap of the cursor here: [http://msdn.microsoft.com/en-us/magazine/cc301524.aspx http://msdn.microsoft.com/en-us/magazine/cc301524.aspx]. Note that some of the links in the article are broken, but you should be able to find the ones with the code. + + +==Support layer modes/masks in transform previews== + +Estimated Hacking level: ? + +Layer blending modes are currently disabled during transformation previews, due to the fact that they require a bit more processing. A small enhancement would be to add a check-box to enable layer modes during transformation previews. This is sometimes essential for getting the transformation right =) +The same goes for enabling layer masks during transformation previews. + + +==Support selecting guides by location with the align tool== + +Estimated Hacking level: Easy-Medium + +Allow to pick a guide by it's x/y location with the align tool instead of fighting the cursor to select it + + +==Create a plugin for laying out text inside the selection== + +Estimated Hacking level: ? Requires some knowledge of Pango and Cairo + +Create a plugin that will allow taking a text layer and adding spaces/line-breaks so that it will flow into the selection. You may get some basic hints on how to do this from the following mail that was sent to the Pango mailing list - [http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html] + + +=See also= + +[[Roadmap]] diff --git a/wiki/Hacking:TODO-20210518053713-edit.txt b/wiki/Hacking:TODO-20210518053713-edit.txt new file mode 100644 index 0000000..4cc3dd9 --- /dev/null +++ b/wiki/Hacking:TODO-20210518053713-edit.txt @@ -0,0 +1,95 @@ +__TOC__ + += Version 3.0 release blockers= + +We list here release blockers for v3.0. These are the bugs and lacking features that prevent us from releasing v3.0: + +* make sure all custom widgets are themed on GTK+3 + +For the list of regular bugs and feature requests, please see [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 all 3.0 bug reports with 3.0 milestone]. Some of [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 bug reports with 2.10 milestone] may apply as well. + +=Mindstorm: Miscellaneous ideas= +This chapter is a very unorganized list of ideas/suggestions that were discussed by GIMP developers. It contains enough ideas for enhancement requests and other small changes, and it should be the perfect place for new GIMP developers to find an idea on what should they do. + +I'm rating the ideas by an approximation of how hard do they seem so you'll know what to tackle first. However, remember that this is just an approximation. + +== More accepted separator characters inside GimpNumberPairEntry == + +Estimated Hacking level: easy + +GimpNumberPairEntry is the widget used in all the rectangle selection tools, for specifying the ratio between the width and height of the selection. This widget is like a regular entry, except for the fact that it can accept two numbers separated by some predefined separator character. + +It was recently discussed on the IRC (July 2010) that GimpNumberPairEntry's should have the possibility of accepting any non-digit character as a separator. For example :/ are a valid separators for ratios, xX,are a valid separators for exact sizes and in some cases even more separators would be considered logical. + +Instead of trying to guess what should be considered a valid separator, it was suggested that any non-digit character would be accepted as a separator (we don't say that just punctuation characters are valid since then we ignore x and X). Now, in order to not change the api of the widget we can't omit the separator argument on the constructor. + +We should either add a new function that enables using any non-digit character as a separator or make this the default behaviour. If anyone wants to do this, consult guiguru before also about what to do with erroneous inputs (such as "100:50:20" - should this be 100 and 50? or maybe 100 and 5020? The current behaviour is that if an erroneous input is given, it's ignored and the previous state is restored). + +==Export/Save specifications for non-dirty (clean) images== +Estimated Hacking level: ? + +Should we allow to re-export/re-save an image which was opened and no changes were made to it? + +In addition to the fact that there doesn't seem to be any reason to export what you just imported back to the same file, this may even cause loss of quality/information. For example, when using lossy formats such as JPEG you will probably lose quality with each time you import and then export. Also,this is especially critical with images that were imported from one of the non-native formats (i.e. non XCF formats) since we may loose information in every such export (For example, gimp can import PSDs and ignore features it doesn't support, but if we re-export it the original information which is not supported by gimp will be lost). It doesn't seem smart to encourage this loss of quality and information... + +Note that this should probably be consistent between saving and exporting; We won't allow saving an image to the original file if it wasn't modified only if we also apply the same restriction on exporting. + +One last note: some file plugins import images and make changes to them during the import (for example, the JPEG plugin can rotate an image during import based on it's exif data). Should we allow these plugins to mark the imported image as dirty so that it can be saved again? +[Editors note]: As far as I know there is no function to mark an image as dirty, so this will probably require the addition of a new PDB procedure. + +==Add support for angular guides== + +Estimated Hacking level: Easy-Medium Medium-Hard + +In short: add support for guides with an arbitrary angle (and not limited to 0 degrees/90 degrees. +You'll need to take a look (at least) at the following files app/display/gimpdisplayshell-draw.c, app/core/gimpimage-guides.c, app/core/gimpguide.c). + +Edit: Actually, any api change you'll make to existing function will force you to change these: +* app/core/gimpimage-guides.c +* app/core/gimpguideundo.c +* app/core/gimpimage-flip.c +* app/core/gimpguideundo.h +* app/core/gimpguide.c +* app/core/gimpimage-duplicate.c +* app/core/gimpimage-crop.c +* app/core/gimpimage-arrange.c +* app/core/gimpimage-scale.c +* app/core/gimpimage-snap.c +* app/core/gimpimage-rotate.c +* app/core/gimpimage-resize.c +* app/display/gimpdisplayshell-expose.c +* app/display/gimpdisplayshell-draw.c +* app/tests/test-xcf.c +* app/tools/gimpaligntool.c +* app/tools/gimpmovetool.c +* app/xcf/xcf-save.c +That's many many files - so annoying... It may be easier to introduce angular guides as new types of objects... + +==Support capturing the cursor inside the Screenshot plugin for Windows== + +Estimated Hacking level: Easy (If you have some windows programming experience) + +As the title states, unlike the Unix version of the screenshot plugin, the windows version cannot capture the cursor. Adding a support for this would be great! +For thos who want to get a reference, you can see an article about how to get the bitmap of the cursor here: http://msdn.microsoft.com/en-us/magazine/cc301524.aspx. Note that some of the links in the article are broken, but you should be able to find the ones with the code. + +==Support layer modes/masks in transform previews== + +Estimated Hacking level: ? + +Layer blending modes are currently disabled during transformation previews, due to the fact that they require a bit more processing. A small enhancement would be to add a check-box to enable layer modes during transformation previews. This is sometimes essential for getting the transformation right =) +The same goes for enabling layer masks during transformation previews. + +==Support selecting guides by location with the align tool== + +Estimated Hacking level: Easy-Medium + +Allow to pick a guide by it's x/y location with the align tool instead of fighting the cursor to select it + +==Create a plugin for laying out text inside the selection== +Estimated Hacking level: ? Requires some knowledge of Pango and Cairo + +Create a plugin that will allow taking a text layer and adding spaces/line-breaks so that it will flow into the selection. You may get some basic hints on how to do this from the following mail that was sent to the Pango mailing list - http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html + +=See also= + +[[Roadmap]] diff --git a/wiki/Hacking:TODO-20210608113340-show.txt b/wiki/Hacking:TODO-20210608113340-show.txt new file mode 100644 index 0000000..3558c1f --- /dev/null +++ b/wiki/Hacking:TODO-20210608113340-show.txt @@ -0,0 +1,113 @@ + + +__TOC__ + +=Version 3.0 release blockers= + +We list here release blockers for v3.0. These are the bugs and lacking features that prevent us from releasing v3.0: + + +* make sure all custom widgets are themed on GTK+3 + +For the list of regular bugs and feature requests, please see [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 all 3.0 bug reports with 3.0 milestone]. Some of [https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 bug reports with 2.10 milestone] may apply as well. + + +=Mindstorm: Miscellaneous ideas= + +This chapter is a very unorganized list of ideas/suggestions that were discussed by GIMP developers. It contains enough ideas for enhancement requests and other small changes, and it should be the perfect place for new GIMP developers to find an idea on what should they do. + +I'm rating the ideas by an approximation of how hard do they seem so you'll know what to tackle first. However, remember that this is just an approximation. + + +==More accepted separator characters inside GimpNumberPairEntry== + +Estimated Hacking level: easy + +GimpNumberPairEntry is the widget used in all the rectangle selection tools, for specifying the ratio between the width and height of the selection. This widget is like a regular entry, except for the fact that it can accept two numbers separated by some predefined separator character. + +It was recently discussed on the IRC (July 2010) that GimpNumberPairEntry's should have the possibility of accepting any non-digit character as a separator. For example :/ are a valid separators for ratios, xX,are a valid separators for exact sizes and in some cases even more separators would be considered logical. + +Instead of trying to guess what should be considered a valid separator, it was suggested that any non-digit character would be accepted as a separator (we don't say that just punctuation characters are valid since then we ignore x and X). Now, in order to not change the api of the widget we can't omit the separator argument on the constructor. + +We should either add a new function that enables using any non-digit character as a separator or make this the default behaviour. If anyone wants to do this, consult guiguru before also about what to do with erroneous inputs (such as "100:50:20" - should this be 100 and 50? or maybe 100 and 5020? The current behaviour is that if an erroneous input is given, it's ignored and the previous state is restored). + + +==Export/Save specifications for non-dirty (clean) images== + +Estimated Hacking level: ? + +Should we allow to re-export/re-save an image which was opened and no changes were made to it? + +In addition to the fact that there doesn't seem to be any reason to export what you just imported back to the same file, this may even cause loss of quality/information. For example, when using lossy formats such as JPEG you will probably lose quality with each time you import and then export. Also,this is especially critical with images that were imported from one of the non-native formats (i.e. non XCF formats) since we may loose information in every such export (For example, gimp can import PSDs and ignore features it doesn't support, but if we re-export it the original information which is not supported by gimp will be lost). It doesn't seem smart to encourage this loss of quality and information... + +Note that this should probably be consistent between saving and exporting; We won't allow saving an image to the original file if it wasn't modified only if we also apply the same restriction on exporting. + +One last note: some file plugins import images and make changes to them during the import (for example, the JPEG plugin can rotate an image during import based on it's exif data). Should we allow these plugins to mark the imported image as dirty so that it can be saved again? +[Editors note]: As far as I know there is no function to mark an image as dirty, so this will probably require the addition of a new PDB procedure. + + +==Add support for angular guides== + +Estimated Hacking level: Easy-Medium Medium-Hard + +In short: add support for guides with an arbitrary angle (and not limited to 0 degrees/90 degrees. +You'll need to take a look (at least) at the following files app/display/gimpdisplayshell-draw.c, app/core/gimpimage-guides.c, app/core/gimpguide.c). + +Edit: Actually, any api change you'll make to existing function will force you to change these: + + +* app/core/gimpimage-guides.c +* app/core/gimpguideundo.c +* app/core/gimpimage-flip.c +* app/core/gimpguideundo.h +* app/core/gimpguide.c +* app/core/gimpimage-duplicate.c +* app/core/gimpimage-crop.c +* app/core/gimpimage-arrange.c +* app/core/gimpimage-scale.c +* app/core/gimpimage-snap.c +* app/core/gimpimage-rotate.c +* app/core/gimpimage-resize.c +* app/display/gimpdisplayshell-expose.c +* app/display/gimpdisplayshell-draw.c +* app/tests/test-xcf.c +* app/tools/gimpaligntool.c +* app/tools/gimpmovetool.c +* app/xcf/xcf-save.c + +That's many many files - so annoying... It may be easier to introduce angular guides as new types of objects... + + +==Support capturing the cursor inside the Screenshot plugin for Windows== + +Estimated Hacking level: Easy (If you have some windows programming experience) + +As the title states, unlike the Unix version of the screenshot plugin, the windows version cannot capture the cursor. Adding a support for this would be great! +For thos who want to get a reference, you can see an article about how to get the bitmap of the cursor here: [http://msdn.microsoft.com/en-us/magazine/cc301524.aspx http://msdn.microsoft.com/en-us/magazine/cc301524.aspx]. Note that some of the links in the article are broken, but you should be able to find the ones with the code. + + +==Support layer modes/masks in transform previews== + +Estimated Hacking level: ? + +Layer blending modes are currently disabled during transformation previews, due to the fact that they require a bit more processing. A small enhancement would be to add a check-box to enable layer modes during transformation previews. This is sometimes essential for getting the transformation right =) +The same goes for enabling layer masks during transformation previews. + + +==Support selecting guides by location with the align tool== + +Estimated Hacking level: Easy-Medium + +Allow to pick a guide by it's x/y location with the align tool instead of fighting the cursor to select it + + +==Create a plugin for laying out text inside the selection== + +Estimated Hacking level: ? Requires some knowledge of Pango and Cairo + +Create a plugin that will allow taking a text layer and adding spaces/line-breaks so that it will flow into the selection. You may get some basic hints on how to do this from the following mail that was sent to the Pango mailing list - [http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html http://www.mail-archive.com/gtk-i18n-list@gnome.org/msg01373.html] + + +=See also= + +[[Roadmap]] diff --git a/wiki/Hacking:Tools-20161024012059-edit.txt b/wiki/Hacking:Tools-20161024012059-edit.txt new file mode 100644 index 0000000..ce00d20 --- /dev/null +++ b/wiki/Hacking:Tools-20161024012059-edit.txt @@ -0,0 +1,10 @@ +This page describes development tools and their usage for the development of Babl, GEGL and GIMP. + +=Code= +* [[Hacking:Eclipse]] - Using the Eclipse IDE +* [[Hacking:Emacs]] - Using Emacs +* [[Hacking:Netbeans]] - Using the Netbeans IDE +* [[Hacking:pdbgen‎]] - How to use the pdbgen tool, for adding new PDB procedures to GIMP + +=See also= +* [[Hacking:Problems and solutions]] - Problems and solutions. Also contains links to external tool support sites. diff --git a/wiki/Hacking:Tools-20210816102059-show.txt b/wiki/Hacking:Tools-20210816102059-show.txt new file mode 100644 index 0000000..90318c3 --- /dev/null +++ b/wiki/Hacking:Tools-20210816102059-show.txt @@ -0,0 +1,15 @@ + + +This page describes development tools and their usage for the development of Babl, GEGL and GIMP. + + +=Code= + +* [[Hacking:Eclipse]] - Using the Eclipse IDE +* [[Hacking:Emacs]] - Using Emacs +* [[Hacking:Netbeans]] - Using the Netbeans IDE +* [[Hacking:pdbgen|Hacking:pdbgen‎]] - How to use the pdbgen tool, for adding new PDB procedures to GIMP + +=See also= + +* [[Hacking:Problems and solutions]] - Problems and solutions. Also contains links to external tool support sites. diff --git a/wiki/Hacking:WarpTool%2FUI_design_info-20140901130309-history.txt b/wiki/Hacking:WarpTool%2FUI_design_info-20140901130309-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:WarpTool%2FUI_design_info-20140901130309-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:WarpTool%2FUI_design_info-20140901130759-edit.txt b/wiki/Hacking:WarpTool%2FUI_design_info-20140901130759-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:WarpTool%2FUI_design_info-20140901130759-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:WarpTool%2FUI_design_info-20140901133827-show.txt b/wiki/Hacking:WarpTool%2FUI_design_info-20140901133827-show.txt new file mode 100644 index 0000000..af1cfac --- /dev/null +++ b/wiki/Hacking:WarpTool%2FUI_design_info-20140901133827-show.txt @@ -0,0 +1,101 @@ + + +{| class="wikitable" +|- +|

    Contents

    + +* 1 Idea and background +* 2 A quick technical sneak peek +* 3 Potential behavior +* 4 Tool options +* 5 Undo +* 6 Quality +* 7 Pressure sensitivity +|} + +==Idea and background== + +A plugin named iWarp ([http://docs.gimp.org/2.6/en/plug-in-iwarp.html http://docs.gimp.org/2.6/en/plug-in-iwarp.html]) already exists in Gimp, but suffer from different troubles (small preview, uneasy manipulation). This year’s Google Summer of Code have a project to implement this behavior as a real live on-canvas tool in Gimp. This project is taken by Michael Muré (batolettre@gmail.com, irc: Bat`O on #gimp@irc.gnome.org). + +Basically, this would allow users to deform an image by a series of cursor action on it. This can be seen as a sort of sculpt. See for example the case where user can move pixel with a stroke of mouse. Others behavior can also be implemented, see below. + + +==A quick technical sneak peek== + +This tool will be a complete rewrite, no parts will be taken from the plugin. The tool will works with Gegl. The plugin can be seen as a proof of concept. + +Technically, this tool will work in two steps: + + +# a series of tools, one by behavior, act on a image-sized buffer that hold relative coordinate for each pixel. That mean that each pixel of the final image will have on this buffer a coordinate from where the final color come from. +# the final image is computed from the original image and this buffer. + +The approach with a coordinate buffer instead of acting directly on the image allows to: + + +# Render the tool effect in a constant time, no matter the number of stroke. +# No information lost. See for example the case of a pinch done multiple times in the same area so the input pixel would collapse. If you un-pinch the area, the map-absolute operator will fetch the right pixels, with no data loss. + +==Potential behavior== + +This technical approach gives a good liberty when implementing behavior. Following is a list a potential behavior, but other can be found and implemented. + + +# move: the stroke moves pixels under the cursor +# swirl (left and right) - rotary transform +# erase transform: cancel the transformation locally (ie set the relative coordinate to zero) +# pinch/concentrate +# expand +# smooth: tend to flatten the transformation + +All operations are applied with a feathered "brush", so effect is largest at center and smallest at edge. + + +==Tool options== + +This tool would have as options at least: + + +# size of the effect +# shape of the effect (round or square ?) -i dont think offering other shapes than round provides much... [http://wiki.gimp.org/index.php?title=User:AlexiaDeath&action=edit&redlink=1 AlexiaDeath] 20:41, 2 June 2011 (UTC) +# Hardness of the effect (see hardness in round brushes) + +This part, as the others, need to be thought in details, an probably expanded. + + +==Undo== + +Undo should be achievable with this tool. What is exactly doable (one step undo ? more ?) is currently unclear and need to be discussed. + +Possible way to achieve that: + + +# keeping copies of the coordinate buffer +## it will quickly eat a lot of memory +## it will quickly eat a lot of memory +# it will quickly eat a lot of memory +# applying the stroke in reverse, +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# it lead to approximation problem +# not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# recording all the stroke applied, and recomputing the coordinate buffer when undoing +## can take a lot of time if there is many strokes +## can take a lot of time if there is many strokes +# can take a lot of time if there is many strokes +# mixed solution: keeping "keyframe" coordinate buffer, every n stroke + every strokes, and recompute from this keyframe when undoing +# keeping modified tiles for every stroke done, and recompose a buffer when undoing +# stack one gegl op for each stroke in a gegl graph to compute the final coordinate buffer, and unstack op for undo + +==Quality== + +Since editing the coordinate buffer and rendering the transformation are two separated process, we can render the image with different quality without affecting the deformation. + + +==Pressure sensitivity== + +Options like the size of the effect or the sharpening of the shape could be pressure sensitive. + + \ No newline at end of file diff --git a/wiki/Hacking:WarpTool%2FUI_design_info-20161024020045-edit.txt b/wiki/Hacking:WarpTool%2FUI_design_info-20161024020045-edit.txt new file mode 100644 index 0000000..27c0762 --- /dev/null +++ b/wiki/Hacking:WarpTool%2FUI_design_info-20161024020045-edit.txt @@ -0,0 +1,66 @@ +==Idea and background== + +A plugin named iWarp (http://docs.gimp.org/2.6/en/plug-in-iwarp.html) already exists in Gimp, but suffer from different troubles (small preview, uneasy manipulation). This year’s Google Summer of Code have a project to implement this behavior as a real live on-canvas tool in Gimp. This project is taken by Michael Muré (batolettre@gmail.com, irc: Bat`O on #gimp@irc.gnome.org). + +Basically, this would allow users to deform an image by a series of cursor action on it. This can be seen as a sort of sculpt. See for example the case where user can move pixel with a stroke of mouse. Others behavior can also be implemented, see below. + +==A quick technical sneak peek== + +This tool will be a complete rewrite, no parts will be taken from the plugin. The tool will works with Gegl. The plugin can be seen as a proof of concept. + +Technically, this tool will work in two steps: + +# a series of tools, one by behavior, act on a image-sized buffer that hold relative coordinate for each pixel. That mean that each pixel of the final image will have on this buffer a coordinate from where the final color come from. +# the final image is computed from the original image and this buffer. + +The approach with a coordinate buffer instead of acting directly on the image allows to: + +# Render the tool effect in a constant time, no matter the number of stroke. +# No information lost. See for example the case of a pinch done multiple times in the same area so the input pixel would collapse. If you un-pinch the area, the map-absolute operator will fetch the right pixels, with no data loss. + +==Potential behavior== + +This technical approach gives a good liberty when implementing behavior. Following is a list a potential behavior, but other can be found and implemented. + +# move: the stroke moves pixels under the cursor +# swirl (left and right) - rotary transform +# erase transform: cancel the transformation locally (ie set the relative coordinate to zero) +# pinch/concentrate +# expand +# smooth: tend to flatten the transformation + +All operations are applied with a feathered "brush", so effect is largest at center and smallest at edge. + +==Tool options== + +This tool would have as options at least: + +# size of the effect +# shape of the effect (round or square ?) -i dont think offering other shapes than round provides much... [[User:AlexiaDeath|AlexiaDeath]] 20:41, 2 June 2011 (UTC) +# Hardness of the effect (see hardness in round brushes) + +This part, as the others, need to be thought in details, an probably expanded. + +==Undo== + +Undo should be achievable with this tool. What is exactly doable (one step undo ? more ?) is currently unclear and need to be discussed. + +Possible way to achieve that: +# keeping copies of the coordinate buffer +## it will quickly eat a lot of memory +# applying the stroke in reverse, +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# recording all the stroke applied, and recomputing the coordinate buffer when undoing +## can take a lot of time if there is many strokes +# mixed solution: keeping "keyframe" coordinate buffer, every n stroke + every strokes, and recompute from this keyframe when undoing +# keeping modified tiles for every stroke done, and recompose a buffer when undoing +# stack one gegl op for each stroke in a gegl graph to compute the final coordinate buffer, and unstack op for undo + +==Quality== + +Since editing the coordinate buffer and rendering the transformation are two separated process, we can render the image with different quality without affecting the deformation. + +==Pressure sensitivity== + +Options like the size of the effect or the sharpening of the shape could be pressure sensitive. diff --git a/wiki/Hacking:WarpTool%2FUI_design_info-20201124151511-edit.txt b/wiki/Hacking:WarpTool%2FUI_design_info-20201124151511-edit.txt new file mode 100644 index 0000000..27c0762 --- /dev/null +++ b/wiki/Hacking:WarpTool%2FUI_design_info-20201124151511-edit.txt @@ -0,0 +1,66 @@ +==Idea and background== + +A plugin named iWarp (http://docs.gimp.org/2.6/en/plug-in-iwarp.html) already exists in Gimp, but suffer from different troubles (small preview, uneasy manipulation). This year’s Google Summer of Code have a project to implement this behavior as a real live on-canvas tool in Gimp. This project is taken by Michael Muré (batolettre@gmail.com, irc: Bat`O on #gimp@irc.gnome.org). + +Basically, this would allow users to deform an image by a series of cursor action on it. This can be seen as a sort of sculpt. See for example the case where user can move pixel with a stroke of mouse. Others behavior can also be implemented, see below. + +==A quick technical sneak peek== + +This tool will be a complete rewrite, no parts will be taken from the plugin. The tool will works with Gegl. The plugin can be seen as a proof of concept. + +Technically, this tool will work in two steps: + +# a series of tools, one by behavior, act on a image-sized buffer that hold relative coordinate for each pixel. That mean that each pixel of the final image will have on this buffer a coordinate from where the final color come from. +# the final image is computed from the original image and this buffer. + +The approach with a coordinate buffer instead of acting directly on the image allows to: + +# Render the tool effect in a constant time, no matter the number of stroke. +# No information lost. See for example the case of a pinch done multiple times in the same area so the input pixel would collapse. If you un-pinch the area, the map-absolute operator will fetch the right pixels, with no data loss. + +==Potential behavior== + +This technical approach gives a good liberty when implementing behavior. Following is a list a potential behavior, but other can be found and implemented. + +# move: the stroke moves pixels under the cursor +# swirl (left and right) - rotary transform +# erase transform: cancel the transformation locally (ie set the relative coordinate to zero) +# pinch/concentrate +# expand +# smooth: tend to flatten the transformation + +All operations are applied with a feathered "brush", so effect is largest at center and smallest at edge. + +==Tool options== + +This tool would have as options at least: + +# size of the effect +# shape of the effect (round or square ?) -i dont think offering other shapes than round provides much... [[User:AlexiaDeath|AlexiaDeath]] 20:41, 2 June 2011 (UTC) +# Hardness of the effect (see hardness in round brushes) + +This part, as the others, need to be thought in details, an probably expanded. + +==Undo== + +Undo should be achievable with this tool. What is exactly doable (one step undo ? more ?) is currently unclear and need to be discussed. + +Possible way to achieve that: +# keeping copies of the coordinate buffer +## it will quickly eat a lot of memory +# applying the stroke in reverse, +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# recording all the stroke applied, and recomputing the coordinate buffer when undoing +## can take a lot of time if there is many strokes +# mixed solution: keeping "keyframe" coordinate buffer, every n stroke + every strokes, and recompute from this keyframe when undoing +# keeping modified tiles for every stroke done, and recompose a buffer when undoing +# stack one gegl op for each stroke in a gegl graph to compute the final coordinate buffer, and unstack op for undo + +==Quality== + +Since editing the coordinate buffer and rendering the transformation are two separated process, we can render the image with different quality without affecting the deformation. + +==Pressure sensitivity== + +Options like the size of the effect or the sharpening of the shape could be pressure sensitive. diff --git a/wiki/Hacking:WarpTool%2FUI_design_info-20210514160613-edit.txt b/wiki/Hacking:WarpTool%2FUI_design_info-20210514160613-edit.txt new file mode 100644 index 0000000..27c0762 --- /dev/null +++ b/wiki/Hacking:WarpTool%2FUI_design_info-20210514160613-edit.txt @@ -0,0 +1,66 @@ +==Idea and background== + +A plugin named iWarp (http://docs.gimp.org/2.6/en/plug-in-iwarp.html) already exists in Gimp, but suffer from different troubles (small preview, uneasy manipulation). This year’s Google Summer of Code have a project to implement this behavior as a real live on-canvas tool in Gimp. This project is taken by Michael Muré (batolettre@gmail.com, irc: Bat`O on #gimp@irc.gnome.org). + +Basically, this would allow users to deform an image by a series of cursor action on it. This can be seen as a sort of sculpt. See for example the case where user can move pixel with a stroke of mouse. Others behavior can also be implemented, see below. + +==A quick technical sneak peek== + +This tool will be a complete rewrite, no parts will be taken from the plugin. The tool will works with Gegl. The plugin can be seen as a proof of concept. + +Technically, this tool will work in two steps: + +# a series of tools, one by behavior, act on a image-sized buffer that hold relative coordinate for each pixel. That mean that each pixel of the final image will have on this buffer a coordinate from where the final color come from. +# the final image is computed from the original image and this buffer. + +The approach with a coordinate buffer instead of acting directly on the image allows to: + +# Render the tool effect in a constant time, no matter the number of stroke. +# No information lost. See for example the case of a pinch done multiple times in the same area so the input pixel would collapse. If you un-pinch the area, the map-absolute operator will fetch the right pixels, with no data loss. + +==Potential behavior== + +This technical approach gives a good liberty when implementing behavior. Following is a list a potential behavior, but other can be found and implemented. + +# move: the stroke moves pixels under the cursor +# swirl (left and right) - rotary transform +# erase transform: cancel the transformation locally (ie set the relative coordinate to zero) +# pinch/concentrate +# expand +# smooth: tend to flatten the transformation + +All operations are applied with a feathered "brush", so effect is largest at center and smallest at edge. + +==Tool options== + +This tool would have as options at least: + +# size of the effect +# shape of the effect (round or square ?) -i dont think offering other shapes than round provides much... [[User:AlexiaDeath|AlexiaDeath]] 20:41, 2 June 2011 (UTC) +# Hardness of the effect (see hardness in round brushes) + +This part, as the others, need to be thought in details, an probably expanded. + +==Undo== + +Undo should be achievable with this tool. What is exactly doable (one step undo ? more ?) is currently unclear and need to be discussed. + +Possible way to achieve that: +# keeping copies of the coordinate buffer +## it will quickly eat a lot of memory +# applying the stroke in reverse, +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# recording all the stroke applied, and recomputing the coordinate buffer when undoing +## can take a lot of time if there is many strokes +# mixed solution: keeping "keyframe" coordinate buffer, every n stroke + every strokes, and recompute from this keyframe when undoing +# keeping modified tiles for every stroke done, and recompose a buffer when undoing +# stack one gegl op for each stroke in a gegl graph to compute the final coordinate buffer, and unstack op for undo + +==Quality== + +Since editing the coordinate buffer and rendering the transformation are two separated process, we can render the image with different quality without affecting the deformation. + +==Pressure sensitivity== + +Options like the size of the effect or the sharpening of the shape could be pressure sensitive. diff --git a/wiki/Hacking:WarpTool%2UI_design_info-20180812150601-show.txt b/wiki/Hacking:WarpTool%2UI_design_info-20180812150601-show.txt new file mode 100644 index 0000000..52d0511 --- /dev/null +++ b/wiki/Hacking:WarpTool%2UI_design_info-20180812150601-show.txt @@ -0,0 +1,90 @@ + + +__TOC__ + +==Idea and background== + +A plugin named iWarp ([http://docs.gimp.org/2.6/en/plug-in-iwarp.html http://docs.gimp.org/2.6/en/plug-in-iwarp.html]) already exists in Gimp, but suffer from different troubles (small preview, uneasy manipulation). This year’s Google Summer of Code have a project to implement this behavior as a real live on-canvas tool in Gimp. This project is taken by Michael Muré (batolettre@gmail.com, irc: Bat`O on #gimp@irc.gnome.org). + +Basically, this would allow users to deform an image by a series of cursor action on it. This can be seen as a sort of sculpt. See for example the case where user can move pixel with a stroke of mouse. Others behavior can also be implemented, see below. + + +==A quick technical sneak peek== + +This tool will be a complete rewrite, no parts will be taken from the plugin. The tool will works with Gegl. The plugin can be seen as a proof of concept. + +Technically, this tool will work in two steps: + + +# a series of tools, one by behavior, act on a image-sized buffer that hold relative coordinate for each pixel. That mean that each pixel of the final image will have on this buffer a coordinate from where the final color come from. +# the final image is computed from the original image and this buffer. + +The approach with a coordinate buffer instead of acting directly on the image allows to: + + +# Render the tool effect in a constant time, no matter the number of stroke. +# No information lost. See for example the case of a pinch done multiple times in the same area so the input pixel would collapse. If you un-pinch the area, the map-absolute operator will fetch the right pixels, with no data loss. + +==Potential behavior== + +This technical approach gives a good liberty when implementing behavior. Following is a list a potential behavior, but other can be found and implemented. + + +# move: the stroke moves pixels under the cursor +# swirl (left and right) - rotary transform +# erase transform: cancel the transformation locally (ie set the relative coordinate to zero) +# pinch/concentrate +# expand +# smooth: tend to flatten the transformation + +All operations are applied with a feathered "brush", so effect is largest at center and smallest at edge. + + +==Tool options== + +This tool would have as options at least: + + +# size of the effect +# shape of the effect (round or square ?) -i dont think offering other shapes than round provides much... [https://wiki.gimp.org/index.php?title=User:AlexiaDeath&action=edit&redlink=1 AlexiaDeath] 20:41, 2 June 2011 (UTC) +# Hardness of the effect (see hardness in round brushes) + +This part, as the others, need to be thought in details, an probably expanded. + + +==Undo== + +Undo should be achievable with this tool. What is exactly doable (one step undo ? more ?) is currently unclear and need to be discussed. + +Possible way to achieve that: + + +# keeping copies of the coordinate buffer +## it will quickly eat a lot of memory +## it will quickly eat a lot of memory +# it will quickly eat a lot of memory +# applying the stroke in reverse, +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +## it lead to approximation problem +## not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# it lead to approximation problem +# not all behavior are easy to undo (see for instance the cancel or smooth behavior) +# recording all the stroke applied, and recomputing the coordinate buffer when undoing +## can take a lot of time if there is many strokes +## can take a lot of time if there is many strokes +# can take a lot of time if there is many strokes +# mixed solution: keeping "keyframe" coordinate buffer, every n stroke + every strokes, and recompute from this keyframe when undoing +# keeping modified tiles for every stroke done, and recompose a buffer when undoing +# stack one gegl op for each stroke in a gegl graph to compute the final coordinate buffer, and unstack op for undo + +==Quality== + +Since editing the coordinate buffer and rendering the transformation are two separated process, we can render the image with different quality without affecting the deformation. + + +==Pressure sensitivity== + +Options like the size of the effect or the sharpening of the shape could be pressure sensitive. + + \ No newline at end of file diff --git a/wiki/Hacking:_Building%2FMac_OSX-20140901173819-show.txt b/wiki/Hacking:_Building%2FMac_OSX-20140901173819-show.txt new file mode 100644 index 0000000..1f0ec59 --- /dev/null +++ b/wiki/Hacking:_Building%2FMac_OSX-20140901173819-show.txt @@ -0,0 +1,7 @@ + + +This explains how to build and install GIMP on an Apple computer running the OSX operating system. + +One person describes [http://sites.google.com/site/httimchen/2011_imagesvn/build-gimp-on-mac how to build Gimp on OSX] using native [http://gtk-osx.sourceforge.net/ gtk-osx] and the [http://developer.gnome.org/jhbuild/ jhbuild] tool. + + \ No newline at end of file diff --git a/wiki/Hacking:_Building%2FMac_OSX-20140901181141-edit.txt b/wiki/Hacking:_Building%2FMac_OSX-20140901181141-edit.txt new file mode 100644 index 0000000..354272d --- /dev/null +++ b/wiki/Hacking:_Building%2FMac_OSX-20140901181141-edit.txt @@ -0,0 +1,4 @@ + +GIMP Developer Wiki has restricted the ability to create new pages. +You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]]. + \ No newline at end of file diff --git a/wiki/Hacking:_Building%2FMac_OSX-20140901181654-history.txt b/wiki/Hacking:_Building%2FMac_OSX-20140901181654-history.txt new file mode 100644 index 0000000..b83c72d --- /dev/null +++ b/wiki/Hacking:_Building%2FMac_OSX-20140901181654-history.txt @@ -0,0 +1,5 @@ + + +There is no edit history for this page. + + \ No newline at end of file diff --git a/wiki/Hacking:_Building%2FMac_OSX-20161024010200-edit.txt b/wiki/Hacking:_Building%2FMac_OSX-20161024010200-edit.txt new file mode 100644 index 0000000..3c584f4 --- /dev/null +++ b/wiki/Hacking:_Building%2FMac_OSX-20161024010200-edit.txt @@ -0,0 +1,3 @@ +This explains how to build and install GIMP on an Apple computer running the OSX operating system. + +One person describes [http://sites.google.com/site/httimchen/2011_imagesvn/build-gimp-on-mac how to build Gimp on OSX] using native [http://gtk-osx.sourceforge.net/ gtk-osx] and the [http://developer.gnome.org/jhbuild/ jhbuild] tool. diff --git a/wiki/Hacking:_Building%2FMac_OSX-20210515121756-edit.txt b/wiki/Hacking:_Building%2FMac_OSX-20210515121756-edit.txt new file mode 100644 index 0000000..f3133d4 --- /dev/null +++ b/wiki/Hacking:_Building%2FMac_OSX-20210515121756-edit.txt @@ -0,0 +1,9 @@ +== Current procedure == + +GIMP has an official build whose scripts are located at this repo: https://gitlab.gnome.org/Infrastructure/gimp-macos-build + +== Historical links == + +Some older links explain how to build and install GIMP on an Apple computer running the OSX operating system. We are not sure how acceptable they are with current code. + +One person describes [http://sites.google.com/site/httimchen/2011_imagesvn/build-gimp-on-mac how to build Gimp on OSX] using native [http://gtk-osx.sourceforge.net/ gtk-osx] and the [http://developer.gnome.org/jhbuild/ jhbuild] tool. diff --git a/wiki/Hacking:_Building%2Mac_OSX-20180812150603-show.txt b/wiki/Hacking:_Building%2Mac_OSX-20180812150603-show.txt new file mode 100644 index 0000000..1f0ec59 --- /dev/null +++ b/wiki/Hacking:_Building%2Mac_OSX-20180812150603-show.txt @@ -0,0 +1,7 @@ + + +This explains how to build and install GIMP on an Apple computer running the OSX operating system. + +One person describes [http://sites.google.com/site/httimchen/2011_imagesvn/build-gimp-on-mac how to build Gimp on OSX] using native [http://gtk-osx.sourceforge.net/ gtk-osx] and the [http://developer.gnome.org/jhbuild/ jhbuild] tool. + + \ No newline at end of file diff --git a/wiki/Hacking:fast_plug-in-20150910192607-show.txt b/wiki/Hacking:fast_plug-in-20150910192607-show.txt new file mode 100644 index 0000000..cd1e8ef --- /dev/null +++ b/wiki/Hacking:fast_plug-in-20150910192607-show.txt @@ -0,0 +1,196 @@ + +
    +#include 
    +
    +static void query (void);
    +static void run   (const gchar      *name,
    +                   gint              nparams,
    +                   const GimpParam  *param,
    +                   gint             *nreturn_vals,
    +                   GimpParam       **return_vals);
    +static void blur  (GimpDrawable     *drawable);
    +
    +GimpPlugInInfo PLUG_IN_INFO =
    +{
    +  NULL,
    +  NULL,
    +  query,
    +  run
    +};
    +
    +MAIN()
    +
    +static void
    +query (void)
    +{
    +  static GimpParamDef args[] =
    +  {
    +    {
    +      GIMP_PDB_INT32,
    +      "run-mode",
    +      "Run mode"
    +    },
    +    {
    +      GIMP_PDB_IMAGE,
    +      "image",
    +      "Input image"
    +    },
    +    {
    +      GIMP_PDB_DRAWABLE,
    +      "drawable",
    +      "Input drawable"
    +    }
    +  };
    +
    +  gimp_install_procedure (
    +    "plug-in-myblur2",
    +    "My blur 2 (fast)",
    +    "Blurs the image",
    +    "David Neary",
    +    "Copyright David Neary",
    +    "2004",
    +    "_My blur 2 (fast)",
    +    "RGB*, GRAY*",
    +    GIMP_PLUGIN,
    +    G_N_ELEMENTS (args), 0,
    +    args, NULL);
    +
    +  gimp_plugin_menu_register ("plug-in-myblur2",
    +                             "/Filters/Blur");
    +}
    +
    +static void
    +run (const gchar      *name,
    +     gint              nparams,
    +     const GimpParam  *param,
    +     gint             *nreturn_vals,
    +     GimpParam       **return_vals)
    +{
    +  static GimpParam  values[1];
    +  GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +  GimpRunMode       run_mode;
    +  GimpDrawable     *drawable;
    +
    +  /* Setting mandatory output values */
    +  *nreturn_vals = 1;
    +  *return_vals  = values;
    +
    +  values[0].type = GIMP_PDB_STATUS;
    +  values[0].data.d_status = status;
    +
    +  /* Getting run_mode - we won't display a dialog if
    +   * we are in NONINTERACTIVE mode
    +   */
    +  run_mode = param[0].data.d_int32;
    +
    +  /*  Get the specified drawable  */
    +  drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +  gimp_progress_init ("My Blur...");
    +
    +  /* Let's time blur
    +   *
    +   *   GTimer timer = g_timer_new time ();
    +   */
    +
    +  blur (drawable);
    +
    +  /*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
    +   *   g_timer_destroy (timer);
    +   */
    +
    +  gimp_displays_flush ();
    +  gimp_drawable_detach (drawable);
    +
    +  return;
    +}
    +
    +static void
    +blur (GimpDrawable *drawable)
    +{
    +  gint         i, j, k, channels;
    +  gint         x1, y1, x2, y2;
    +  GimpPixelRgn rgn_in, rgn_out;
    +  guchar      *row1, *row2, *row3;
    +  guchar      *outrow;
    +
    +  gimp_drawable_mask_bounds (drawable->drawable_id,
    +                             &x1, &y1,
    +                             &x2, &y2);
    +  channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +  gimp_pixel_rgn_init (&rgn_in,
    +                       drawable,
    +                       x1, y1,
    +                       x2 - x1, y2 - y1,
    +                       FALSE, FALSE);
    +  gimp_pixel_rgn_init (&rgn_out,
    +                       drawable,
    +                       x1, y1,
    +                       x2 - x1, y2 - y1,
    +                       TRUE, TRUE);
    +
    +  /* Initialise enough memory for row1, row2, row3, outrow */
    +  row1 = g_new (guchar, channels * (x2 - x1));
    +  row2 = g_new (guchar, channels * (x2 - x1));
    +  row3 = g_new (guchar, channels * (x2 - x1));
    +  outrow = g_new (guchar, channels * (x2 - x1));
    +
    +  for (i = y1; i < y2; i++)
    +    {
    +      /* Get row i-1, i, i+1 */
    +      gimp_pixel_rgn_get_row (&rgn_in,
    +                              row1,
    +                              x1, MAX (y1, i - 1),
    +                              x2 - x1);
    +      gimp_pixel_rgn_get_row (&rgn_in,
    +                              row2,
    +                              x1, i,
    +                              x2 - x1);
    +      gimp_pixel_rgn_get_row (&rgn_in,
    +                              row3,
    +                              x1, MIN (y2 - 1, i + 1),
    +                              x2 - x1);
    +
    +      for (j = x1; j < x2; j++)
    +        {
    +          /* For each layer, compute the average of the nine
    +           * pixels */
    +          for (k = 0; k < channels; k++)
    +            {
    +              int sum = 0;
    +              sum = row1[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                    row1[channels * (j - x1) + k]                        +
    +                    row1[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
    +                    row2[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                    row2[channels * (j - x1) + k]                        +
    +                    row2[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k] +
    +                    row3[channels * MAX ((j - 1 - x1), 0) + k]           +
    +                    row3[channels * (j - x1) + k]                        +
    +                    row3[channels * MIN ((j + 1 - x1), x2 - x1 - 1) + k];
    +              outrow[channels * (j - x1) + k] = sum / 9;
    +            }
    +        }
    +
    +      gimp_pixel_rgn_set_row (&rgn_out,
    +                              outrow,
    +                              x1, i,
    +                              x2 - x1);
    +
    +      if (i % 10 == 0)
    +        gimp_progress_update ((gdouble) (i - y1) / (gdouble) (y2 - y1));
    +    }
    +
    +  g_free (row1);
    +  g_free (row2);
    +  g_free (row3);
    +  g_free (outrow);
    +
    +  gimp_drawable_flush (drawable);
    +  gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +  gimp_drawable_update (drawable->drawable_id,
    +                        x1, y1,
    +                        x2 - x1, y2 - y1);
    +}
    +
    +
    diff --git a/wiki/Hacking:pdbgen-20150908170739-edit.txt b/wiki/Hacking:pdbgen-20150908170739-edit.txt new file mode 100644 index 0000000..0d89546 --- /dev/null +++ b/wiki/Hacking:pdbgen-20150908170739-edit.txt @@ -0,0 +1 @@ +For a detailed explanation about how to write a new PDB procedure, please see the [http://git.gnome.org/browse/gimp/tree/tools/pdbgen/README_NEW_PDB_PROC tools/pdbgen/README_NEW_PDB_PROC] file inside the gimp source repository diff --git a/wiki/Hacking:pdbgen-20161024012354-show.txt b/wiki/Hacking:pdbgen-20161024012354-show.txt new file mode 100644 index 0000000..ebf96d5 --- /dev/null +++ b/wiki/Hacking:pdbgen-20161024012354-show.txt @@ -0,0 +1,5 @@ + + +For a detailed explanation about how to write a new PDB procedure, please see the [http://git.gnome.org/browse/gimp/tree/tools/pdbgen/README_NEW_PDB_PROC tools/pdbgen/README_NEW_PDB_PROC] file inside the gimp source repository + + \ No newline at end of file diff --git a/wiki/Hacking:pdbgen-20201125224303-edit.txt b/wiki/Hacking:pdbgen-20201125224303-edit.txt new file mode 100644 index 0000000..61fd1e5 --- /dev/null +++ b/wiki/Hacking:pdbgen-20201125224303-edit.txt @@ -0,0 +1 @@ +For a detailed explanation about how to write a new PDB procedure, please see the [https://gitlab.gnome.org/GNOME/gimp/raw/master/pdb/README_NEW_PDB_PROC README_NEW_PDB_PROC] file inside the GIMP's source code repository. diff --git a/wiki/Hacking:slow_plug-in-20150910163345-show.txt b/wiki/Hacking:slow_plug-in-20150910163345-show.txt new file mode 100644 index 0000000..b6ee353 --- /dev/null +++ b/wiki/Hacking:slow_plug-in-20150910163345-show.txt @@ -0,0 +1,199 @@ + +
    +#include 
    +
    +static void query (void);
    +static void run   (const gchar      *name,
    +                   gint              nparams,
    +                   const GimpParam  *param,
    +                   gint             *nreturn_vals,
    +                   GimpParam       **return_vals);
    +static void blur  (GimpDrawable     *drawable);
    +
    +GimpPlugInInfo PLUG_IN_INFO =
    +{
    +  NULL,
    +  NULL,
    +  query,
    +  run
    +};
    +
    +MAIN()
    +
    +static void
    +query (void)
    +{
    +  static GimpParamDef args[] =
    +  {
    +    {
    +      GIMP_PDB_INT32,
    +      "run-mode",
    +      "Run mode"
    +    },
    +    {
    +      GIMP_PDB_IMAGE,
    +      "image",
    +      "Input image"
    +    },
    +    {
    +      GIMP_PDB_DRAWABLE,
    +      "drawable",
    +      "Input drawable"
    +    }
    +  };
    +
    +  gimp_install_procedure (
    +    "plug-in-myblur1",
    +    "My blur 1 (slow)",
    +    "Blurs the image",
    +    "David Neary",
    +    "Copyright David Neary",
    +    "2004",
    +    "_My blur 1 (slow)",
    +    "RGB*, GRAY*",
    +    GIMP_PLUGIN,
    +    G_N_ELEMENTS (args), 0,
    +    args, NULL);
    +
    +  gimp_plugin_menu_register ("plug-in-myblur1",
    +                             "/Filters/Blur");
    +}
    +
    +static void
    +run (const gchar      *name,
    +     gint              nparams,
    +     const GimpParam  *param,
    +     gint             *nreturn_vals,
    +     GimpParam       **return_vals)
    +{
    +  static GimpParam  values[1];
    +  GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +  GimpRunMode       run_mode;
    +  GimpDrawable     *drawable;
    +
    +  /* Setting mandatory output values */
    +  *nreturn_vals = 1;
    +  *return_vals  = values;
    +
    +  values[0].type = GIMP_PDB_STATUS;
    +  values[0].data.d_status = status;
    +
    +  /* Getting run_mode - we won't display a dialog if
    +   * we are in NONINTERACTIVE mode
    +   */
    +  run_mode = param[0].data.d_int32;
    +
    +  /*  Get the specified drawable  */
    +  drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +  gimp_progress_init ("My Blur...");
    +
    +  /* Let's time blur
    +   *
    +   *   GTimer timer = g_timer_new time ();
    +   */
    +
    +  blur (drawable);
    +
    +  /*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
    +   *   g_timer_destroy (timer);
    +   */
    +
    +  gimp_displays_flush ();
    +  gimp_drawable_detach (drawable);
    +}
    +
    +static void
    +blur (GimpDrawable *drawable)
    +{
    +  gint         i, j, k, channels;
    +  gint         x1, y1, x2, y2;
    +  GimpPixelRgn rgn_in, rgn_out;
    +  guchar       output[4];
    +
    +  /* Gets upper left and lower right coordinates,
    +   * and layers number in the image */
    +  gimp_drawable_mask_bounds (drawable->drawable_id,
    +                             &x1, &y1,
    +                             &x2, &y2);
    +  channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +  /* Initialises two PixelRgns, one to read original data,
    +   * and the other to write output data. That second one will
    +   * be merged at the end by the call to
    +   * gimp_drawable_merge_shadow() */
    +  gimp_pixel_rgn_init (&rgn_in,
    +                       drawable,
    +                       x1, y1,
    +                       x2 - x1, y2 - y1,
    +                       FALSE, FALSE);
    +  gimp_pixel_rgn_init (&rgn_out,
    +                       drawable,
    +                       x1, y1,
    +                       x2 - x1, y2 - y1,
    +                       TRUE, TRUE);
    +
    +  for (i = x1; i < x2; i++)
    +    {
    +      for (j = y1; j < y2; j++)
    +        {
    +          guchar pixel[9][4];
    +
    +          /* Get nine pixels */
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[0],
    +                                    MAX (i - 1, x1), MAX (j - 1, y1));
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[1],
    +                                    MAX (i - 1, x1), j);
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[2],
    +                                    MAX (i - 1, x1), MIN (j + 1, y2 - 1));
    +
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[3],
    +                                    i, MAX (j - 1, y1));
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[4],
    +                                    i, j);
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[5],
    +                                    i, MIN (j + 1, y2 - 1));
    +
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[6],
    +                                    MIN (i + 1, x2 - 1), MAX (j - 1, y1));
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[7],
    +                                    MIN (i + 1, x2 - 1), j);
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[8],
    +                                    MIN (i + 1, x2 - 1), MIN (j + 1, y2 - 1));
    +
    +          /* For each layer, compute the average of the
    +           * nine */
    +          for (k = 0; k < channels; k++)
    +            {
    +              int tmp, sum = 0;
    +              for (tmp = 0; tmp < 9; tmp++)
    +                sum += pixel[tmp][k];
    +              output[k] = sum / 9;
    +            }
    +
    +          gimp_pixel_rgn_set_pixel (&rgn_out,
    +                                    output,
    +                                    i, j);
    +        }
    +
    +      if (i % 10 == 0)
    +        gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1));
    +    }
    +
    +  /* Update the modified region */
    +  gimp_drawable_flush (drawable);
    +  gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +  gimp_drawable_update (drawable->drawable_id,
    +                        x1, y1,
    +                        x2 - x1, y2 - y1);
    +}
    +
    diff --git a/wiki/Hacking:slow_plug-in-20151225224544-edit.txt b/wiki/Hacking:slow_plug-in-20151225224544-edit.txt new file mode 100644 index 0000000..1daf163 --- /dev/null +++ b/wiki/Hacking:slow_plug-in-20151225224544-edit.txt @@ -0,0 +1,198 @@ +
    +#include 
    +
    +static void query (void);
    +static void run   (const gchar      *name,
    +                   gint              nparams,
    +                   const GimpParam  *param,
    +                   gint             *nreturn_vals,
    +                   GimpParam       **return_vals);
    +static void blur  (GimpDrawable     *drawable);
    +
    +GimpPlugInInfo PLUG_IN_INFO =
    +{
    +  NULL,
    +  NULL,
    +  query,
    +  run
    +};
    +
    +MAIN()
    +
    +static void
    +query (void)
    +{
    +  static GimpParamDef args[] =
    +  {
    +    {
    +      GIMP_PDB_INT32,
    +      "run-mode",
    +      "Run mode"
    +    },
    +    {
    +      GIMP_PDB_IMAGE,
    +      "image",
    +      "Input image"
    +    },
    +    {
    +      GIMP_PDB_DRAWABLE,
    +      "drawable",
    +      "Input drawable"
    +    }
    +  };
    +
    +  gimp_install_procedure (
    +    "plug-in-myblur1",
    +    "My blur 1 (slow)",
    +    "Blurs the image",
    +    "David Neary",
    +    "Copyright David Neary",
    +    "2004",
    +    "_My blur 1 (slow)",
    +    "RGB*, GRAY*",
    +    GIMP_PLUGIN,
    +    G_N_ELEMENTS (args), 0,
    +    args, NULL);
    +
    +  gimp_plugin_menu_register ("plug-in-myblur1",
    +                             "/Filters/Blur");
    +}
    +
    +static void
    +run (const gchar      *name,
    +     gint              nparams,
    +     const GimpParam  *param,
    +     gint             *nreturn_vals,
    +     GimpParam       **return_vals)
    +{
    +  static GimpParam  values[1];
    +  GimpPDBStatusType status = GIMP_PDB_SUCCESS;
    +  GimpRunMode       run_mode;
    +  GimpDrawable     *drawable;
    +
    +  /* Setting mandatory output values */
    +  *nreturn_vals = 1;
    +  *return_vals  = values;
    +
    +  values[0].type = GIMP_PDB_STATUS;
    +  values[0].data.d_status = status;
    +
    +  /* Getting run_mode - we won't display a dialog if
    +   * we are in NONINTERACTIVE mode
    +   */
    +  run_mode = param[0].data.d_int32;
    +
    +  /*  Get the specified drawable  */
    +  drawable = gimp_drawable_get (param[2].data.d_drawable);
    +
    +  gimp_progress_init ("My Blur...");
    +
    +  /* Let's time blur
    +   *
    +   *   GTimer timer = g_timer_new time ();
    +   */
    +
    +  blur (drawable);
    +
    +  /*   g_print ("blur() took %g seconds.\n", g_timer_elapsed (timer));
    +   *   g_timer_destroy (timer);
    +   */
    +
    +  gimp_displays_flush ();
    +  gimp_drawable_detach (drawable);
    +}
    +
    +static void
    +blur (GimpDrawable *drawable)
    +{
    +  gint         i, j, k, channels;
    +  gint         x1, y1, x2, y2;
    +  GimpPixelRgn rgn_in, rgn_out;
    +  guchar       output[4];
    +
    +  /* Gets upper left and lower right coordinates,
    +   * and layers number in the image */
    +  gimp_drawable_mask_bounds (drawable->drawable_id,
    +                             &x1, &y1,
    +                             &x2, &y2);
    +  channels = gimp_drawable_bpp (drawable->drawable_id);
    +
    +  /* Initialises two PixelRgns, one to read original data,
    +   * and the other to write output data. That second one will
    +   * be merged at the end by the call to
    +   * gimp_drawable_merge_shadow() */
    +  gimp_pixel_rgn_init (&rgn_in,
    +                       drawable,
    +                       x1, y1,
    +                       x2 - x1, y2 - y1,
    +                       FALSE, FALSE);
    +  gimp_pixel_rgn_init (&rgn_out,
    +                       drawable,
    +                       x1, y1,
    +                       x2 - x1, y2 - y1,
    +                       TRUE, TRUE);
    +
    +  for (i = x1; i < x2; i++)
    +    {
    +      for (j = y1; j < y2; j++)
    +        {
    +          guchar pixel[9][4];
    +
    +          /* Get nine pixels */
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[0],
    +                                    MAX (i - 1, x1), MAX (j - 1, y1));
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[1],
    +                                    MAX (i - 1, x1), j);
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[2],
    +                                    MAX (i - 1, x1), MIN (j + 1, y2 - 1));
    +
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[3],
    +                                    i, MAX (j - 1, y1));
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[4],
    +                                    i, j);
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[5],
    +                                    i, MIN (j + 1, y2 - 1));
    +
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[6],
    +                                    MIN (i + 1, x2 - 1), MAX (j - 1, y1));
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[7],
    +                                    MIN (i + 1, x2 - 1), j);
    +          gimp_pixel_rgn_get_pixel (&rgn_in,
    +                                    pixel[8],
    +                                    MIN (i + 1, x2 - 1), MIN (j + 1, y2 - 1));
    +
    +          /* For each layer, compute the average of the
    +           * nine */
    +          for (k = 0; k < channels; k++)
    +            {
    +              int tmp, sum = 0;
    +              for (tmp = 0; tmp < 9; tmp++)
    +                sum += pixel[tmp][k];
    +              output[k] = sum / 9;
    +            }
    +
    +          gimp_pixel_rgn_set_pixel (&rgn_out,
    +                                    output,
    +                                    i, j);
    +        }
    +
    +      if (i % 10 == 0)
    +        gimp_progress_update ((gdouble) (i - x1) / (gdouble) (x2 - x1));
    +    }
    +
    +  /* Update the modified region */
    +  gimp_drawable_flush (drawable);
    +  gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
    +  gimp_drawable_update (drawable->drawable_id,
    +                        x1, y1,
    +                        x2 - x1, y2 - y1);
    +}
    +
    diff --git a/wiki/Index_of_Algorithms-20161017122923-edit.txt b/wiki/Index_of_Algorithms-20161017122923-edit.txt new file mode 100644 index 0000000..8798d69 --- /dev/null +++ b/wiki/Index_of_Algorithms-20161017122923-edit.txt @@ -0,0 +1,17 @@ +[[Category:Algorithms]] + +These pages contain descriptions of the algorithms used in GIMP and GEGL. + +It is a reference for developers and scientists. + +Operations starting with 'gimp:' are in GIMP, operations starting with 'gegl:' are in GEGL. + +{| class="wikitable sortable" style="text-align: left;" +! style="text-align: center;"| '''Operation name''' +! style="text-align: center;"| '''PDB operation name''' +! style="text-align: center;"| '''GUI menu item''' +! style="text-align: center;"| '''Implementation file''' +! style="text-align: center;"| '''Description''' +|- +| gimp:flood || gimp-selection-flood || Select -> Remove holes || [https://git.gnome.org/browse/gimp/tree/app/operations/gimpoperationflood.c gimpoperationflood.c] || [[Flood algorithm]] +|} diff --git a/wiki/Index_of_Algorithms-20180812150606-show.txt b/wiki/Index_of_Algorithms-20180812150606-show.txt new file mode 100644 index 0000000..bcedb21 --- /dev/null +++ b/wiki/Index_of_Algorithms-20180812150606-show.txt @@ -0,0 +1,20 @@ + + + +These pages contain descriptions of the algorithms used in GIMP and GEGL. + +It is a reference for developers and scientists. + +Operations starting with 'gimp:' are in GIMP, operations starting with 'gegl:' are in GEGL. + + +{| class="wikitable" +|- +! '''Operation name''' +! '''PDB operation name''' +! '''GUI menu item''' +! '''Implementation file''' +! '''Description''' +|- +| gimp:flood | gimp-selection-flood | Select -> Remove holes | [https://git.gnome.org/browse/gimp/tree/app/operations/gimpoperationflood.c gimpoperationflood.c] | [[Flood algorithm]] +|} diff --git a/wiki/LGM2014Minutes-20141108144820-edit.txt b/wiki/LGM2014Minutes-20141108144820-edit.txt new file mode 100644 index 0000000..952463c --- /dev/null +++ b/wiki/LGM2014Minutes-20141108144820-edit.txt @@ -0,0 +1,310 @@ += Libre Graphics Meeting 2014 = + +University of Leipzig, Germany +GIMP team meeting minutes +03.+06.04.2014 + + +Participants: +* Hartmut Kuhse (OnkelHatti) (intermittently) +* Jehan Pagès (Jehan_ZeMarmot) +* Joao S. O. Bueno (gwidion) (intermittently) +* Michael Natterer (mitch) +* Michael Schumacher (schumaml) (minute taker) +* Øyvind Kolås (pippin) +* Peter Sikking (guihipster) +* Simon Budig (nomis) (minute taker) +* Sven Claussner (scl) (minute taker) +* Ville Pätsi (drc) (intermittently) + + +Guests: +* Antenne Springborn (antenne) (intermittently) +* Aryeom Han +* Jon Nordby (jonnor) from MyPaint (intermittently) +* Tobias Ellinghaus (houz) from Darktable (intermittently) + + +== Last Year’s Minutes == + +https://docs.google.com/document/d/1O8UUijIyVM5r5ivECzwakjUC37LseJ6Az_we-icIOKo/ + + + + +== Collaboration between developers and interaction architect == + +Peter points out that the state of the collaboration is critical. For the last three years it has gone down a negative spiral. Sometimes he is asked for advice from developers how certain things in the UI can be solved, but finally it’s often implemented differently. Currently he doesn’t see results from a collaboration with the designer anymore. Either we reboot or stop it. +The Free Select Tool is one positive example. Martin Nordholts and Peter worked complementary very well. The reasons for its success were mutual trust and mutual support. Peter likes to see more of such a fruitful collaboration. Otherwise he sees no alternative than leaving the project. +In Peter’s opinion the non-deterministic development practice is problematic. +Michael Natterer points out that it also necessary to have the UI designer at hand when we need him. In the case of the Unified Transform Tool the developers liked to clarify open questions with the UI designer, but the UI was missing his input. + + +Peter explains his point of view with a triangle diagram: + +[[File:Roles-triangle.png]] + +The designer’s role is to ‘connect the synapses’ with his design, i.e. to moderate between +the three corners to finally bring the project to success. +There is no complete agreement over this model. Some developers point out that this model is more suitable to companies which deliver products and where it is usual to tell other people what they have to do. In their opinion open source development is different: there is no such thing as a ‘product’ and people work on what they like. With respect to the difficulties to find and bind contributors this is something we have to deal with if we want to be attractive to contributors. Separating the designers from the developers takes the fun out of development. +In the further discussion the ‘product’ is more neutrally named ‘gold’. + + +Final agreement: +To revive the collaboration we need to get a way to improve the shipment of the designer’s results. From now on there are two ways to implement things: +1. Developers can solve UI problems as they think without involving the UI designer. These things can land in the release. It might be possible that they will be changed in the future and redone involving more comprehensive UI considerations. +2. Developers can ask the interaction architect for advice, but then it becomes a 100% UI topic. This means that these things will be implemented to the UI designer’s specifications and shipped. + +== Feature planning for GIMP 2.10 == + +The roadmap in the wiki is outdated. We agree to have the following features in GIMP 2.10 and to update the feature roadmap in the wiki accordingly. +Features and actions for GIMP 2.10: + +* GEGL porting: to be finished, +* porting file plugins to GEGL: done, +* fix PNG and TIFF support, +* high bit depths: sort out number format modes in the UI, +* OpenCL porting: is outside of GIMP’s responsibility (is a GEGL task), +* support layer masks, +* libgimp: some more new UI, deprecations, mostly + * libgimp drawable core, + * libgimp LCMS API, + * libgimp metadata API, +* ensure that speedups land in Windows and OSX, +* synchronize Windows nightly and release builds to make builds repeatable, +* commit tools’ results on switching to another function, +* Warp Tool: needs Peter’s review, +* Seamless Clone Tool: needs more work → scl: what exactly?, +* Unified Transform Tool: remove grid(?) look for precision aspects which don't harm feeling, +* Foreground Select Tool is in horrible state: → scl: actions to be taken?, +* fix the mess in the menus, e.g. duplicated entries, +* PSD support is merged into GIMP master and utterly broken: needs rework, +* professional theme. + + +Agreement: +Instead of big bang releases we switch to a rolling release strategy: each release can have bug fixes as well as new features. + + +Feature playground: +If a feature isn’t matured enough for production use yet, we release it disabled: it is not shown in the UI by default, but can be enabled in a configuration file. If done so, then GIMP shows a warning: ‘Development feature, might crash. Use at your own risk.’ +Playground features for GIMP 2.10: +* n-point Transform Tool, +* constraint-based Transform Tool (see bug 721009). + + +Floating selection: complex changes, leave it for now +GimpUnitEntry widget: not GTK 3 compliant → will not become part of GIMP or Prioritizing quick fixes with Peter → scl: what was the exact result: live or let die? + + +Sven remarks that the current way of doing the GEGL port seems not be useful to finish it soon: although everybody is free to port filters to GEGL, the process is quite slow. Some filters might get sorted out in GIMP 3.0 when +a) the set of default plug-ins and scripts will be revamped (see wiki document 'Mindstorm:Revamping default plugins and scripts') or +b) they won’t be compliant to the new, GTK 3 based API. +We should rather first make a decision whether to keep each filter and then port only the ‘good ones’ to avoid unnecessary work and delay. +Other developers point out that there seems to be a misunderstanding. Pippin already disabled some filters in the GIMP master’s UI. Every developer is free to priorize GEGL ports him/herself. +Note from scl: IMHO this doesn’t solve the problem of slow progress and delay. Have I missed something important or are we hampering ourselves? + + +== Malicious and reputation-damaging installers and apps == +(by schumaml) + + +1) Malware and ad-ware shippings bundled with GIMP: +This was in the agenda last year already, but we didn’t feel the need for any immediate action. Now, we have +a) abandoned Sourceforge over the mere existence of a such an installer, even though we were never affected, +b) have a “GIMP” applications that is constantly being shoved upon Craigslist user to make them install it to view some “GIMP Images” the scammers send them, and +c) we have a number of installers that ship with sneak-download in “added value” in the form of adware at best, annoying scareware in the middle and full-blown malware at worst. + + +They are cleverly using one of FLOSS’ greatest advantages - that anyone may distribute it, as long as they comply to the licenses, in this case GPL - against us. Legally, there isn’t much, or anything we can do - adding GIMP to an installer is covered by mere aggregation, according to the people I’ve asked. We would probably be able to do something against b), but we can assume that there are real criminals behind that, one who won’t care about such things as laws. + + +2) +There has also been a related issue, although it is a different angle. On the iTunes store, a user has found the following app: +https://itunes.apple.com/us/app/awesome-gimp-photo-editor-pro/id756630894 + + +That name and icon sem to be just a bit similar, doesn’t it - I got a PDF printout of that page in +case it is taken down or altered, available here: +https://drive.google.com/file/d/0B-ZgvtqvrjNnTkgzQlZwaUVMYUk/edit?usp=sharing + + +So this seems to be someone who is trying to capitalize on our name alone (similar to b) above), although the damage to the user is limited to the 99c they spent. +Nevertheless, I complained to Apple, the mailed the author and told him to explain himself, he went on like “that application name is totally different”, and “the icon is from $site and available under some cc license”. + + +Yeah, right. + + +A reply to that had been sent by me, with an addendum to Apply as follows: +“@Apple: we really think that this shouldn't be hard for you to decide.” + + +scl: As of 25.04.2014 the app is still available in the iTunes Store and the iOS AppStore. I propose to insist to Apple to take action. + + +3) How do we deal with GIMP builds that come with additional plug-ins, such as Simone Karin Lehmann’s or Partha Bagchi’s build? + + +Agreement to 3) +3rd party plug-ins and improvements to OS-integration (OS X, Windows, etc.) are ok. +? Shall they become part of the official build? +Changing GIMP’s designed behaviour, like modifications to the Save-Export-behaviour must not become part of the official GIMP builds. + + +Suggestions about how to resolve such issues quicker are welcome: +Brand registration + + +Some people have suggested that we could finally register GIMP and GNU Image Manipulation Program as a brand, to gain some leverage there. +At least one person tried this in Germany, but failed: + + +https://register.dpma.de/DPMAregister/marke/register/302620656/DE?lang=en +- this was the owner of the defunct www.gimp.de forum/blog, we snatched the gimp.de domain when it expired, iirc thanks to nomis spotting it. We do not know any details about the intentions of the attempted brand registration. + + +IIRC there was some attempt to register (basically, troll) GIMP that way in Austria, but I can’t find any trace of it in their brand database. + + +The following link allows for a brand search in several countries - turns up something, but none related or intended to hamper GIMP in any way, it seems: +https://www.tmdn.org/tmview/welcome + + +The name ‘GIMP’ and the Wilber logo shall be protected. Michael Schumacher asks the FSF for advice, cc to Michael Natterer. Also ask/inform Tuomas Kuosmanen (TigerT) about intended use of his logo. +Also GEGL shall be protected. → what exactly: name, logo? Also Babl? +Other suggestions? +Fill them in here, or add new sections. +none + + +== @gimp.org mail aliases for contributors == +(by schumaml) + + +I remember we’ve last discussed this years ago, and some people might actually requested an gimp.org alias to use on e.g. the mailing lists. Others were hesitant, didn’t want to bear the responsibility to have their mails interpreted as “speaking for the project”. +This is, in my opinion, an unsubstantiated fear nowadays. My perception is that everywhere, anywhere, where someone answers a user question by a statement that sounds is it it can have merit, it is taken for an official statement of “The Developers”. This is dangerous because some people do not actually verify their replies before posting on a forum - e.g. by having a look in the gimp user manual - and thus this information spreads. + + +Establishing some sort of “official” spokesperson for GIMP might help to alleviate this problem, but we want to make sure that there#s no shift towards “no @gimp.org”, not trsuthworthy - there are many people who won’t have such an address, but spread verified and correct help to users. It is just that right now, there is virtually no way to someone to distinguish GIMP contributors from other people, at least not without additional research. +Addendum: team business cards +A possible addition, and nice touch in regard to print-orientation, would be to have official team business cards. These might seem obsolete nowadays, but there are places and times where pulling out a phone to pop over a vCard is not feasible or not deemed appropriate. + + +And because we are better at doing things than planning, we should probably finish the design and choose other parameters (eco-friendly material, produced by company the uses FLOSS/engages) + + +scl: I don’t remember the results. Do you or was the topic postponed? + + +== More branch-driven development == +(by schumaml; scl:+1) + + +I’m not sure if we use Git like to should be used - other projects seem to use a lot more branches than we do. This may be due to the fact that that some of our contributors have grown up with CVS, migrated to SVN and still carry its concepts over to Git… but I might be biased ;) +Some opinions on if/how to change this, and a recommended education/enabling program could be useful. + + +Michael Natterer: have no problems with more branches, but draw attention to these policies: +1. The master branch must always be stable. +2. To update the side branches we rebase them. + + +We state that many of us come from SVN and use Git as it was SVN. TODO: post a migration tutorial from SVN to Git to use Git as it is intended. + + +== Bug handling == +(by schumaml) +According to a former product manager of a Mozilla sub-project, and a study about bug handling in GNOME Bugzilla, we are doing pretty good compared to other projects. We read all the bugs, even if we may not be able to do something about them, and apparently we are also pretty thorough with assigning target milestones. I think that we can still be a bit better, though, and would like to discuss how exactly we can do this. + + +Study: http://bugzillametrics.sourceforge.net/publications/ProcessQualityInGNOME.pdf +and another one, explaining the importance of triaging: http://mockus.us/papers/triage.pdf + + +More gnome-love bugs +postponed, see ‘Increasing attractiveness for new contributors’ + + +== Release management == +(by scl) +We know our ‘it is done when it’s done’ situation: we make no clear statements about release dates, users wait sometimes long for a new release that fixes their bugs and out of a sudden without a previous announcement a new release appears. +Secondly the Windows nightly builds and release are still different what unnecessarily hampers reporting windows bugs - we never really know, if a reported problem or solution affects only the nightly build or the released Windows build. +I’m going to improve the current Jenkins installation and jobs. I can introduce Jenkins’ possibilities, answer questions and we could together find out, how it can solve our build and release problems and how far we want to go with it. + + +Jehan: the time between two releases is too long. Bug fix releases take three months or so. New features appear after years. This is disappointing for new contributors. Jehan proposes rolling releases, containing bug fixes as well as new features. → see chapter ‘Feature planning for GIMP 2.10’ + + +Sven: Jenkins can do much more than just building and running a few tests. It can even enable us to deliver continuously, i.e. every commit can trigger a new release. Sven offers to describe Jenkins possibilities in public and then we decide about our release policy. +Peter: It’s also important to know our needs for this decision. + + += Postponed topics = + +== GIMP User Manual review == +(by schumaml) +Occasionally, I come about parts of the user manual that are not entirely accurate or misleading (usually when I look up something in order to refer people to it, in a mail or on IRC). The need to pass this information on in a timely fashion does often not allow me to file a bug report on the spot. + + +There may be technical means to alleviate the problem (I’d happily take a Firefox extension that will let me file a bug for a docs.gimp.org/* page, and maybe include marked text in the initial comment), but maybe we have to start an effort to do a full review of the (English) docs at least once. + + +== Increase attractiveness for new contributors == +(by scl) +In comparison to GIMP’s goals and open tasks it lacks of contributors, for instance Windows developers. On the other hand it seems hard for new contributors to find their way through the code and tasks and inner processes of GIMP development. Let’s think how we can improve the code and overall infrastructure, build an inviting atmosphere (without allegations), bring together fun of development and necessary professionality to achieve our product vision. Also with this in mind I’m for more feature and tinker/prototype branches. + + +== More gnome-love bugs == +Bugs that have the gnome-love keyword assigned as supposed to be rather simple bugs, ideal for beginners. They need not be trivial, but should be isolated and solvable in a rather short time, to maximize the return on investment for new contributors. + + +== GIMP on other platforms == +(by scl) +The topic of GIMP on mobile devices and alternative platforms (e.g. Steam) raises up at least on the mailing lists. A recent Gartner study shows that the importance of the PC platform is declining and tablets etc. are becoming more important, mainly with Android OS (see http://www.gartner.com/newsroom/id/2645115). +We should make a strategic decision: Do we want to support the new platforms? If yes, how? Can we do this? Do we want to wait until GNOME solves these problems satisfyingly (if it hasn’t already)? + + +== Supporting recent graphics hardware in GIMP == +(by scl) +GIMP lacks support of graphics tablets and HiDPI displays. On the other hand other software like Krita shines with out-of-the-box-support for convertible computers (Krita Gemini, see http://krita.org/item/220-krita-2-8-0-released). +Usually we would say, this is solved in GNOME 3 and GIMP will inherit it with the GTK3 port. But this is far in the future. +Let’s think how we can support recent hardware better without letting users wait for so long. + + +== Improving the website and the wiki == +(by scl) +In February I integrated the former website developer.gimp.org to our wiki (except GIMP’s API documentation). Some ideas are still open, see http://wiki.gimp.org/index.php/Mindstorm:Rethinking_the_wiki. Let’s discuss what of them is necessary and what not. +I was also told that the content of www.gimp.org is subject to reconsideration. +Perhaps we can decide these questions as a whole to find a consistent solution. + + +== Bringing open source commitment and real life together == +(by scl) +I really love to contribute to GIMP (and surely others here do the same) but on the other hand everybody has a real life and reconciling both is often a hard thing. Can we share experiences on how each of us deals with this? + + +== Technical architecture documentation == +(by scl) +To make it easier for GIMP developers (including my own practice), especially new contributors, I’m going to write down a current documentation of the technical architecture. Another purpose of it is to make spots visible which can cause us trouble (for instance performance leaks).To get it done I might interview the long-time GIMP/GEGL developers. diff --git a/wiki/LGM2014Minutes-20150905195224-show.txt b/wiki/LGM2014Minutes-20150905195224-show.txt new file mode 100644 index 0000000..bd57342 --- /dev/null +++ b/wiki/LGM2014Minutes-20150905195224-show.txt @@ -0,0 +1,388 @@ + + +__TOC__ + +=Libre Graphics Meeting 2014= + +University of Leipzig, Germany +GIMP team meeting minutes +03.+06.04.2014 + + + +Participants: + + +* Hartmut Kuhse (OnkelHatti) (intermittently) +* Jehan Pagès (Jehan_ZeMarmot) +* Joao S. O. Bueno (gwidion) (intermittently) +* Michael Natterer (mitch) +* Michael Schumacher (schumaml) (minute taker) +* Øyvind Kolås (pippin) +* Peter Sikking (guihipster) +* Simon Budig (nomis) (minute taker) +* Sven Claussner (scl) (minute taker) +* Ville Pätsi (drc) (intermittently) + + +Guests: + + +* Antenne Springborn (antenne) (intermittently) +* Aryeom Han +* Jon Nordby (jonnor) from MyPaint (intermittently) +* Tobias Ellinghaus (houz) from Darktable (intermittently) + + + + +==Last Year’s Minutes== + +[https://docs.google.com/document/d/1O8UUijIyVM5r5ivECzwakjUC37LseJ6Az_we-icIOKo/ https://docs.google.com/document/d/1O8UUijIyVM5r5ivECzwakjUC37LseJ6Az_we-icIOKo/] + + + + +==Collaboration between developers and interaction architect== + +Peter points out that the state of the collaboration is critical. For the last three years it has gone down a negative spiral. Sometimes he is asked for advice from developers how certain things in the UI can be solved, but finally it’s often implemented differently. Currently he doesn’t see results from a collaboration with the designer anymore. Either we reboot or stop it. +The Free Select Tool is one positive example. Martin Nordholts and Peter worked complementary very well. The reasons for its success were mutual trust and mutual support. Peter likes to see more of such a fruitful collaboration. Otherwise he sees no alternative than leaving the project. +In Peter’s opinion the non-deterministic development practice is problematic. +Michael Natterer points out that it also necessary to have the UI designer at hand when we need him. In the case of the Unified Transform Tool the developers liked to clarify open questions with the UI designer, but the UI was missing his input. + + + +Peter explains his point of view with a triangle diagram: + +[[File:Roles-triangle.png|Roles-triangle.png]] + +The designer’s role is to ‘connect the synapses’ with his design, i.e. to moderate between +the three corners to finally bring the project to success. +There is no complete agreement over this model. Some developers point out that this model is more suitable to companies which deliver products and where it is usual to tell other people what they have to do. In their opinion open source development is different: there is no such thing as a ‘product’ and people work on what they like. With respect to the difficulties to find and bind contributors this is something we have to deal with if we want to be attractive to contributors. Separating the designers from the developers takes the fun out of development. +In the further discussion the ‘product’ is more neutrally named ‘gold’. + + + +Final agreement: +To revive the collaboration we need to get a way to improve the shipment of the designer’s results. From now on there are two ways to implement things: +1. Developers can solve UI problems as they think without involving the UI designer. These things can land in the release. It might be possible that they will be changed in the future and redone involving more comprehensive UI considerations. +2. Developers can ask the interaction architect for advice, but then it becomes a 100% UI topic. This means that these things will be implemented to the UI designer’s specifications and shipped. + + +==Feature planning for GIMP 2.10== + +The roadmap in the wiki is outdated. We agree to have the following features in GIMP 2.10 and to update the feature roadmap in the wiki accordingly. +Features and actions for GIMP 2.10: + + +* GEGL porting: to be finished, +* porting file plugins to GEGL: done, +* fix PNG and TIFF support, +* high bit depths: sort out number format modes in the UI, +* OpenCL porting: is outside of GIMP’s responsibility (is a GEGL task), +* support layer masks, +* libgimp: some more new UI, deprecations, mostly +
      * libgimp drawable core,
    +  * libgimp LCMS API,
    +  * libgimp metadata API,
    +
    + +* ensure that speedups land in Windows and OSX, +* synchronize Windows nightly and release builds to make builds repeatable, +* commit tools’ results on switching to another function, +* Warp Tool: needs Peter’s review, +* Seamless Clone Tool: needs more work → scl: what exactly?, +* Unified Transform Tool: remove grid(?) look for precision aspects which don't harm feeling, +* Foreground Select Tool is in horrible state: → scl: actions to be taken?, +* fix the mess in the menus, e.g. duplicated entries, +* PSD support is merged into GIMP master and utterly broken: needs rework, +* professional theme. + + +Agreement: +Instead of big bang releases we switch to a rolling release strategy: each release can have bug fixes as well as new features. + + + +Feature playground: +If a feature isn’t matured enough for production use yet, we release it disabled: it is not shown in the UI by default, but can be enabled in a configuration file. If done so, then GIMP shows a warning: ‘Development feature, might crash. Use at your own risk.’ +Playground features for GIMP 2.10: + + +* n-point Transform Tool, +* constraint-based Transform Tool (see bug 721009). + + +Floating selection: complex changes, leave it for now +GimpUnitEntry widget: not GTK 3 compliant → will not become part of GIMP or Prioritizing quick fixes with Peter → scl: what was the exact result: live or let die? + + + +Sven remarks that the current way of doing the GEGL port seems not be useful to finish it soon: although everybody is free to port filters to GEGL, the process is quite slow. Some filters might get sorted out in GIMP 3.0 when +a) the set of default plug-ins and scripts will be revamped (see wiki document 'Mindstorm:Revamping default plugins and scripts') or +b) they won’t be compliant to the new, GTK 3 based API. +We should rather first make a decision whether to keep each filter and then port only the ‘good ones’ to avoid unnecessary work and delay. +Other developers point out that there seems to be a misunderstanding. Pippin already disabled some filters in the GIMP master’s UI. Every developer is free to priorize GEGL ports him/herself. +Note from scl: IMHO this doesn’t solve the problem of slow progress and delay. Have I missed something important or are we hampering ourselves? + + + + + +==Malicious and reputation-damaging installers and apps== + +(by schumaml) + + + +1) Malware and ad-ware shippings bundled with GIMP: +This was in the agenda last year already, but we didn’t feel the need for any immediate action. Now, we have +a) abandoned Sourceforge over the mere existence of a such an installer, even though we were never affected, +b) have a “GIMP” applications that is constantly being shoved upon Craigslist user to make them install it to view some “GIMP Images” the scammers send them, and +c) we have a number of installers that ship with sneak-download in “added value” in the form of adware at best, annoying scareware in the middle and full-blown malware at worst. + + + +They are cleverly using one of FLOSS’ greatest advantages - that anyone may distribute it, as long as they comply to the licenses, in this case GPL - against us. Legally, there isn’t much, or anything we can do - adding GIMP to an installer is covered by mere aggregation, according to the people I’ve asked. We would probably be able to do something against b), but we can assume that there are real criminals behind that, one who won’t care about such things as laws. + + + +2) +There has also been a related issue, although it is a different angle. On the iTunes store, a user has found the following app: +[https://itunes.apple.com/us/app/awesome-gimp-photo-editor-pro/id756630894 https://itunes.apple.com/us/app/awesome-gimp-photo-editor-pro/id756630894] + + +That name and icon sem to be just a bit similar, doesn’t it - I got a PDF printout of that page in +case it is taken down or altered, available here: +[https://drive.google.com/file/d/0B-ZgvtqvrjNnTkgzQlZwaUVMYUk/edit?usp=sharing https://drive.google.com/file/d/0B-ZgvtqvrjNnTkgzQlZwaUVMYUk/edit?usp=sharing] + + +So this seems to be someone who is trying to capitalize on our name alone (similar to b) above), although the damage to the user is limited to the 99c they spent. +Nevertheless, I complained to Apple, the mailed the author and told him to explain himself, he went on like “that application name is totally different”, and “the icon is from $site and available under some cc license”. + + + +Yeah, right. + + + +A reply to that had been sent by me, with an addendum to Apply as follows: +“@Apple: we really think that this shouldn't be hard for you to decide.” + + + +scl: As of 25.04.2014 the app is still available in the iTunes Store and the iOS AppStore. I propose to insist to Apple to take action. + + + +3) How do we deal with GIMP builds that come with additional plug-ins, such as Simone Karin Lehmann’s or Partha Bagchi’s build? + + + +Agreement to 3) +3rd party plug-ins and improvements to OS-integration (OS X, Windows, etc.) are ok. +? Shall they become part of the official build? +Changing GIMP’s designed behaviour, like modifications to the Save-Export-behaviour must not become part of the official GIMP builds. + + + +Suggestions about how to resolve such issues quicker are welcome: +Brand registration + + + +Some people have suggested that we could finally register GIMP and GNU Image Manipulation Program as a brand, to gain some leverage there. +At least one person tried this in Germany, but failed: + + + +[https://register.dpma.de/DPMAregister/marke/register/302620656/DE?lang=en https://register.dpma.de/DPMAregister/marke/register/302620656/DE?lang=en] +- this was the owner of the defunct www.gimp.de forum/blog, we snatched the gimp.de domain when it expired, iirc thanks to nomis spotting it. We do not know any details about the intentions of the attempted brand registration. + + + +IIRC there was some attempt to register (basically, troll) GIMP that way in Austria, but I can’t find any trace of it in their brand database. + + + +The following link allows for a brand search in several countries - turns up something, but none related or intended to hamper GIMP in any way, it seems: +[https://www.tmdn.org/tmview/welcome https://www.tmdn.org/tmview/welcome] + + +The name ‘GIMP’ and the Wilber logo shall be protected. Michael Schumacher asks the FSF for advice, cc to Michael Natterer. Also ask/inform Tuomas Kuosmanen (TigerT) about intended use of his logo. +Also GEGL shall be protected. → what exactly: name, logo? Also Babl? +Other suggestions? +Fill them in here, or add new sections. +none + + + + + +==@gimp.org mail aliases for contributors== + +(by schumaml) + + + +I remember we’ve last discussed this years ago, and some people might actually requested an gimp.org alias to use on e.g. the mailing lists. Others were hesitant, didn’t want to bear the responsibility to have their mails interpreted as “speaking for the project”. +This is, in my opinion, an unsubstantiated fear nowadays. My perception is that everywhere, anywhere, where someone answers a user question by a statement that sounds is it it can have merit, it is taken for an official statement of “The Developers”. This is dangerous because some people do not actually verify their replies before posting on a forum - e.g. by having a look in the gimp user manual - and thus this information spreads. + + + +Establishing some sort of “official” spokesperson for GIMP might help to alleviate this problem, but we want to make sure that there#s no shift towards “no @gimp.org”, not trsuthworthy - there are many people who won’t have such an address, but spread verified and correct help to users. It is just that right now, there is virtually no way to someone to distinguish GIMP contributors from other people, at least not without additional research. +Addendum: team business cards +A possible addition, and nice touch in regard to print-orientation, would be to have official team business cards. These might seem obsolete nowadays, but there are places and times where pulling out a phone to pop over a vCard is not feasible or not deemed appropriate. + + + +And because we are better at doing things than planning, we should probably finish the design and choose other parameters (eco-friendly material, produced by company the uses FLOSS/engages) + + + +scl: I don’t remember the results. Do you or was the topic postponed? + + + + + +==More branch-driven development== + +(by schumaml; scl:+1) + + + +I’m not sure if we use Git like to should be used - other projects seem to use a lot more branches than we do. This may be due to the fact that that some of our contributors have grown up with CVS, migrated to SVN and still carry its concepts over to Git… but I might be biased ;) +Some opinions on if/how to change this, and a recommended education/enabling program could be useful. + + + +Michael Natterer: have no problems with more branches, but draw attention to these policies: +1. The master branch must always be stable. +2. To update the side branches we rebase them. + + + +We state that many of us come from SVN and use Git as it was SVN. TODO: post a migration tutorial from SVN to Git to use Git as it is intended. + + + + + +==Bug handling== + +(by schumaml) +According to a former product manager of a Mozilla sub-project, and a study about bug handling in GNOME Bugzilla, we are doing pretty good compared to other projects. We read all the bugs, even if we may not be able to do something about them, and apparently we are also pretty thorough with assigning target milestones. I think that we can still be a bit better, though, and would like to discuss how exactly we can do this. + + + +Study: [http://bugzillametrics.sourceforge.net/publications/ProcessQualityInGNOME.pdf http://bugzillametrics.sourceforge.net/publications/ProcessQualityInGNOME.pdf] +and another one, explaining the importance of triaging: [http://mockus.us/papers/triage.pdf http://mockus.us/papers/triage.pdf] + + +More gnome-love bugs +postponed, see ‘Increasing attractiveness for new contributors’ + + + + + +==Release management== + +(by scl) +We know our ‘it is done when it’s done’ situation: we make no clear statements about release dates, users wait sometimes long for a new release that fixes their bugs and out of a sudden without a previous announcement a new release appears. +Secondly the Windows nightly builds and release are still different what unnecessarily hampers reporting windows bugs - we never really know, if a reported problem or solution affects only the nightly build or the released Windows build. +I’m going to improve the current Jenkins installation and jobs. I can introduce Jenkins’ possibilities, answer questions and we could together find out, how it can solve our build and release problems and how far we want to go with it. + + + +Jehan: the time between two releases is too long. Bug fix releases take three months or so. New features appear after years. This is disappointing for new contributors. Jehan proposes rolling releases, containing bug fixes as well as new features. → see chapter ‘Feature planning for GIMP 2.10’ + + + +Sven: Jenkins can do much more than just building and running a few tests. It can even enable us to deliver continuously, i.e. every commit can trigger a new release. Sven offers to describe Jenkins possibilities in public and then we decide about our release policy. +Peter: It’s also important to know our needs for this decision. + + + + + +=Postponed topics= + +==GIMP User Manual review== + +(by schumaml) +Occasionally, I come about parts of the user manual that are not entirely accurate or misleading (usually when I look up something in order to refer people to it, in a mail or on IRC). The need to pass this information on in a timely fashion does often not allow me to file a bug report on the spot. + + + +There may be technical means to alleviate the problem (I’d happily take a Firefox extension that will let me file a bug for a docs.gimp.org/* page, and maybe include marked text in the initial comment), but maybe we have to start an effort to do a full review of the (English) docs at least once. + + + + + +==Increase attractiveness for new contributors== + +(by scl) +In comparison to GIMP’s goals and open tasks it lacks of contributors, for instance Windows developers. On the other hand it seems hard for new contributors to find their way through the code and tasks and inner processes of GIMP development. Let’s think how we can improve the code and overall infrastructure, build an inviting atmosphere (without allegations), bring together fun of development and necessary professionality to achieve our product vision. Also with this in mind I’m for more feature and tinker/prototype branches. + + + + + +==More gnome-love bugs== + +Bugs that have the gnome-love keyword assigned as supposed to be rather simple bugs, ideal for beginners. They need not be trivial, but should be isolated and solvable in a rather short time, to maximize the return on investment for new contributors. + + + + + +==GIMP on other platforms== + +(by scl) +The topic of GIMP on mobile devices and alternative platforms (e.g. Steam) raises up at least on the mailing lists. A recent Gartner study shows that the importance of the PC platform is declining and tablets etc. are becoming more important, mainly with Android OS (see [http://www.gartner.com/newsroom/id/2645115 http://www.gartner.com/newsroom/id/2645115]). +We should make a strategic decision: Do we want to support the new platforms? If yes, how? Can we do this? Do we want to wait until GNOME solves these problems satisfyingly (if it hasn’t already)? + + + + + +==Supporting recent graphics hardware in GIMP== + +(by scl) +GIMP lacks support of graphics tablets and HiDPI displays. On the other hand other software like Krita shines with out-of-the-box-support for convertible computers (Krita Gemini, see [http://krita.org/item/220-krita-2-8-0-released http://krita.org/item/220-krita-2-8-0-released]). +Usually we would say, this is solved in GNOME 3 and GIMP will inherit it with the GTK3 port. But this is far in the future. +Let’s think how we can support recent hardware better without letting users wait for so long. + + + + + +==Improving the website and the wiki== + +(by scl) +In February I integrated the former website developer.gimp.org to our wiki (except GIMP’s API documentation). Some ideas are still open, see [http://wiki.gimp.org/index.php/Mindstorm:Rethinking_the_wiki http://wiki.gimp.org/index.php/Mindstorm:Rethinking_the_wiki]. Let’s discuss what of them is necessary and what not. +I was also told that the content of www.gimp.org is subject to reconsideration. +Perhaps we can decide these questions as a whole to find a consistent solution. + + + + + +==Bringing open source commitment and real life together== + +(by scl) +I really love to contribute to GIMP (and surely others here do the same) but on the other hand everybody has a real life and reconciling both is often a hard thing. Can we share experiences on how each of us deals with this? + + + + + +==Technical architecture documentation== + +(by scl) +To make it easier for GIMP developers (including my own practice), especially new contributors, I’m going to write down a current documentation of the technical architecture. Another purpose of it is to make spots visible which can cause us trouble (for instance performance leaks).To get it done I might interview the long-time GIMP/GEGL developers. + + \ No newline at end of file diff --git a/wiki/Main_Page-20141119180453-show.txt b/wiki/Main_Page-20141119180453-show.txt new file mode 100644 index 0000000..6452b92 --- /dev/null +++ b/wiki/Main_Page-20141119180453-show.txt @@ -0,0 +1,136 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +=== Release information === + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +==== Upcoming Releases ==== + +* [[Release:GIMP 2.8.16]] + +==== Past Releases ==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20150905071559-show.txt b/wiki/Main_Page-20150905071559-show.txt new file mode 100644 index 0000000..1968390 --- /dev/null +++ b/wiki/Main_Page-20150905071559-show.txt @@ -0,0 +1,136 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20150913213351-show.txt b/wiki/Main_Page-20150913213351-show.txt new file mode 100644 index 0000000..1968390 --- /dev/null +++ b/wiki/Main_Page-20150913213351-show.txt @@ -0,0 +1,136 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20151009213806-show.txt b/wiki/Main_Page-20151009213806-show.txt new file mode 100644 index 0000000..1968390 --- /dev/null +++ b/wiki/Main_Page-20151009213806-show.txt @@ -0,0 +1,136 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20160103232406-show.txt b/wiki/Main_Page-20160103232406-show.txt new file mode 100644 index 0000000..656c69f --- /dev/null +++ b/wiki/Main_Page-20160103232406-show.txt @@ -0,0 +1,137 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20160626093418-show.txt b/wiki/Main_Page-20160626093418-show.txt new file mode 100644 index 0000000..eea3be0 --- /dev/null +++ b/wiki/Main_Page-20160626093418-show.txt @@ -0,0 +1,139 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] +* [[Release:2.10 changelog]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20160929124306-show.txt b/wiki/Main_Page-20160929124306-show.txt new file mode 100644 index 0000000..eea3be0 --- /dev/null +++ b/wiki/Main_Page-20160929124306-show.txt @@ -0,0 +1,139 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] +* [[Release:2.10 changelog]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20161028044801-show.txt b/wiki/Main_Page-20161028044801-show.txt new file mode 100644 index 0000000..eea3be0 --- /dev/null +++ b/wiki/Main_Page-20161028044801-show.txt @@ -0,0 +1,139 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] +* [[Release:2.10 changelog]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20161031091442-show.txt b/wiki/Main_Page-20161031091442-show.txt new file mode 100644 index 0000000..eea3be0 --- /dev/null +++ b/wiki/Main_Page-20161031091442-show.txt @@ -0,0 +1,139 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:GIMP 2.8.16]] +* [[Release:2.10 changelog]] + +====Past Releases==== + +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 + +* [[Release:GIMP 2.8.12]] + +* [[Release:GIMP 2.8.10]] + +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20161218185016-show.txt b/wiki/Main_Page-20161218185016-show.txt new file mode 100644 index 0000000..e4cc88e --- /dev/null +++ b/wiki/Main_Page-20161218185016-show.txt @@ -0,0 +1,136 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20170710173543-show.txt b/wiki/Main_Page-20170710173543-show.txt new file mode 100644 index 0000000..e4cc88e --- /dev/null +++ b/wiki/Main_Page-20170710173543-show.txt @@ -0,0 +1,136 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Contact LightningIsMyName at the GIMP IRC (irc://irc.gimp.org/#gimp) or by email (LightningIsMyName at gmail dot com). He is available on IRC usually several hours each day :) Only if not possible, try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml on the GIMP IRC. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20180812150552-show.txt b/wiki/Main_Page-20180812150552-show.txt new file mode 100644 index 0000000..f829adf --- /dev/null +++ b/wiki/Main_Page-20180812150552-show.txt @@ -0,0 +1,137 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20190420011510-show.txt b/wiki/Main_Page-20190420011510-show.txt new file mode 100644 index 0000000..f829adf --- /dev/null +++ b/wiki/Main_Page-20190420011510-show.txt @@ -0,0 +1,137 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20191230003140-show.txt b/wiki/Main_Page-20191230003140-show.txt new file mode 100644 index 0000000..f829adf --- /dev/null +++ b/wiki/Main_Page-20191230003140-show.txt @@ -0,0 +1,137 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20200826181827-show.txt b/wiki/Main_Page-20200826181827-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20200826181827-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20200920054719-show.txt b/wiki/Main_Page-20200920054719-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20200920054719-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20201001180127-show.txt b/wiki/Main_Page-20201001180127-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20201001180127-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20201112002412-show.txt b/wiki/Main_Page-20201112002412-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20201112002412-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20201112032919-show.txt b/wiki/Main_Page-20201112032919-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20201112032919-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20201129020153-edit.txt b/wiki/Main_Page-20201129020153-edit.txt new file mode 100644 index 0000000..f876f7b --- /dev/null +++ b/wiki/Main_Page-20201129020153-edit.txt @@ -0,0 +1,104 @@ +==Welcome to the GIMP Developer wiki!== + +__NOTOC__ + +===What is GIMP?=== +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + +===What is this Wiki for?=== +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + +===Whose is it?=== +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + +===Namespaces=== +Currently existing namespaces are +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + +==General information== +Information here is dedicated to all GIMP wiki readers. + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots of the development version | Screenshots of the development version]] + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL | GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO | GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review | UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + +=== Release information === + +Information here is public and especially meant to assist build maintainers and testers. + +* [[Release:General_Information]] + +==== Upcoming Releases ==== + +* [[Release:2.10 changelog]] + +==== Past Releases ==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release history|Release history]] + +==Developer information== +Information here is public and especially meant to assist developers. + +* [[Hacking:Developer FAQ|Developer FAQ]] +* [[Index of Algorithms | Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210119125058-show.txt b/wiki/Main_Page-20210119125058-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210119125058-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210126120516-show.txt b/wiki/Main_Page-20210126120516-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210126120516-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210327022141-show.txt b/wiki/Main_Page-20210327022141-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210327022141-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210421081418-show.txt b/wiki/Main_Page-20210421081418-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210421081418-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210506120257-show.txt b/wiki/Main_Page-20210506120257-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210506120257-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210620070651-show.txt b/wiki/Main_Page-20210620070651-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210620070651-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210629142829-show.txt b/wiki/Main_Page-20210629142829-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210629142829-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210805174839-show.txt b/wiki/Main_Page-20210805174839-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20210805174839-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20210818214336-edit.txt b/wiki/Main_Page-20210818214336-edit.txt new file mode 100644 index 0000000..f876f7b --- /dev/null +++ b/wiki/Main_Page-20210818214336-edit.txt @@ -0,0 +1,104 @@ +==Welcome to the GIMP Developer wiki!== + +__NOTOC__ + +===What is GIMP?=== +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + +===What is this Wiki for?=== +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + +===Whose is it?=== +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + +===Namespaces=== +Currently existing namespaces are +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + +==General information== +Information here is dedicated to all GIMP wiki readers. + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots of the development version | Screenshots of the development version]] + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL | GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO | GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review | UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + +=== Release information === + +Information here is public and especially meant to assist build maintainers and testers. + +* [[Release:General_Information]] + +==== Upcoming Releases ==== + +* [[Release:2.10 changelog]] + +==== Past Releases ==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release history|Release history]] + +==Developer information== +Information here is public and especially meant to assist developers. + +* [[Hacking:Developer FAQ|Developer FAQ]] +* [[Index of Algorithms | Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20211117161308-show.txt b/wiki/Main_Page-20211117161308-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20211117161308-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20220128103550-show.txt b/wiki/Main_Page-20220128103550-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20220128103550-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20220207132230-show.txt b/wiki/Main_Page-20220207132230-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20220207132230-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/Main_Page-20220401065205-show.txt b/wiki/Main_Page-20220401065205-show.txt new file mode 100644 index 0000000..d521a54 --- /dev/null +++ b/wiki/Main_Page-20220401065205-show.txt @@ -0,0 +1,138 @@ + + +==Welcome to the GIMP Developer wiki!== + +===What is GIMP?=== + +GIMP is the GNU Image Manipulation Program. It is freely distributed software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages. + + +===What is this Wiki for?=== + +On this wiki you'll find resources on GIMP development and hacking, and some frequently asked question like how to report bugs. This wiki will also include tutorials about writing extensions for GIMP, and will include useful information on further extending GIMP. Sometimes, developers may use it for design drafts and such things as well. + + +===Whose is it?=== + +This wiki is currently maintained by some GIMP developers, so if you have any comments, feel free to contact LightningIsMyName or Alexia_Death via the the GIMP IRC (irc://irc.gimp.org/#gimp) + + +===How do I get a user account?=== + +Join the GIMP IRC (irc://irc.gimp.org/#gimp) and try to contact Alexia_Death, mitch, nomis, prokoudine or schumaml there. + + +===Namespaces=== + +Currently existing namespaces are + + +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Hacking%3A&namespace=0 '''Hacking'''] for hacking related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Mindstorm%3A&namespace=0 '''Mindstorm'''] for idea generation. +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&prefix=Release%3A&namespace=0 '''Release'''] for release related pages, +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Specs&namespace=0 '''Specs'''] for attempts at writing specs, planning and +* [http://wiki.gimp.org/index.php?title=Special%3APrefixIndex&from=Users%3A&namespace=0 '''Users'''] for user guides and the like. + +Lets try to stick to these. What you have in your user space is your own business :) + + +==General information== + +Information here is dedicated to all GIMP wiki readers. + + +* [[Roadmap]] — what features are planned in the future +* [[Documentation:Main]] – Coordination of the user manual and documentation efforts +* [[Users:Tips]] - A collection of useful tips about using GIMP. Some are included in the official tips, and some should be considered for inclusion. + +* [http://gui.gimp.org/index.php/Specifications Specifications] Feature specifications by the interaction architect Peter Sikking. +* [http://gui.gimp.org/index.php/GIMP_UI_Redesign GIMP UI Redesign] +* [http://gimp-brainstorm.blogspot.de/ GIMP UI Brainstorm] +* [http://blog.mmiworks.net/search/label/GIMP GIMP UI Blog] by Peter Sikking +* [[Screenshots_of_the_development_version| Screenshots of the development version]] + + + + +===Hot topics and/or very relevant topics at this time=== + +Currently our main priority is porting as much of GIMP to GEGL as possible. Finalizing the switch is the prerequisite for starting the work on major new features such as non-destructive editing or layer effects. + + +* [[Hacking:Plugin registry]] - The future of the Plug-In Registry. +* [[Hacking:Porting_filters_to_GEGL| GEGL Porting Matrix]] — the progress of moving to a new image processing core +* [[Hacking:Porting_file_plugins_to_GEGL_and_GIO| GEGL and GIO porting matrix for file handlers]] - the progress of moving the file loaders/exporters to the GEGL and GIO libraries +* [[Hacking:Porting_filters_to_GEGL/UI_review| UI review of filters ported to GEGL]] +* [[Hacking:Merging lisanet.de fork]] — Let's merge external patches of this release for OSX into GIMP. +* [[Hacking:TODO]] - To do list +* [[Extensions]] - Notes around an internal extension system + +===Google Summer of Code=== + +We often participate in Google Summer of Code program. It's a great source of new dedicated contributors. + + +* [[Hacking:GSoC]] - Information for potential students +* [[Hacking:GSoC/2014/Ideas]] - Ideas for GSoC 2014 +* [[Hacking:GSoC/Future/Ideas]] - Ideas for future GSoC-s +* [[Hacking:GSOC/Archive]] - GIMP and GSoC in the past (projects, ideas, history) + + + + +===Release information=== + +Information here is public and especially meant to assist build maintainers and testers. + + +* [[Release:General_Information]] + +====Upcoming Releases==== + +* [[Release:2.10 changelog]] + +====Past Releases==== + +* [[Release:GIMP 2.8.16]] +* Release 2.8.14 was an urgent bugfix release, released the next day after 2.8.12 +* [[Release:GIMP 2.8.12]] +* [[Release:GIMP 2.8.10]] +* [[Release:Misc#Release_history|Release history]] + +==Developer information== + +Information here is public and especially meant to assist developers. + + +* [[Hacking:Developer_FAQ|Developer FAQ]] +* [[Index_of_Algorithms| Algorithms]] - Descriptions of the algorithms used in GIMP and GEGL +* [[Glossary]] - Terms related to GIMP development +* [[Hacking:API documentation]] +* [[Hacking:Problems and solutions]] +* [[Hacking:Tools]] - Development tools and how to use them +* [[Hacking:Patches]] - Submitting patches to GIMP +* [[Hacking:Source Tree]] - Finding your way inside GIMP's source tree +* [[Hacking:Building]] - This page explains common things you should know before compiling GIMP +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +** [[Hacking:Building/Linux]] - How to compile GIMP on linux +** [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +** [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Building/Linux]] - How to compile GIMP on linux +* [[Hacking: Building/Mac OSX]] - How to compile GIMP on the OSX operating system on Mac computers +* [[Hacking:Building/Windows]] - How to compile GIMP on the Windows platform +* [[Hacking:Debug/Test]] - How to debug or test GIMP +* [[Hacking:Plugins]] - How to write a GIMP plug-in +* [[Hacking:Code Snippets]] - Root page for various GIMP related code snippets +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +** [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +** [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +** [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:Code Snippets/Script-Fu]] - Code snippets for GIMP's Script-Fu (Scheme) scripting interface +* [[Hacking:Code Snippets/GObject]] - Boilerplate for a GObject in Gimp +* [[Hacking:Code Snippets/Miscellaneous]] - Code snippets for various purposes +* [[Hacking:WarpTool/UI design info]] - Information for the UI design of the Warp tool +* [[Hacking:Developer Meetings]] - Developer meeting logs, agendas, etc. diff --git a/wiki/MediaWiki:Broken-file-category-20200806164310-show.txt b/wiki/MediaWiki:Broken-file-category-20200806164310-show.txt new file mode 100644 index 0000000..ca2eb69 --- /dev/null +++ b/wiki/MediaWiki:Broken-file-category-20200806164310-show.txt @@ -0,0 +1,6 @@ + +
    + +Pages with broken file links + +
    diff --git a/wiki/MediaWiki:Hidden-category-category-20201001194739-show.txt b/wiki/MediaWiki:Hidden-category-category-20201001194739-show.txt new file mode 100644 index 0000000..68f3735 --- /dev/null +++ b/wiki/MediaWiki:Hidden-category-category-20201001194739-show.txt @@ -0,0 +1,6 @@ + +
    + +Hidden categories + +
    diff --git a/wiki/MediaWiki:Index-category-20200918205606-show.txt b/wiki/MediaWiki:Index-category-20200918205606-show.txt new file mode 100644 index 0000000..048483e --- /dev/null +++ b/wiki/MediaWiki:Index-category-20200918205606-show.txt @@ -0,0 +1,6 @@ + +
    + +Indexed pages + +
    diff --git a/wiki/MediaWiki:Noindex-category-20210115213859-show.txt b/wiki/MediaWiki:Noindex-category-20210115213859-show.txt new file mode 100644 index 0000000..6ee4b39 --- /dev/null +++ b/wiki/MediaWiki:Noindex-category-20210115213859-show.txt @@ -0,0 +1,6 @@ + +
    + +Noindexed pages + +
    diff --git a/wiki/MediaWiki:Post-expand-template-inclusion-category-20200918212331-show.txt b/wiki/MediaWiki:Post-expand-template-inclusion-category-20200918212331-show.txt new file mode 100644 index 0000000..2cb17ac --- /dev/null +++ b/wiki/MediaWiki:Post-expand-template-inclusion-category-20200918212331-show.txt @@ -0,0 +1,6 @@ + +
    + +Pages where template include size is exceeded + +
    diff --git a/wiki/Mindstorm:Paint_tools%2Dynamics-20160625010638-show.txt b/wiki/Mindstorm:Paint_tools%2Dynamics-20160625010638-show.txt new file mode 100644 index 0000000..868bcf3 --- /dev/null +++ b/wiki/Mindstorm:Paint_tools%2Dynamics-20160625010638-show.txt @@ -0,0 +1,11 @@ + + +==Icons== + +Icons by tool this dynamics takes effect from. + + +* base icon - mouse +* pressure input present - simple tablet pen. +* tilt input present - Intuos pen +* wheel input present - artpen/airbrush diff --git a/wiki/Mindstorm:Paint_tools%2Dynamics_and_imagehoses-20210508213339-show.txt b/wiki/Mindstorm:Paint_tools%2Dynamics_and_imagehoses-20210508213339-show.txt new file mode 100644 index 0000000..862a12c --- /dev/null +++ b/wiki/Mindstorm:Paint_tools%2Dynamics_and_imagehoses-20210508213339-show.txt @@ -0,0 +1,23 @@ + + +==Problem== + +What to do about image hoses and dynamics? current blends of imagehose and dynamics settings give unpredictable blends. +Complication, stamp selection can not be mapped into dynamics model due to its dimensionality. + + +==Solution 1== + +Stop the blending. Either hard-coded or user dynamics can be active at any given time. Never both. + +Why its bad? + +A whole lot of useable benefits that dynamcis give will be unuseable + + +==Solution 2== + +Allow for "modulation" +Issue: Avoid user confusion and make the existing hose just work. + + \ No newline at end of file diff --git a/wiki/Mindstorm:Preset_converter-20161030073809-edit.txt b/wiki/Mindstorm:Preset_converter-20161030073809-edit.txt new file mode 100644 index 0000000..174eba2 --- /dev/null +++ b/wiki/Mindstorm:Preset_converter-20161030073809-edit.txt @@ -0,0 +1,33 @@ +There is a need for a tool to help users migrate their tool presets from 2.6 format to the new to be 2.8 format. For this a python script has been written. It's in early beta so backup your profile before running it. Any bugs can be reported to Alexia Death at #gimp IRC channel on gimpnet or freenode. + +Get it [http://junk.kengo.ee/pypresetport.zip here]. + +===How To Use=== +# extract +# execute 'python pypresetport.py [OPTIONS]' + + +Usage: pypresetport.py [options] + +Options: + -h, --help show this help message and exit + -s DIR, --source-dir=DIR + source profile DIR (optional) + -d DIR, --dest-dir=DIR + destination profile DIR + -q, --quiet don't print status messages to stdout + -i, --ink-recover Try to recover painter ink2 presets + -p, --painter Process painter only mixbrush presets to new format + + + +PS: make sure that the dynamics and presets folders do exist in your destination. + +===NOT BUGS or known bugs=== +Following issues are not bugs: +* Scale parameter is not converted +*- it can not be done. It needs brush size and that I have no access to in this script. + +Following issues are known bugs: +* Some cases guessing the appropriate icon for he preset does not work. +*- Solution is to hardcode stock ids for some items but I havent done it yet. diff --git a/wiki/Mindstorm:Preset_converter-20161030073830-show.txt b/wiki/Mindstorm:Preset_converter-20161030073830-show.txt new file mode 100644 index 0000000..021fcda --- /dev/null +++ b/wiki/Mindstorm:Preset_converter-20161030073830-show.txt @@ -0,0 +1,43 @@ + + +There is a need for a tool to help users migrate their tool presets from 2.6 format to the new to be 2.8 format. For this a python script has been written. It's in early beta so backup your profile before running it. Any bugs can be reported to Alexia Death at #gimp IRC channel on gimpnet or freenode. + +Get it [http://junk.kengo.ee/pypresetport.zip here]. + + +===How To Use=== + +# extract +# execute 'python pypresetport.py [OPTIONS]' +
    +Usage: pypresetport.py [options]
    +
    +Options:
    +  -h, --help            show this help message and exit
    +  -s DIR, --source-dir=DIR
    +                        source profile DIR (optional)
    +  -d DIR, --dest-dir=DIR
    +                        destination profile DIR
    +  -q, --quiet           don't print status messages to stdout
    +  -i, --ink-recover     Try to recover painter ink2 presets
    +  -p, --painter         Process painter only mixbrush presets to new format
    +
    +
    +
    + +PS: make sure that the dynamics and presets folders do exist in your destination. + + +===NOT BUGS or known bugs=== + +Following issues are not bugs: + + +* Scale parameter is not converted +* - it can not be done. It needs brush size and that I have no access to in this script. + +Following issues are known bugs: + + +* Some cases guessing the appropriate icon for he preset does not work. +* - Solution is to hardcode stock ids for some items but I havent done it yet. diff --git a/wiki/Mindstorm:Rethinking_the_wiki-20141122130752-show.txt b/wiki/Mindstorm:Rethinking_the_wiki-20141122130752-show.txt new file mode 100644 index 0000000..4dd9a9b --- /dev/null +++ b/wiki/Mindstorm:Rethinking_the_wiki-20141122130752-show.txt @@ -0,0 +1,71 @@ + + +The aim is to have a precise contributor knowledge base in a nutshell and in one single place. Target audience are GIMP, GEGL and BABL contributors of all kinds. The hurdles to contribute to GIMP, GEGL and BABL shall be low. + +All the following ideas are a brainstorm (some taken from the former GIMP-Web-Devel TODOS file) and as such subject to discussion. Other ideas - especially which have proven successful in other projects - are welcome. + + +=Content= + +* Add a list of links to photo galleries with Camp pictures (this probably includes asking Sven Neumann to put his Camp photos back online). They could also be in every years LGM chapter. + +* Developers FAQ: Check out what can be reused from [http://www.rru.com/~meo/gimp/faq-dev.html http://www.rru.com/~meo/gimp/faq-dev.html] + +* Resolve [https://bugzilla.gnome.org/show_bug.cgi?id=98394 bug 98394 - The GIMP needs a new FAQ]. + +* Consolidate the dependencies list from the INSTALL file, gimp.org/developer and the wiki. Generate it using GIMP's configure.ac. The same for BABL and GEGL. +See [https://bugzilla.gnome.org/show_bug.cgi?id=621340 bug 621340 - source dependancies missing from website list]. + +* Integrate developer.gimp.org/api/2.0 and/or the BABL and GEGL API doc into the [https://developer.gnome.org/ GNOME Quick API Lookup] or move them to a GNOME host. Perhaps our API docs were automatically integrated into GNOME devhelp and thus would better help other developers help us. + +* Integrate the remaining stuff at the developer.gimp.org (if any) server to the wiki. + +* Integrate the remaining contributor related content from other sources into the wiki. Consolidate and update the remaining content of www.gimp.org. + +* Integrate [gui.gimp.org the GUI wiki] into the developer wiki (for instance by integrating the sites or by integrating it into the wiki.gimp.org domain (wiki.gimp.org/gui or by unifying only the layout)) + +* Consolidate wiki content: merge, sort out, update. + +* Aggregate and order the content, i.e. +: +* by target audience: General, Developer, Bugsquadder, Author, Translator, UI specialist, Tester, Packager and Jenkins maintainer +* by action: Learn, Design, Develop, Write (Docu, translation, web), Maintain, Q&A (similar to [http://wiki.blender.org/ http://wiki.blender.org/]) +* At least there should be separate tracks for newbies to work in quickly. + +* Add a (password protected) administrator dashboard to monitor the status of the relevant GIMP and GNOME infrastructure. For technical reasons this could also be somewhere else or we join the existing solutions of the GNOME infrastructure. + +* Make use of the links 'Community portal' and 'Current Events' in the wiki's left sidebar or remove them. + +* Add content to the wiki's 'Help' page or at least link to relevant content from others. + +* Add a contributor self-introduction page, like the [http://www.darktable.org/contact/ Darktable one]: with photo, name, irc nick, tasks/role in project, motivation to contribute, optionally: homepage, gallery + +* Use project pages like our GSoC 2013 page: project name, goal, contributor name, status. This could help us and contributors to find an interesting task, work together and keep track of recent activities. + +* Add LGM minutes from every year (also the missing minutes from 2007-2012). + +=Layout= + +* Check and improve the usability, e.g. use a responsive web layout, improve accessibility, use breadcrumb navigation etc. + +* Use a common layout for all contributor related content (wiki, Jenkins, …), perhaps similar to www.gimp.org. + +* Consider a news system (using RSS, GIMP's Google+ stream, Twitter?) for regular updates on GIMP development. + +=Implementation, Infrastructure= + +* Export wiki pages as PDF, E-Book etc. + +* If gui.gimp.org gets integrated into the wiki we could host a failover wiki at the released host. + +* Archive gimp-web-devel project as it has become obsolete. + +* Add Jenkins build jobs to check sanity of GIMP's websites (www.gimp.org, wikis) + +* Improve integration of content from other GIMP related development resources (Bugzilla, Jenkins) + +* Check whether we can improve editing capabilities + +* Drop the released developer.gimp.org domain. + +* Drop the released developer.gimp.org server or reuse it, i.e. as failover host, Jenkins build slave, Metasearch-Engine for GIMP content etc. diff --git a/wiki/Mindstorm:Rethinking_the_wiki-20141204155914-edit.txt b/wiki/Mindstorm:Rethinking_the_wiki-20141204155914-edit.txt new file mode 100644 index 0000000..6898f36 --- /dev/null +++ b/wiki/Mindstorm:Rethinking_the_wiki-20141204155914-edit.txt @@ -0,0 +1,63 @@ +The aim is to have a precise contributor knowledge base in a nutshell and in one single place. Target audience are GIMP, GEGL and BABL contributors of all kinds. The hurdles to contribute to GIMP, GEGL and BABL shall be low. + +All the following ideas are a brainstorm (some taken from the former GIMP-Web-Devel TODOS file) and as such subject to discussion. Other ideas - especially which have proven successful in other projects - are welcome. + +=Content= +* Add a list of links to photo galleries with Camp pictures (this probably includes asking Sven Neumann to put his Camp photos back online). They could also be in every years LGM chapter. + +* Developers FAQ: Check out what can be reused from [http://www.rru.com/~meo/gimp/faq-dev.html http://www.rru.com/~meo/gimp/faq-dev.html] + +* Resolve [https://bugzilla.gnome.org/show_bug.cgi?id=98394 bug 98394 - The GIMP needs a new FAQ]. + +* Consolidate the dependencies list from the INSTALL file, gimp.org/developer and the wiki. Generate it using GIMP's configure.ac. The same for BABL and GEGL.
    See [https://bugzilla.gnome.org/show_bug.cgi?id=621340 bug 621340 - source dependancies missing from website list]. + +* Integrate developer.gimp.org/api/2.0 and/or the BABL and GEGL API doc into the [https://developer.gnome.org/ GNOME Quick API Lookup] or move them to a GNOME host. Perhaps our API docs were automatically integrated into GNOME devhelp and thus would better help other developers help us. + +* Integrate the remaining stuff at the developer.gimp.org (if any) server to the wiki. + +* Integrate the remaining contributor related content from other sources into the wiki. Consolidate and update the remaining content of www.gimp.org. + +* Integrate [gui.gimp.org the GUI wiki] into the developer wiki (for instance by integrating the sites or by integrating it into the wiki.gimp.org domain (wiki.gimp.org/gui or by unifying only the layout)) + +* Consolidate wiki content: merge, sort out, update. + +* Aggregate and order the content, i.e. +:* by target audience: General, Developer, Bugsquadder, Author, Translator, UI specialist, Tester, Packager and Jenkins maintainer +:* by action: Learn, Design, Develop, Write (Docu, translation, web), Maintain, Q&A (similar to http://wiki.blender.org/) +:*At least there should be separate tracks for newbies to work in quickly. + +* Add a (password protected) administrator dashboard to monitor the status of the relevant GIMP and GNOME infrastructure. For technical reasons this could also be somewhere else or we join the existing solutions of the GNOME infrastructure. + +* Make use of the links 'Community portal' and 'Current Events' in the wiki's left sidebar or remove them. + +* Add content to the wiki's 'Help' page or at least link to relevant content from others. + +* Add a contributor self-introduction page, like the [http://www.darktable.org/contact/ Darktable one]: with photo, name, irc nick, tasks/role in project, motivation to contribute, optionally: homepage, gallery + +* Use project pages like our GSoC 2013 page: project name, goal, contributor name, status. This could help us and contributors to find an interesting task, work together and keep track of recent activities. + +* Add LGM minutes from every year (also the missing minutes from 2007-2012). + +=Layout= +* Check and improve the usability, e.g. use a responsive web layout, improve accessibility, use breadcrumb navigation etc. + +* Use a common layout for all contributor related content (wiki, Jenkins, …), perhaps similar to www.gimp.org. + +* Consider a news system (using RSS, GIMP's Google+ stream, Twitter?) for regular updates on GIMP development. + +=Implementation, Infrastructure= +* Export wiki pages as PDF, E-Book etc. + +* If gui.gimp.org gets integrated into the wiki we could host a failover wiki at the released host. + +* Archive gimp-web-devel project as it has become obsolete. + +* Add Jenkins build jobs to check sanity of GIMP's websites (www.gimp.org, wikis) + +* Improve integration of content from other GIMP related development resources (Bugzilla, Jenkins) + +* Check whether we can improve editing capabilities + +* Drop the released developer.gimp.org domain. + +* Drop the released developer.gimp.org server or reuse it, i.e. as failover host, Jenkins build slave, Metasearch-Engine for GIMP content etc. diff --git a/wiki/Mindstorm:_Rework_of_mailing_list_rules-20201021081955-edit.txt b/wiki/Mindstorm:_Rework_of_mailing_list_rules-20201021081955-edit.txt new file mode 100644 index 0000000..cb297f0 --- /dev/null +++ b/wiki/Mindstorm:_Rework_of_mailing_list_rules-20201021081955-edit.txt @@ -0,0 +1,181 @@ +==Catalog of possible mailing list etiquette rules== +===1. Short version=== + +1. The topic is GIMP. + +2. Be open and friendly. + +3. Think, check, then write. + +4. Write readable. + +Thank you for being part of the GIMP commmunity. If you have doubts about the rules, read the archives and do as those before you did. + +Postings defying these rules will be answered with a warning. On defying these rules repeatedly the sender will get barred from the mailing list. Don’t think we’re stupid: this also applies to messages from different senders, but with the same content. + +===1. The topic is GIMP=== +

    1.1 Post to the right mailing list:

    +:

    1.1.1 GIMP user problems, techniques, hardware advice, requests for comments about images, GIMP usage to [gimp-user].

    +:

    1.1.2 Questions on GIMP coding, patches, bugs and other GIMP’s guts things to [gimp-developer]. Similar GEGL- related stuff to [gegl-developer]

    +

    1.2 Do not post the same message to various mailing lists.

    +

    1.3 What is welcome on the mailing list?

    +:

    1.3.1 questions,

    +:

    1.3.2 enhancement requests before filing them in the Bugzilla bug tracker. Be ready to put some efforts into your topic to let the enhancement become real,

    +:

    1.3.3 answers to your questions; also if you found them by yourself.

    +

    1.4 What must not go to the mailing list?

    +:

    1.4.1 spam,

    +:

    1.4.2 criminal stuff or requests for it. We’re developers, not bad guys and girls,

    +:

    1.4.3 job offers, excepting you want to hire somebody for GIMP related stuff, like fixing a bug or implementing a feature.

    +:

    1.4.4 ways to make money fast,

    +:

    1.4.5 surveys,

    +:

    1.4.6 invitations from social networks or to flash mobs etc.

    +:

    1.4.7 chain letters, e.g. 'Send this message to at least x people to achieve luck' and so on,

    +:

    1.4.8 subscribe, unsubscribe and test messages. To unsubscribe follow the instructions in the ‘Welcome to the mailing list’ mail or at the mailing list links on the GIMP website.

    +:

    1.4.9 private gossip,

    +:

    1.4.10 offending statements,

    +:

    1.4.11 reactions on all of the aforementioned.

    +

    1.5 Stick to the point. If the topic starts to change or new questions arise, discuss them in a new thread with a new subject and append '(Was: <previous topic>)' to the subject.

    +

    1.6 Separate private affairs from the mailing list:

    +:

    1.6.1 Never forward private mails to the mailing list, except you have the written permission from its sender.

    +:

    1.6.2 Don't answer both to the list AND the intended recipient, except you're sure, that he/she needs the answer quickly.

    +:

    1.6.3 Send private mails only to the intended recipient.

    +

    1.7 Send pure agreement/disagreement in private mails.

    +

    1.8 Filter mails do avoid getting flooded with uninteresting postings.

    + +===2. Be open and friendly=== +

    2.1 Don't be emotional:

    +:

    2.1.1 Let anger fly by.

    +:

    2.1.2 Don’t grovel.

    +:

    2.1.3 Don't feel personally attacked, even if a post sounds harsh.

    +

    2.2 How to handle offenses:

    +:

    2.2.1 Chill out, calm down, exhale.

    +:

    2.2.2 Read the text again, without ruffle or excitement.

    +:

    2.2.3 If it's untenable, unbelievable lies: ignore it

    +:

    2.2.4 If it’s a real offense: send a mail to the senders postmaster and report the abuse.

    +:

    2.2.5 If it contains subject-specific arguments, that are worth responding:

    +:::*

    reply calmly and factual

    +:::*

    explain, in which points the offender is wrong

    +:

    2.2.6 EXCEPTIONAL: flame back but keep in mind: it's hard to write a good flame. We’re a mailing list, not a kindergarten.

    +

    2.3 Don't force your opinions to others.

    +

    2.4 Be honest in what you're telling about yourself or any facts

    +

    2.5 It's helpful to tell others something about your own relevant knowledge or experience background, but don't be a smartass.

    +

    2.6 Respect the others here like they are.

    +

    2.7 DON'T SHOUT.

    +

    2.8 Use irony sparingly, because it can often be misunterstood; if you can't resign on it, mark irony.

    +

    2.9 Don't use sarcasm or cynicism.

    +

    2.10 Don't be a know-all.

    +

    2.11 No personal attacks!

    +

    2.12 Be politely if you disagree with somebody others opinion.

    +

    2.13 Your readers are humans, not morons or slaves.

    +

    2.14 Don't criticize others for their bad English.

    +

    2.15 Assume best intentions.

    +

    2.16 Respect the others' work or postings, even if you think it's idiotic.

    +

    2.17 Don't stalk the others.

    +

    2.18 Avoid offending statements about other philosophies of life or other personal matters.

    + +===3. Think, check, then write=== +

    3.1 Quality prior to quantity.

    +

    3.2 Investigate the topic before writing:

    +:

    3.2.1 Especially for problematic topics

    +:::*

    Known to be flame-critical topics, like the best tool, the best image editing software or whatever of your things is better than others,

    +:::*

    the name GIMP, Save vs. Export behavior …,

    +:::*

    philosophical, off-topic discussions about definitions etc.,

    +:::*

    long running discussions.

    +:

    3.2.2 Don't claim to have found a bug without investigating it before.

    +:

    3.2.3 Where to investigate:

    +:::*

    in the mailing list archives and forums,

    +:::*

    search engines,

    +:::*

    in the documentation,

    +:::*

    in the FAQs,

    +:::*

    your own experiments and observations.

    +:::*

    Ask a skilled friend and let him try first on another computer.

    +:::*

    As programmer: read the source code, API documentation etc.

    +:::*

    On user interface related issues see the GUI specs: http://gui.gimp.org/index.php/Specifications

    +:

    3.2.4 Check your facts and check them again before reporting.

    +:

    3.2.5 Show, that you first investigated the topic and what you've learned thereby.

    +

    3.3 Check that you use a current GIMP version.

    +

    3.4 Careless and sloppy questions get careless and sloppy answers, if at all.

    +

    3.5 On problems provide as much necessary information as possible:

    +:

    3.5.1 clear and careful description of symptoms in chronological order,

    +:

    3.5.2 If you have own assumptions, first try them out yourself instead of posting them. You can post them if you found out that they work. That would be a bigger help.

    +:

    3.5.3 CPU name or family,

    +:

    3.5.4 operating system, version, 32/64 bit. On Linux: distribution.,

    +:

    3.5.5 from which download source, your Linux distribution or compiled by yourself.

    +:

    3.5.6 GIMP version number

    +:

    3.5.7 on hardware problems: exact product name of device, for instance Wacom Bamboo Fun Pen & Touch graphics tablet

    +:

    3.5.8 own investigations and diagnose steps and results

    +:

    3.5.9 possibly relevant configuration changes of your computer or software,

    +:

    3.5.10 how to reproduce

    +:

    3.5.11 the kind of answer you expect? A solution hint, a patch or integration of your own patch? On questions for tutorials, first tell, which effect exactly you're trying to achieve.

    +

    3.6 Only tell facts, represent them clearly and properly and check them before posting

    +

    3.7 Dispense with useless questions like “Can anybody help me?“. The answer would probably be a single ‘Yes’ or ‘No’.

    +

    3.8 If a solution was helpful, post it and thank those, who helped you

    +

    3.9 Chip in, if you've something to tell, but don't cackle to every topic and dominate the discussion.

    +

    3.10 Ask ongoing questions to the mailing list, not solely to the one who used to help you one time. So other experts can also help you and the answer will help all.

    +

    3.11 Be factual.

    +

    3.12 If you have to say nothing new, then your arguments have already been heard. Don't repeat them.

    + +===4. Write readably=== +

    4.1 The mailing list language is English.

    +:

    4.1.1 If you have problems expressing yourself in English, a small note in your message saying so is enough. You don't need to apologize for that.

    +:

    4.1.2 Listing which languages you speak better will also help. Maybe another speaker of that language can help clarifying the obscure parts of your posting.

    +

    4.2 Use a meaningful subject:

    +:

    4.2.1 with some descriptive, meaningful words,

    +:

    4.2.2 without the words HELP or GIMP. We know that you're writing about GIMP and probably need help,

    +:

    4.2.3 in 'Object - Problem' style, like “JPEG files from SupaDupaCam ABC123 - EXIF data get lost”.

    +:

    4.2.4 Put the word “[RESOLVED]” in front of subject of postings with a solution.

    +:

    4.2.5 Don't try to attract attention, like “HELP”,“URGENT” or “!!!”.

    +

    4.3 Shortly describe the content of URLs, especially those from URL shorteners like Bitly etc.

    +

    4.4 Go without visual effects, like ASCII-art, banners and tons of smileys.

    +

    4.5 Use brief signatures with your name and e-mail address, but without fancy bells and whistles like in web forums

    +

    4.6 Do not assume we all know the same software like you. Believe it or not: most of the readers here don’t have Photoshop. So if you refer to some other software, describe clearly, what you mean or add a link to a relevant screenshot.

    +

    4.7 Be brief:

    +:

    4.7.1 Delete irrelevant text

    +:

    4.7.2 Be clear and precise

    +

    4.8 Consider readability:

    +:

    4.8.1 Insert white spaces, punctuation, paragraphs

    +:

    4.8.2 Go without unnecessary punctuation

    +:

    4.8.3 Use upper and lower cases.

    +:

    4.8.4 Between paragraphs and after quotes insert blank lines.

    +

    4.9 Write in complete words and sentences

    +:

    4.9.1 Don’t use slang or short message style.

    +:

    4.9.2 Use proper grammar

    +:

    4.9.3 Use spelling correction.

    +

    4.10 Use > signs to mark cites. Your email application usually puts them in automatically.

    +

    4.11 Don't quote to deep (‘> > > > > a cite is a cite is a cite.’)

    +

    4.12 Don't put your answer before the question, but after or between the lines you answer to.

    +

    4.13 On quoting: only cite that part of the text you're referring to:

    +:

    4.13.1 Cut unnecessary header parts

    +:

    4.13.2 Cut disclaimers, even from private mails

    +:

    4.13.3 Cut signatures

    +

    4.14 Use citation signs properly; do not put words into somebody others mouth

    +

    4.15 Use plain text, not HTML nor RTF.

    +

    4.16 Check your own computers time zone and time to avoid answers virtually appearing before the questions.

    +

    4.17 Use standard compliant mail client software, like Thunderbird etc..

    +

    4.18 You're responsible on your own to protect against abuse of your mail address and malware.

    +

    4.19 Wrap lines after 70 characters, but don't wrap data dumps.

    +

    4.20 Use 7-bit-ASCII-Code.

    +

    4.21 Don’t send autoreply messages to the mailing list, like ‘I’m out of office.’

    +

    4.22 No e-mail attachments. If you MUST EXCEPTIONALLY attach them:

    +:

    4.22.1 Only send useful attachments to what you’re discussing. For code attachments this means to send only the relevant code, that is an example with minimal code.

    +:

    4.22.2 Don’t post them in proprietary file formats, like Word, Excel, Powerpoint or Flash.

    +:

    4.22.3 Attach only small attachments. Use compressors, like gzip, and for images .xcf.gz, .xcf.bz2, png or jpg. If they are bigger than 10 KB, upload them somewhere and post the URL instead.

    +

    4.23 No MIME Quoted Printable Encoding (that one with numbers like %20 between words), because it will make your posting almost unreadable.

    +

    4.24 If you want to answer to the daily digest, only cite the relevant parts of the concrete message you're answering to. Also use a meaningful subject (not: 'Re: [Gimp-user] gimp-user-list Digest, Vol 12, Issue 17', but for instance: 'Re: Autoconvert photo files'). If you want to answer to more than one message in the digest, use separate postings.

    + +==Sources== +- [http://www.gweep.ca/~edmonds/usenet/ml-etiquette.html Edmonds, Mailing List Etiquette FAQ] + +- [http://www.freebsd.org/doc/en_US.ISO8859-1/articles/mailing-list-faq/etiquette.html FreeBSD community, Frequently Asked Questions About The FreeBSD Mailing Lists] + +- [http://downloadsquad.switched.com/2007/01/24/mailing-list-etiquette-best-practices-for-creating-maintainin/ Chartier, Mailing list etiquette: Best practices for creating, maintaining and participating] + +- [http://grass.osgeo.org/wiki/Mailing_list_etiquette GRASS community, Mailing list etiquette] + +- [http://www.catb.org/~esr/faqs/smart-questions.html Raymond, How To Ask Questions The Smart Way] + +- [http://www.samba.org/samba/ml-etiquette.html Samba community, Mailing list etiquette] + +- [http://www.mythtv.org/wiki/Mailing_List_etiquette MythTV community, Mailing List etiquette] + +- [http://www.gimp.org/mail_lists.html GIMP community, List etiquette] diff --git a/wiki/Mindstorm:n-point_image_deformation_tool-20150911035422-show.txt b/wiki/Mindstorm:n-point_image_deformation_tool-20150911035422-show.txt new file mode 100644 index 0000000..1f21173 --- /dev/null +++ b/wiki/Mindstorm:n-point_image_deformation_tool-20150911035422-show.txt @@ -0,0 +1,128 @@ + + +__TOC__ + +==Introduction== + +This is a description of planned features of n-point deformation tool. It should lead to UI specification. + +At the beginning, an image is opened and user selects n-point deformation tool. When he clicks on the image, mesh is automatically created above it. User can add points onto image and manipulate with them. He can also manipulate with mesh and control the deformation process – more below. + + +===Mesh remarks=== + +Mesh above the image is created automatically with use of alpha channel. When there isn't any alpha channel, mesh is created above the whole image. + +The deformation method uses two meshes. One is called 'source pose' mesh, the other is called 'destination pose' mesh. Source pose mesh is always hidden and destination pose mesh can be visible. Only destination pose mesh is deformed. + +Mesh (lattice) for this method usually consists of squares. The deformation method is not limited to square mesh but square mesh can be constructed in an easier way, usually with less elements (than triangle mesh), and with small tweaks we can achieve similar precision as with triangular mesh. + +For this method it holds that with decreasing lattice square size (i.e. increasing number of mesh elements), precision of result is increasing, but inefficiency of the algorithm is increasing as well. User should have an option to adjust the balance. + +[[File:Source_and_destination_pose.png|Source and destination pose.png]] + + +==Control points manipulation== + +===Add control points=== + +With a click at some position on image, control point is added. User can add control points at arbitrary positions on image (except position [or some radius around it which depends on mesh square size] where a point is already placed) – mesh will be adjusted according to that. + + +===Selection, deselection, multi-selection=== + +More or less the same as sections with same names in [http://gui.gimp.org/index.php/Cage_tool Cage tool specification]. + + +===Delete control points=== + +Selected control points are deleted by key. Last added point can be deleted by key. + + +===Deformation of the image=== + +When user moves (click – drag – release) a control point (or multi-selected control points), the image is deformed. + + +===Depth of control point=== + +There should be an option to adjust which part of overlapping mesh/image is visible – e.g. we have an image of a person (as in the picture below) and we want to move her arm so that it is in front of (or behind) her body. + +[[File:Depth_of_control_point.png|Depth of control point.png]] + +Every control point has its depth which affects a part of mesh under the control point. + +User can change the depth using two buttons – one increases the depth, the other decreases it – or using two keys - which?. + +When more control points are selected, every one's depth is increased/decreased. + + +==Mesh manipulation== + +===Mesh visibility=== + +In some situations it's useful to see how the mesh looks like. User can toggle mesh visibility using a check button (or switch). + + +===Mesh element size=== + +User can choose the size of mesh element (square) using a slider – but only before he starts adding control points. It is because of the fact that when changing mesh square size, we have to recreate 'source pose' and 'destination pose' meshes. It's often impossible to recreate 'destination pose' mesh so that it looks similarly to previous 'destination pose' mesh. + +What would be a suitable name for this option? Density or precision? + + +==Deformation control== + +===Deformation algorithm control=== + +The deformation algorithm iteratively solves a least squares problem described in [http://dcgi.felk.cvut.cz/cgg/~sykorad/Sykora09-NPAR.pdf the paper]. During that process we periodically display current state of the solution and user can see that the deformation is evolving somehow. Usually hundreds of iterations are performed during 1 FPS. We don't know how much time the solving will take and at the same time we often don't want to find the final solution – we're interested just in the process. + +Hence there should be an option to temporary stop the process at some state or let it continue with solving further. How to do that in the best way? It could be done for example by key. + + +===Deformation termination=== + +When user is satisfied with result, he presses key. Deformed image is redrawn using selected interpolation method. The deformation ends. + +When user wants to cancel the deformation, he presses key. Deformed image is discarded, original image appears on the canvas. The deformation ends. + + +==Undo/redo== + +TODO + + +==Settings== + +===Deformation mode=== + +The method allows 3 types of deformation: + + +* rigid (known as as-rigid-as-possible) +* similar (known as as-similar-as-possible) +* stretch (ARAP combined with weights from Moving Least Squares method) + +'Rigid' type is very good for bending objects or manipulating articulated objects. It's [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=0m05s not so good in stretching or shrinking of objects]. 'Similar' type allows changing of scale. Only translation, rotation and change of scale is included in deformation. It can be seen in [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=1m26s the example]. 'Stretch' type allows better stretching of objects. It can be seen in [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=0m42s the example]. + +User can select the deformation type using drop down list or radio buttons. + + +===Number of deformation iterations=== + +User can select using slider, the number of iterations that are performed during 1 FPS. The larger the number the more rigid the deformation behaves. + +How to call this option? It can be called for example rigidity or flexibility. + + +===Type of interpolation=== + +User can select the type of interpolation which is used when the deformation is terminated in favor of deformed image. + +Types of interpolation: + + +* nearest neighbor (none) +* linear +* cubic +* sinc diff --git a/wiki/Mindstorm:n-point_image_deformation_tool-20150914231446-edit.txt b/wiki/Mindstorm:n-point_image_deformation_tool-20150914231446-edit.txt new file mode 100644 index 0000000..c4f5298 --- /dev/null +++ b/wiki/Mindstorm:n-point_image_deformation_tool-20150914231446-edit.txt @@ -0,0 +1,92 @@ +== Introduction == +This is a description of planned features of n-point deformation tool. It should lead to UI specification. + +At the beginning, an image is opened and user selects n-point deformation tool. When he clicks on the image, mesh is automatically created above it. User can add points onto image and manipulate with them. He can also manipulate with mesh and control the deformation process – more below. + +=== Mesh remarks === + +Mesh above the image is created automatically with use of alpha channel. When there isn't any alpha channel, mesh is created above the whole image. + +The deformation method uses two meshes. One is called 'source pose' mesh, the other is called 'destination pose' mesh. Source pose mesh is always hidden and destination pose mesh can be visible. Only destination pose mesh is deformed. + +Mesh (lattice) for this method usually consists of squares. The deformation method is not limited to square mesh but square mesh can be constructed in an easier way, usually with less elements (than triangle mesh), and with small tweaks we can achieve similar precision as with triangular mesh. + +For this method it holds that with decreasing lattice square size (i.e. increasing number of mesh elements), precision of result is increasing, but inefficiency of the algorithm is increasing as well. User should have an option to adjust the balance. + +[[File:Source_and_destination_pose.png]] + +== Control points manipulation == + +=== Add control points === +With a click at some position on image, control point is added. User can add control points at arbitrary positions on image (except position [or some radius around it which depends on mesh square size] where a point is already placed) – mesh will be adjusted according to that. + +=== Selection, deselection, multi-selection === +More or less the same as sections with same names in [http://gui.gimp.org/index.php/Cage_tool Cage tool specification]. + +=== Delete control points === +Selected control points are deleted by key. Last added point can be deleted by key. + +=== Deformation of the image === +When user moves (click – drag – release) a control point (or multi-selected control points), the image is deformed. + +=== Depth of control point === +There should be an option to adjust which part of overlapping mesh/image is visible – e.g. we have an image of a person (as in the picture below) and we want to move her arm so that it is in front of (or behind) her body. + +[[File:Depth_of_control_point.png]] + +Every control point has its depth which affects a part of mesh under the control point. + +User can change the depth using two buttons – one increases the depth, the other decreases it – or using two keys - which?. + +When more control points are selected, every one's depth is increased/decreased. + +== Mesh manipulation == + +=== Mesh visibility === +In some situations it's useful to see how the mesh looks like. User can toggle mesh visibility using a check button (or switch). + +=== Mesh element size === +User can choose the size of mesh element (square) using a slider – but only before he starts adding control points. It is because of the fact that when changing mesh square size, we have to recreate 'source pose' and 'destination pose' meshes. It's often impossible to recreate 'destination pose' mesh so that it looks similarly to previous 'destination pose' mesh. + +What would be a suitable name for this option? Density or precision? + +== Deformation control == + +=== Deformation algorithm control === +The deformation algorithm iteratively solves a least squares problem described in [http://dcgi.felk.cvut.cz/cgg/~sykorad/Sykora09-NPAR.pdf the paper]. During that process we periodically display current state of the solution and user can see that the deformation is evolving somehow. Usually hundreds of iterations are performed during 1 FPS. We don't know how much time the solving will take and at the same time we often don't want to find the final solution – we're interested just in the process. + +Hence there should be an option to temporary stop the process at some state or let it continue with solving further. How to do that in the best way? It could be done for example by key. + +=== Deformation termination === +When user is satisfied with result, he presses key. Deformed image is redrawn using selected interpolation method. The deformation ends. + +When user wants to cancel the deformation, he presses key. Deformed image is discarded, original image appears on the canvas. The deformation ends. + +== Undo/redo == +TODO + +== Settings == + +=== Deformation mode === +The method allows 3 types of deformation: +* rigid (known as as-rigid-as-possible) +* similar (known as as-similar-as-possible) +* stretch (ARAP combined with weights from Moving Least Squares method) + +'Rigid' type is very good for bending objects or manipulating articulated objects. It's [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=0m05s not so good in stretching or shrinking of objects]. 'Similar' type allows changing of scale. Only translation, rotation and change of scale is included in deformation. It can be seen in [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=1m26s the example]. 'Stretch' type allows better stretching of objects. It can be seen in [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=0m42s the example]. + +User can select the deformation type using drop down list or radio buttons. + +=== Number of deformation iterations === +User can select using slider, the number of iterations that are performed during 1 FPS. The larger the number the more rigid the deformation behaves. + +How to call this option? It can be called for example rigidity or flexibility. + +=== Type of interpolation === +User can select the type of interpolation which is used when the deformation is terminated in favor of deformed image. + +Types of interpolation: +* nearest neighbor (none) +* linear +* cubic +* sinc diff --git a/wiki/Mindstorm:n-point_image_deformation_tool-20151015040112-show.txt b/wiki/Mindstorm:n-point_image_deformation_tool-20151015040112-show.txt new file mode 100644 index 0000000..b3820e8 --- /dev/null +++ b/wiki/Mindstorm:n-point_image_deformation_tool-20151015040112-show.txt @@ -0,0 +1,128 @@ + + +__TOC__ + +==Introduction== + +This is a description of planned features of n-point deformation tool. It should lead to UI specification. + +At the beginning, an image is opened and user selects n-point deformation tool. When he clicks on the image, mesh is automatically created above it. User can add points onto image and manipulate with them. He can also manipulate with mesh and control the deformation process – more below. + + +===Mesh remarks=== + +Mesh above the image is created automatically with use of alpha channel. When there isn't any alpha channel, mesh is created above the whole image. + +The deformation method uses two meshes. One is called 'source pose' mesh, the other is called 'destination pose' mesh. Source pose mesh is always hidden and destination pose mesh can be visible. Only destination pose mesh is deformed. + +Mesh (lattice) for this method usually consists of squares. The deformation method is not limited to square mesh but square mesh can be constructed in an easier way, usually with less elements (than triangle mesh), and with small tweaks we can achieve similar precision as with triangular mesh. + +For this method it holds that with decreasing lattice square size (i.e. increasing number of mesh elements), precision of result is increasing, but inefficiency of the algorithm is increasing as well. User should have an option to adjust the balance. + +[[File:Source_and_destination_pose.png|Source and destination pose.png]] + + +==Control points manipulation== + +===Add control points=== + +With a click at some position on image, control point is added. User can add control points at arbitrary positions on image (except position [or some radius around it which depends on mesh square size] where a point is already placed) – mesh will be adjusted according to that. + + +===Selection, deselection, multi-selection=== + +More or less the same as sections with same names in [http://gui.gimp.org/index.php/Cage_tool Cage tool specification]. + + +===Delete control points=== + +Selected control points are deleted by key. Last added point can be deleted by key. + + +===Deformation of the image=== + +When user moves (click – drag – release) a control point (or multi-selected control points), the image is deformed. + + +===Depth of control point=== + +There should be an option to adjust which part of overlapping mesh/image is visible – e.g. we have an image of a person (as in the picture below) and we want to move her arm so that it is in front of (or behind) her body. + +[[File:Depth_of_control_point.png|Depth of control point.png]] + +Every control point has its depth which affects a part of mesh under the control point. + +User can change the depth using two buttons – one increases the depth, the other decreases it – or using two keys - which?. + +When more control points are selected, every one's depth is increased/decreased. + + +==Mesh manipulation== + +===Mesh visibility=== + +In some situations it's useful to see how the mesh looks like. User can toggle mesh visibility using a check button (or switch). + + +===Mesh element size=== + +User can choose the size of mesh element (square) using a slider – but only before he starts adding control points. It is because of the fact that when changing mesh square size, we have to recreate 'source pose' and 'destination pose' meshes. It's often impossible to recreate 'destination pose' mesh so that it looks similarly to previous 'destination pose' mesh. + +What would be a suitable name for this option? Density or precision? + + +==Deformation control== + +===Deformation algorithm control=== + +The deformation algorithm iteratively solves a least squares problem described in [http://dcgi.felk.cvut.cz/cgg/~sykorad/Sykora09-NPAR.pdf the paper]. During that process we periodically display current state of the solution and user can see that the deformation is evolving somehow. Usually hundreds of iterations are performed during 1 FPS. We don't know how much time the solving will take and at the same time we often don't want to find the final solution – we're interested just in the process. + +Hence there should be an option to temporary stop the process at some state or let it continue with solving further. How to do that in the best way? It could be done for example by key. + + +===Deformation termination=== + +When user is satisfied with result, he presses key. Deformed image is redrawn using selected interpolation method. The deformation ends. + +When user wants to cancel the deformation, he presses key. Deformed image is discarded, original image appears on the canvas. The deformation ends. + + +==Undo/redo== + +TODO + + +==Settings== + +===Deformation mode=== + +The method allows 3 types of deformation: + + +* rigid (known as as-rigid-as-possible) +* similar (known as as-similar-as-possible) +* stretch (ARAP combined with weights from Moving Least Squares method) + +'Rigid' type is very good for bending objects or manipulating articulated objects. It's [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=0m05s not so good in stretching or shrinking of objects]. 'Similar' type allows changing of scale. Only translation, rotation and change of scale is included in deformation. It can be seen in [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=1m26s the example]. 'Stretch' type allows better stretching of objects. It can be seen in [http://www.youtube.com/watch?v=0_nl9fSTfMY&t=0m42s the example]. + +User can select the deformation type using drop down list or radio buttons. + + +===Number of deformation iterations=== + +User can select using slider, the number of iterations that are performed during 1 FPS. The larger the number the more rigid the deformation behaves. + +How to call this option? It can be called for example rigidity or flexibility. + + +===Type of interpolation=== + +User can select the type of interpolation which is used when the deformation is terminated in favor of deformed image. + +Types of interpolation: + + +* nearest neighbor (none) +* linear +* cubic +* sinc diff --git a/wiki/Mindstrom:Misc_TODO%27s-20200804084032-show.txt b/wiki/Mindstrom:Misc_TODO%27s-20200804084032-show.txt new file mode 100644 index 0000000..d5b6694 --- /dev/null +++ b/wiki/Mindstrom:Misc_TODO%27s-20200804084032-show.txt @@ -0,0 +1,2 @@ + +
    #REDIRECT[https://wiki.gimp.org/index.php?title=Mindstorm:Misc_TODO%27s&action=edit&redlink=1 Mindstorm:Misc TODO's]
    diff --git a/wiki/Mindstrom:Misc_TODO%27s-20210515111646-show.txt b/wiki/Mindstrom:Misc_TODO%27s-20210515111646-show.txt new file mode 100644 index 0000000..890cf7f --- /dev/null +++ b/wiki/Mindstrom:Misc_TODO%27s-20210515111646-show.txt @@ -0,0 +1,2 @@ + +
    #REDIRECT[http://wiki.gimp.org/index.php?title=Mindstorm:Misc_TODO%27s&action=edit&redlink=1 Mindstorm:Misc TODO's]
    diff --git a/wiki/Mindstrom:Misc_TODO-20201126020502-edit.txt b/wiki/Mindstrom:Misc_TODO-20201126020502-edit.txt new file mode 100644 index 0000000..befa7c6 --- /dev/null +++ b/wiki/Mindstrom:Misc_TODO-20201126020502-edit.txt @@ -0,0 +1 @@ +#REDIRECT [[Mindstorm:Misc TODO's]] diff --git a/wiki/PSD_support-20201108134519-show.txt b/wiki/PSD_support-20201108134519-show.txt new file mode 100644 index 0000000..05f30d9 --- /dev/null +++ b/wiki/PSD_support-20201108134519-show.txt @@ -0,0 +1,160 @@ + + +GIMP supports both opening and exporting of PSD files. However, this support comes with various limitations due to multiple reasons. This page lists unsupported features and provides an insight into further work on better PSD support. + + +__TOC__ + +==How to contribute== + +If you are interested to contribute, please see here: [https://www.gimp.org/develop/ https://www.gimp.org/develop/]. + +The file-psd plugin's code is located here: [https://gitlab.gnome.org/GNOME/gimp/tree/master/plug-ins/file-psd https://gitlab.gnome.org/GNOME/gimp/tree/master/plug-ins/file-psd]. + +Most of the information on PSD/PSB is publicly available at [https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/]. We hear from our fellow Krita developers that it isn't complete though. + + +==PSB files== + +GIMP doesn't yet support PSB files. The difference between the two is that PSB supports larger images (up to 300K px in both dimensions) and uses 8 bytes instead of 4 bytes to describe various blocks of data. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug report''': [https://gitlab.gnome.org/GNOME/gimp/issues/884 https://gitlab.gnome.org/GNOME/gimp/issues/884] + + +==Image modes== + +GIMP doesn't support LAB, CMYK, Bitmap, and Duotone modes. We aren't convinced that we need to implement those exactly the way Photoshop does it. Space-specific processing with filters can be accessible without prior conversion to a particular image mode. + +'''Prerequisites:''' none known, but this probably needs an extensive offline discussion. + +'''Bug reports''': + + +* [https://gitlab.gnome.org/GNOME/gimp/issues/19 https://gitlab.gnome.org/GNOME/gimp/issues/19] (Duotone) +* [https://gitlab.gnome.org/GNOME/gimp/issues/354 https://gitlab.gnome.org/GNOME/gimp/issues/354] (CMYK) +* [https://gitlab.gnome.org/GNOME/gimp/issues/2206 https://gitlab.gnome.org/GNOME/gimp/issues/2206] (Multichannel) + +==Layers== + +===Smart objects / Layer clones=== + +Support for layer clones is likely to be added along with non-destructive editing (scheduled for v3.2) or soon thereafter. Then this feature can be added to the PSD plug-in as well. + +'''Prerequisites:''' non-destructive editing (v3.2). + +'''Bug reports''': + + +* [https://gitlab.gnome.org/GNOME/gimp/issues/80 https://gitlab.gnome.org/GNOME/gimp/issues/80] (sharing pixels between layers) +* [https://gitlab.gnome.org/GNOME/gimp/issues/2468 https://gitlab.gnome.org/GNOME/gimp/issues/2468] (smart objects) + +===Vector layers=== + +Initial implementation has been available as a set of patches since 2006. It has quite a few design issues, it has never been merged, hence we cannot support vector layers in PSD files yet. + +'''Prerequisites:''' review existing patches and redesign the implementation around [http://gegl.org/operations/vector.html GEGL vector operations]. An interested developer can hack on that at any time. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/282 https://gitlab.gnome.org/GNOME/gimp/issues/282] (Merge vector layers GSoC Project) + + +===Fill layers=== + +Support for fill layers is likely to be added along with non-destructive editing (scheduled for v3.2) or soon thereafter. Then this feature can be added to the PSD plug-in as well. + +'''Prerequisites:''' non-destructive editing (v3.2). + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/85 https://gitlab.gnome.org/GNOME/gimp/issues/85] (Add support for fill layers) + + +===Adjustment layers and layer effects=== + +GIMP doesn't yet support adjustment layers and layer effects, so it cannot directly read those from PSD or export those to PSD. + +A temporary workaround is available since v2.10.6: you '''can''' open PSD files saved with backwards compatibility, where non-destructive changes are flattened to a single layer. + +Please note, that since 2.10, GIMP has an API for attaching filters to layers, which is a foundation work for further development. + +'''Prerequisites:''' release of v3.0. Non-destructive editing is primary objective of v3.2. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/26 https://gitlab.gnome.org/GNOME/gimp/issues/26] + + +===Text layers=== + +GIMP doesn't yet allow editing the contents of text layers in PSD files. The PSD parser in our PSD plugin is already aware of relevant blocks (see the ''plug-ins/file-psd/psd.h'' file). Someone should add text layer editing and styling functions to the PDB, so that the plug-in could make use of styling features in GIMP. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug reports:''' + +* [https://gitlab.gnome.org/GNOME/gimp/issues/94 https://gitlab.gnome.org/GNOME/gimp/issues/94] (importing) +* [https://gitlab.gnome.org/GNOME/gimp/issues/986 https://gitlab.gnome.org/GNOME/gimp/issues/986] (exporting) + +===Layer comps=== + +GIMP doesn't yet support layer comps in PSD, because it doesn't yet have this feature itself. + +Note that GIMP already has a tagging system for various resources (brushes, gradient etc.). It could be potentially extended to layers and thus provide a superset of what Photoshop allows, thus opening a way for layer comps support in PSD. We haven't discussed this feature request yet. If you are interested to implement this, please talk to us first. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug reports:''' none filed (?) + + +===Blending modes=== + +Currently, GIMP supports all blending modes available in PSD as per [https://helpx.adobe.com/photoshop/using/blending-modes.html Adobe's documentation], but doesn't yet take into consideration that "only the Normal, Dissolve, Darken, Multiply, Lighten, Linear Dodge (Add), Difference, Hue, Saturation, Color, Luminosity, Lighter Color, and Darker Color blending modes are available for 32‑bit images". Thus GIMP should detect unsupported blending modes in its project and suggest to either lower bit depth on exporting or give the user a chance to change the project composition. + +Additionally, not all blending modes map perfectly between GIMP and Photoshop. Resolving this might imply hackarounds. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug reports:''' none filed + + +===Blending options=== + +GIMP doesn't yet support some advanced layer blending options available in Photoshop, hence it does not support this feature in PSD files. The options are: + + +* excluding particular channels from blending +* conditional per-channel blending + +Hence GIMP should gain these features first, then the PSD plug-in can be patched accordingly. + +This hasn't been discussed by the team much yet, but it should be noted that channel selection for conditional blending in Photoshop is restricted to Grey and the channels of the current color model/space (e.g. R, G, and B for an RGB image). This seems overly restrictive, implementing support for blending based on CIE CLH and other color spaces would be beneficial for users (as demonstrated by e.g. darktable). Thus the implementation would be a superset of what Photoshop allows. + +'''Prerequisites:''' we haven't discussed yet if this is 2.10, 3.0, or 3.2 material. Please talk to us first. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/1305 https://gitlab.gnome.org/GNOME/gimp/issues/1305] (conditional blending) + + +==Masks== + +When loading a PSD file, GIMP cuts off a layer mask when it's outside layer boundary. The bug hasn't been investigated yet. We also need sample PSD images, we only have screenshots. + +'''Prerequisites:''' none known, investigation needed. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/1053 https://gitlab.gnome.org/GNOME/gimp/issues/1053] + + +==Paths== + +GIMP doesn't yet save paths as working paths to PSD. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/145 https://gitlab.gnome.org/GNOME/gimp/issues/145] + + +==Undo history== + +Undo history isn't supported in either importing or exporting of PSD files. It hasn't been investigated yet, but GIMP doesn't support saving undo history to its own XCF files yet. + +'''Prerequisites:''' add support for saving undo history to XCF. This needs thorough discussion and design. Please talk to us first. + +'''Bug report''': [https://gitlab.gnome.org/GNOME/gimp/issues/457 https://gitlab.gnome.org/GNOME/gimp/issues/457] (PSD export and import miss the undo history) + + \ No newline at end of file diff --git a/wiki/PSD_support-20220128103322-show.txt b/wiki/PSD_support-20220128103322-show.txt new file mode 100644 index 0000000..05f30d9 --- /dev/null +++ b/wiki/PSD_support-20220128103322-show.txt @@ -0,0 +1,160 @@ + + +GIMP supports both opening and exporting of PSD files. However, this support comes with various limitations due to multiple reasons. This page lists unsupported features and provides an insight into further work on better PSD support. + + +__TOC__ + +==How to contribute== + +If you are interested to contribute, please see here: [https://www.gimp.org/develop/ https://www.gimp.org/develop/]. + +The file-psd plugin's code is located here: [https://gitlab.gnome.org/GNOME/gimp/tree/master/plug-ins/file-psd https://gitlab.gnome.org/GNOME/gimp/tree/master/plug-ins/file-psd]. + +Most of the information on PSD/PSB is publicly available at [https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/ https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/]. We hear from our fellow Krita developers that it isn't complete though. + + +==PSB files== + +GIMP doesn't yet support PSB files. The difference between the two is that PSB supports larger images (up to 300K px in both dimensions) and uses 8 bytes instead of 4 bytes to describe various blocks of data. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug report''': [https://gitlab.gnome.org/GNOME/gimp/issues/884 https://gitlab.gnome.org/GNOME/gimp/issues/884] + + +==Image modes== + +GIMP doesn't support LAB, CMYK, Bitmap, and Duotone modes. We aren't convinced that we need to implement those exactly the way Photoshop does it. Space-specific processing with filters can be accessible without prior conversion to a particular image mode. + +'''Prerequisites:''' none known, but this probably needs an extensive offline discussion. + +'''Bug reports''': + + +* [https://gitlab.gnome.org/GNOME/gimp/issues/19 https://gitlab.gnome.org/GNOME/gimp/issues/19] (Duotone) +* [https://gitlab.gnome.org/GNOME/gimp/issues/354 https://gitlab.gnome.org/GNOME/gimp/issues/354] (CMYK) +* [https://gitlab.gnome.org/GNOME/gimp/issues/2206 https://gitlab.gnome.org/GNOME/gimp/issues/2206] (Multichannel) + +==Layers== + +===Smart objects / Layer clones=== + +Support for layer clones is likely to be added along with non-destructive editing (scheduled for v3.2) or soon thereafter. Then this feature can be added to the PSD plug-in as well. + +'''Prerequisites:''' non-destructive editing (v3.2). + +'''Bug reports''': + + +* [https://gitlab.gnome.org/GNOME/gimp/issues/80 https://gitlab.gnome.org/GNOME/gimp/issues/80] (sharing pixels between layers) +* [https://gitlab.gnome.org/GNOME/gimp/issues/2468 https://gitlab.gnome.org/GNOME/gimp/issues/2468] (smart objects) + +===Vector layers=== + +Initial implementation has been available as a set of patches since 2006. It has quite a few design issues, it has never been merged, hence we cannot support vector layers in PSD files yet. + +'''Prerequisites:''' review existing patches and redesign the implementation around [http://gegl.org/operations/vector.html GEGL vector operations]. An interested developer can hack on that at any time. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/282 https://gitlab.gnome.org/GNOME/gimp/issues/282] (Merge vector layers GSoC Project) + + +===Fill layers=== + +Support for fill layers is likely to be added along with non-destructive editing (scheduled for v3.2) or soon thereafter. Then this feature can be added to the PSD plug-in as well. + +'''Prerequisites:''' non-destructive editing (v3.2). + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/85 https://gitlab.gnome.org/GNOME/gimp/issues/85] (Add support for fill layers) + + +===Adjustment layers and layer effects=== + +GIMP doesn't yet support adjustment layers and layer effects, so it cannot directly read those from PSD or export those to PSD. + +A temporary workaround is available since v2.10.6: you '''can''' open PSD files saved with backwards compatibility, where non-destructive changes are flattened to a single layer. + +Please note, that since 2.10, GIMP has an API for attaching filters to layers, which is a foundation work for further development. + +'''Prerequisites:''' release of v3.0. Non-destructive editing is primary objective of v3.2. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/26 https://gitlab.gnome.org/GNOME/gimp/issues/26] + + +===Text layers=== + +GIMP doesn't yet allow editing the contents of text layers in PSD files. The PSD parser in our PSD plugin is already aware of relevant blocks (see the ''plug-ins/file-psd/psd.h'' file). Someone should add text layer editing and styling functions to the PDB, so that the plug-in could make use of styling features in GIMP. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug reports:''' + +* [https://gitlab.gnome.org/GNOME/gimp/issues/94 https://gitlab.gnome.org/GNOME/gimp/issues/94] (importing) +* [https://gitlab.gnome.org/GNOME/gimp/issues/986 https://gitlab.gnome.org/GNOME/gimp/issues/986] (exporting) + +===Layer comps=== + +GIMP doesn't yet support layer comps in PSD, because it doesn't yet have this feature itself. + +Note that GIMP already has a tagging system for various resources (brushes, gradient etc.). It could be potentially extended to layers and thus provide a superset of what Photoshop allows, thus opening a way for layer comps support in PSD. We haven't discussed this feature request yet. If you are interested to implement this, please talk to us first. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug reports:''' none filed (?) + + +===Blending modes=== + +Currently, GIMP supports all blending modes available in PSD as per [https://helpx.adobe.com/photoshop/using/blending-modes.html Adobe's documentation], but doesn't yet take into consideration that "only the Normal, Dissolve, Darken, Multiply, Lighten, Linear Dodge (Add), Difference, Hue, Saturation, Color, Luminosity, Lighter Color, and Darker Color blending modes are available for 32‑bit images". Thus GIMP should detect unsupported blending modes in its project and suggest to either lower bit depth on exporting or give the user a chance to change the project composition. + +Additionally, not all blending modes map perfectly between GIMP and Photoshop. Resolving this might imply hackarounds. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug reports:''' none filed + + +===Blending options=== + +GIMP doesn't yet support some advanced layer blending options available in Photoshop, hence it does not support this feature in PSD files. The options are: + + +* excluding particular channels from blending +* conditional per-channel blending + +Hence GIMP should gain these features first, then the PSD plug-in can be patched accordingly. + +This hasn't been discussed by the team much yet, but it should be noted that channel selection for conditional blending in Photoshop is restricted to Grey and the channels of the current color model/space (e.g. R, G, and B for an RGB image). This seems overly restrictive, implementing support for blending based on CIE CLH and other color spaces would be beneficial for users (as demonstrated by e.g. darktable). Thus the implementation would be a superset of what Photoshop allows. + +'''Prerequisites:''' we haven't discussed yet if this is 2.10, 3.0, or 3.2 material. Please talk to us first. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/1305 https://gitlab.gnome.org/GNOME/gimp/issues/1305] (conditional blending) + + +==Masks== + +When loading a PSD file, GIMP cuts off a layer mask when it's outside layer boundary. The bug hasn't been investigated yet. We also need sample PSD images, we only have screenshots. + +'''Prerequisites:''' none known, investigation needed. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/1053 https://gitlab.gnome.org/GNOME/gimp/issues/1053] + + +==Paths== + +GIMP doesn't yet save paths as working paths to PSD. + +'''Prerequisites:''' none known. An interested developer can hack on that at any time. + +'''Bug report:''' [https://gitlab.gnome.org/GNOME/gimp/issues/145 https://gitlab.gnome.org/GNOME/gimp/issues/145] + + +==Undo history== + +Undo history isn't supported in either importing or exporting of PSD files. It hasn't been investigated yet, but GIMP doesn't support saving undo history to its own XCF files yet. + +'''Prerequisites:''' add support for saving undo history to XCF. This needs thorough discussion and design. Please talk to us first. + +'''Bug report''': [https://gitlab.gnome.org/GNOME/gimp/issues/457 https://gitlab.gnome.org/GNOME/gimp/issues/457] (PSD export and import miss the undo history) + + \ No newline at end of file diff --git a/wiki/Release:2.10_changelog-20160927041611-show.txt b/wiki/Release:2.10_changelog-20160927041611-show.txt new file mode 100644 index 0000000..161f4e0 --- /dev/null +++ b/wiki/Release:2.10_changelog-20160927041611-show.txt @@ -0,0 +1,296 @@ + + +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + + +__TOC__ + +==Core== + +GIMP 2.10 uses GEGL image processing library for all operations. + + +* new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* switch between perceptual gamma and linear light +* optional dithering during conversions between precision modes +* optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') + +==Layers, Masks, Paths, Channels== + +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Add new clipboard implementation for entire images to copy/paste layers / layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Add LCH layer modes: Hue, Chroma, Color, and Lightness. See [http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html] for details +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +==Tools== + +===New Tool: Unified Transform=== + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + + +===New Tool: Warp Transform=== + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + + +===New Tool: Handle Transform=== + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + + +===New Tool: N-Point Deformation=== + +A new way to bend objects while preserving a natural look. + + +===New Tool: Seamless Clone=== + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + + +===New Tool: MyPaint Brush=== + +Use MyPaint brushes for painting. + + +===Updated Tool: Blend=== + +The tool is now more interactive. After drawing with the tool to define the beginning and the end of the gradient fill, you can adjust start/end positions and change colors. + + +===Updated Tool: Align=== + +Now features: + + +* vertical and horizontal fill modes; +* vertical offset. + +===Updated Tool: Foreground Select=== + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + + +===Updated Tool: Text=== + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +===Updated Tool: Select by Color=== + +* new ''Draw mask'' option to display future selection area with a magenta fill + +===Updated Tool: Fuzzy Select=== + +* new ''Draw mask'' option to display future selection area with a magenta fill +* new ''Diagonal neighbours'' option to select diagonally neighboring pixels + +===Updated Tool: Bucket Fill=== + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +===Updated Tool: Desaturate=== + +* turn the Desaturate tool into a normal GEGL filter +* move "Desaturate" to Colors -> Desaturate + +===Updated Tool: Posterize=== + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +==Plugins== + +* On-canvas preview for all filters that use a GEGL operation +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain) +* Allow plug-ins to access image data at full bit depth +* Add a compat mode so unported plug-ins always get 8-bit data +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure ('''FIXME:''' CHECK the full list) +* New plugin to load raw files by having them developed in Darktable (only on platforms supported by Darktable, i.e. Unix/Linux/BSD/OSX). +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list) +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models) +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). + +==Color Management== + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** color selectors, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** color selectors, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* layer/image/color palette/gradient/pattern previews, +* Color Picker tool, +* GimpColorHistory, +* GimpFgBgEditor, +* color selectors, +* DND widget, +* painting tools, +* copying layers/paste buffer between images + +==File Access== + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* Improved automatic file formats recognition + +==Metadata== + +* Implement metadata handling in the core +* Add ''Image -> Image Metadata'' dialog for viewing Exif, IPTC, and XMP info +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings + +==File Format Support== + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) + +==Dockable Dialogs== + +* Add an automatic palette of recently used colors +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog + +==Digital Painting== + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. + +==Configurability== + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialog +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the 'Color Management' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the 'Interface' page of the 'Preferences' dialog) +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} + +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} + +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + + + +==General Changes== + +===Internal Changes=== + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +===UI changes=== + +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). + +==Batch processing== + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: +
    gimp -i -b '(with-files "*.png" (gimp-invert layer) \
    +             (gimp-file-save 1 image layer \
    +             (string-append basename ".jpg") \
    +             (string-append basename ".jpg") ))'
    +
    + +==API Changes== + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside + +==Debugging== + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. diff --git a/wiki/Release:2.10_changelog-20201129005639-edit.txt b/wiki/Release:2.10_changelog-20201129005639-edit.txt new file mode 100644 index 0000000..4a3f290 --- /dev/null +++ b/wiki/Release:2.10_changelog-20201129005639-edit.txt @@ -0,0 +1,460 @@ +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + +== Core == + +GIMP 2.10 uses GEGL image processing library for all operations. + +* Processing with 8-bit, 16-bit, and 32-bit per color channel precision, accessible via new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* A switch between perceptual gamma and linear light for already opened images +* Layer modes available in gamma-corrected and linear light versions now (where applicable), legacy rendering preserved for older XCF files +* Gamma, precision, and color profile selector for newly created images (GimpTemplate) +* Optional dithering during conversions between precision modes, never dither when converting to a higher bit depth, or to anything more than 16 bits +* Optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') +* Optional multi-threading available again, the default value is set to the amount of automatically discovered CPU cores, max is 64 +* Pre-initialize some babl-based pixel format conversion routines at the start-up to decrease the initial lazy initialization cost for some interactions + +== Layers, Masks, Paths, Channels == + +* Substantial rewrite of layer modes and how they are stored in XCF +* Simplistic widget for switching between legacy modes (2.8 and earlier), linear modes, gamma-corrected modes +* New LCH layer modes: Hue, Chroma, Color, and Lightness. See http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html for details +* New Pass Through mode for layer groups +* New Linear Burn, Vivid Light, Linear Light, Pin Light, Hard Mix, and Exclusion layer modes (as described on http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html) +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Configurable compositing of layers with the following modes: Auto, Source over, Source atop, Source in, Destination atop +* Support layer masks on layer groups. +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Enhance the ''Layer Attributes'' dialog to provide the single UI for: +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +* Add color tags to layers for better layers management (can be set via ''Layers'' menu, ''Layer Attributes'' dialog, and accessible via shortcuts), also available for channels and paths +* Add new clipboard implementation for entire images to copy/paste layers and layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +== Tools == + +=== New Tool: Unified Transform === + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + +=== New Tool: Warp Transform === + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + +=== New Tool: Handle Transform === + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + +=== New Tool: N-Point Deformation (experimental) === + +A new way to bend objects while preserving a natural look. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + +=== New Tool: Seamless Clone (experimental) === + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + +=== New Tool: MyPaint Brush === + +Use MyPaint brushes for painting. + +=== Updated Tool: all paint tools === + +All paint tools now display the angle (relatively to the horizontal line, centered on previously drawn position) alongside distance in status bar when straight line constraining (holding '''Shift''' when painting). + +=== Updated Tool: Smudge === + +* New ''No erase effect'' option to prevent the tool from changing alpha of pixels +* FG color can now be blended into smudged pixels, controlled by new ''Flow'' slider. With 0, there is no blending. + +Detailed information: https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting + +=== Updated Tool: Flip === + +* Add support for reflecting across guides to the Flip tool. When clicking on a guide while using the flip tool, reflect the active item across the guide, rather than around its center. +* Add "clipping" option to the Flip tool. This option behaves similarly to the other transform tool, however it's limited to "adjust" and "clip" only. Now that the flip tool can reflect across guides, this option is meaningful. + +=== Updated Tool: Blend === + +The Blend tool now features on-canvas gradient editing: adding, shifting, removing color stops, shifting midpoints and converting them to color stops, assigning colors to color stops, changing blending type for midpoints. + +New options: + +* 'Instant mode' (active before you start blending), enables support of the old workflow where you can't edit color stops before applying the gradient fill +* 'Modify active gradient', allows changing user-writable gradients directly rather than creating copies of them + +=== Updated Tool: Align === + +Now features: + +* vertical and horizontal fill modes; +* vertical offset. + +=== Updated Tool: Move === + +Now features: + +* Show relative coordinates when moving guides and sample points. + +=== Updated Tool: Text === + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +=== Updated Tool: Foreground Select === + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + +=== Updated Tool: Select by Color === + +* New ''Draw mask'' option to display future selection area with a magenta fill + +=== Updated Tool: Fuzzy Select === + +* New ''Draw mask'' option to display future selection area with a magenta fill +* New ''Diagonal neighbors'' option to select diagonally neighboring pixels + +=== Updated Tool: Free Select === + +* Closing a polygonal/free selection now doesn't confirm the selection automatically. Instead you still can tweak positions of nodes (where applicable), then press Enter or switch to another tool to confirm the selection. + +=== Updated Tool: Intelligent Scissors === + +* allow to remove the last added IScissors segment with backspace +* GIMP now checks, whether the first and the last isegments are distinct before closing the curve + +=== Updated Tool: Bucket Fill === + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +=== Updated Tool: Desaturate === + +* Turn the Desaturate tool into a normal GEGL filter +* Move "Desaturate" to Colors -> Desaturate + +=== Updated Tool: Posterize === + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +=== Updated Tool: Colorize === + +* Remove the Colorize tool and replace it by a generic filter action. + +=== Updated Tool: Color Balance === + +* Replace the color balance tool by a generic filter action + +=== Updated Tool: Hue-Saturation === + +* Remove the Hue-Saturation tool and replace it by a generic filter action. + +=== Updated Tool: Color Picker === + +* Don't snap to anything when picking colors +* Color picker tools now always draw the outline of the averaged region, not only while the mouse is being pressed +* Support arbitrary range of values regardless of the actual image color precision +* Add LAB and LCH readout to Info window + +=== Removed menu: Color Tools === + +'Image -> Tools -> Color Tools' is gone now that all color tools are basically GEGL operations with custom UI. + +=== Refactoring === + +Move on-canvas interaction code of some tools to new GimpToolWidget class and make it available to GEGL-based filters. + +== Plugins == + +* Allow plug-ins to access image data at full bit depth. +* On-canvas preview for all filters that use a GEGL operation. +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain). +* On-canvas controls for ''Spiral'' (experimental) and ''Supernova'' GEGL-based filters. +* Add a compat mode so unported plug-ins always get 8-bit data. +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure, Extract Component, Dither, RGB Clip, Waterpixels, Image Gradient, Symmetric Nearest Neighbor, Wavelet Decompose, Simple Linear Interactive Clustering, Fattal, Mantiuk, Reinhard, Stress ('''FIXME:''' CHECK the full list). +* New ''Hue-Chroma'' operation/tool. +* New file-darktable and file-rawtherapee plug-ins to load raw (digital negative) files by having them developed in darktable or RawTherapee. +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list). +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models). +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). +* Add interpreter for the GUM (GEGL UI Metadata) language. GUM is a small DSL, used in some property keys of GEGL operations to dynamically control UI attributes based on context. +* Allow plug-in inside first-level directories of plug-ins folders. GIMP doesn't search recursively, but only at the first level. If a plug-in is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). +* Allow filter actions to have hardcoded default operation settings by encoding them directly in the string attached to all filter actions. The code now supports both "gegl:some-operation" and "gegl:some-operation\n". + +== Color Management, Color Spaces and Models == + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Mark out-of-gamut colors also in the RGB and HSV color areas +* Make the screenshot plug-in color-managed +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* Add LCH channels to color selector dialog (FG/BG etc.) +* Allow decomposing/composing to/from LCH +* New ''Extract Channel'' command to extract channels in various color spaces +* Re-arrange color models in the Color dock: add a switch between HSV and LCH + +== File Access == + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* SSL/TLS support is now a mandatory dependency (HTTPS being now the web standard, and HTTP being more and more deprecated by browsers everyday) +* Improved automatic file formats recognition + +== Metadata == + +* Implement metadata handling in the core +* Add ''Image -> Metadata -> View Metadata'' dialog for viewing Exif, IPTC, and XMP info (DICOM metadata is displayed in the XMP tab) +* Add ''Image -> Metadata -> Edit Metadata'' dialog for editing IPTC (plus extensions), GPS and DICOM metadata +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings +* Defaults for saving metadata are configurable now in the ''Preferences'' dialog + +== File Format Support == + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* PSD plug-in now supports more blend modes (import/export), reads Pass Through mode for layer groups +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) +* Writing linear gamma TIFF images +* Allow exporting layers as PDF pages +* Improve the raw ('''not''' the digital negative) files plugin: +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) + +== Printing == + +* Print resolution can now be reset to defaults, new values for the same image is actually used now without reloading the image. + +== Color Palettes == + +* Selecting multiple palettes and merging them into one is possible now (''Palette > Merge Palettes...'') +* Add an automatic palette of recently used colors + +== Dockable Dialogs == + +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog +* Add LAB and LCH readout to Pointer and Sample Points dialogs +* New dashboard dockable: shows the current GEGL cache and swap sizes and CPU usage and active time, and their recent history. It has options to control the update rate and history duration of the data, and an option to warn (by raising/blinking the dialog) when the swap size approaches its limit. + +== Digital Painting == + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. +* For bitmap brushes, GIMP now caches hardness and disables dynamic change of hardness to improve painting performance. Botmap brushes also don't get clipped anymore, when hardness is less than 100. + +== Configurability and usability == + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Import'' page in the ''Preferences'' dialog to define image importing policies (promoting to 32-bit float and dithering) +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialogs +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the ''Color Management'' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the ''Interface'' page of the 'Preferences' dialog) +* Allow mouse to optionally configure tablet devices +* Allow creating shortcuts containing the Cmd key + mouse wheel events +* Default to 300ppi and 1920x1080px for new documents. +* Do not allow Alt+[0-9] shortcuts, they are typically used for display switching +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + +== Usability == + +* Enable "save-tool-options" and "save-device-status" by default, it's the expected behavior these days. +* Brightness-Contrast, Curves, Levels and Threshold are now available in "Repeat last" history. + +== General Changes == + +=== Internal Changes === + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +=== UI changes === + +* Add '''Save As''' buttons to the “Quit GIMP” dialog for every opened image +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Turn invert-perceptual, -linear and -value into normal filter actions, so they show up in recent filters, and don't need their own callbacks. +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). +* Allow to choose fill color when resizing layers and images +* Allow to zoom with middle mouse button + control + drag up/down +* Check and clean out duplicate accelerators on startup +* Toolbox buttons do not grab focus anymore, which used to break usage of the Tab key and other canvas-related shortcuts after changing tools with a pointing device click +* '''Delete Layer/Channel/Path''' are consistently the last option in respective dialogs now +* Extend the text along the tangent of the last path stroke, when the length of the path along which the text layer content is warped is shorter than the width of the text +* Allow to toggle the histogram dialog between gamma and linear +* New '''Colors -> Linear Invert''' command to provide radiometrically correct color inversion +* Optimal digit precision for length display in physical units in various widgets +* Switching between linear and perceptual (gamma-corrected) spaces in the Histogram dialog is easier now: two buttons instead of one two-way button where current state was difficult to understand. +* Shorten color channel labels in the color frame (color picker tool, sample point editor…) with conventional 1 or 2-letter abbreviations, and split coordinates on 2 lines. +* We now switch to "Huge" icons by default when the display pixel density is over 250 PPI (used to be 300 PPI). + +== Assets == + +* Modernize default list of document templates. +* Add 4x3 Landscape/Portrait, 3x2 Landscape/Portrait, 16x10, 16x9, and Square presets for the Crop tool. +* Add a basic "Pressure Size" dynamics. This is a common dynamics, for instance when you do colorization bases. This allows to control the size of the brush with pressure and always keep unified color without opacity changes. + +== Batch processing == + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: + + gimp -i -b '(with-files "*.png" (gimp-invert layer) \ + (gimp-file-save 1 image layer \ + (string-append basename ".jpg") \ + (string-append basename ".jpg") ))' + +== API Changes == + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside +* New gimp_export_exif(), gimp_export_xmp() and gimp_export_iptc() functions returning the creator choice regarding default handling for metadata export (as set in the Preferences). +* New gimp_get_pdb_status() to return the status of the last PDB call. This is needed for plug-ins which depend on other plug-ins' procedures. If for instance, a second-level plug-in is interrupted interactively, we don't want to process this as an error but as a cancellation. +* New gimp_stack_trace_available(), gimp_stack_trace_print() and gimp_stack_trace_query() for debugging. +* Use gegl:distance-transform in gimp_edit_blend() implementation making it much faster for all GRADIENT_SHAPEBURST_* gradient types. Legacy gimp:shapeburst operation has been deleted. +* New gimp_context_get_distance_metric() and gimp_context_set_distance_metric() for distance metric used in gimp_edit_blend() (and future usage). +* app, pdb: Modify gimp_channel_border() to take a style parameter +* pdb: Modify gimp-selection-border to use BORDER_STYLE_SMOOTH +* pdb, app, libgimp: rename *-paste-as-new to *-paste-as-new-image +* Add PDB API for color tags/labels (for layers/channels/paths) +* pdb, app, libgimp: change ranges for histogram and threshold to 0.0..1.0 +* app, pdb, libgimp: allow to choose the channel when thresholding +* app, pdb: use GeglDitherMethod instead of simply an integer +* Add PDB API and UI to control a layer's composite mode +* Remove the _LINEAR layer mode variants +* Add PDB API for layer blend space and compositing space +* Rename values of enum GimpConvertPaletteType and GimpConvertDitherType +* pdb: add debug group; add debug-timer-{start,end} procs +* pdb: fix input range of context-set-brush-size +* app: add gimp_edit_paste_as_new_image() and use it from GUI and PDB +* app, pdb, libgimp: make the raw image importer configurable +* app, pdb: change a lot of GIMP_LAYER_MODE_NORMAL_LEGACY to just NORMAL +* pdb: add new procedure gimp-get-default-new-layer-mode +* pdb, libgimp: rename gimp_drawable_invert() to _invert_non_linear() +* pdb, libgimp: change the gimp-drawable-invert API again +* add file-pdf-load2 PDB API. +* pdb, libgimp: add gimp-item-{get,set}-expanded() +* app, pdb: prevent custom gradient from being renamed +* add file-hgt-load new PDB call +* pdb: fail layer-remove-mask if applying a mask to a group layer +* pdb: allow adding masks to group layers in layer-add-mask +* app, pdb, libgimp, plug-ins, menus: rename layer composite modes +* app, libgimp, libgimpbase, pdb: s/GimpDistanceMetric/GeglDistanceMetric/ +* pdb, libgimp: allow to use external GType-registered enums in the PDB +* pdb: prepend GEGL enum types with GEGL_TYPE. +* app, libgimp, pdb: add "distance-metric" property to GimpPDBContext. +* pdb: add jehan_pdb_misc() and use it in the new procedures +* Rename Blend tool and provide PDB compatibility +* app: add gimp_pdb_context_get_paint_options_list() +* add drawable_edit.pdb and deprecate all non-clipboard functions in the "edit" group +* pdb: never pass bogus supersample values to gimp_drawable_gradient() +* pdb: add procedures to set the built-in gradients +* pdb: fix use of "seed" properties in plug_in_compat.pdb +* app, pdb: s/gimp_pdb_item_is_modifyable/gimp_pdb_item_is_modifiable/ +* pdb: add gimp-item-transform-translate procedure +* pdb: deprecated gimp-layer-translate +* pdb: make all item-transform procedures honor the "linked" flag +* pdb: finally deprecate gimp-color-balance + +== Debugging and bug reporting == + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. +* New debug tool and infrastructure to handle WARNING and CRITICAL errors, as well as fatal errors (crashes), raising a pop-up with all version information on GIMP and its main dependencies, as well as the error message and backtraces, and encouraging people to make bug reports. +* GIMP now attempts to backup unsaved images when it crashes. Then at next startup, it will suggest to recover the salvaged images. Image recovery is not 100% guaranteed. diff --git a/wiki/Release:2.10_changelog-20210125182118-show.txt b/wiki/Release:2.10_changelog-20210125182118-show.txt new file mode 100644 index 0000000..68d2bae --- /dev/null +++ b/wiki/Release:2.10_changelog-20210125182118-show.txt @@ -0,0 +1,525 @@ + + +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + + +__TOC__ + +==Core== + +GIMP 2.10 uses GEGL image processing library for all operations. + + +* Processing with 8-bit, 16-bit, and 32-bit per color channel precision, accessible via new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* A switch between perceptual gamma and linear light for already opened images +* Layer modes available in gamma-corrected and linear light versions now (where applicable), legacy rendering preserved for older XCF files +* Gamma, precision, and color profile selector for newly created images (GimpTemplate) +* Optional dithering during conversions between precision modes, never dither when converting to a higher bit depth, or to anything more than 16 bits +* Optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') +* Optional multi-threading available again, the default value is set to the amount of automatically discovered CPU cores, max is 64 +* Pre-initialize some babl-based pixel format conversion routines at the start-up to decrease the initial lazy initialization cost for some interactions + +==Layers, Masks, Paths, Channels== + +* Substantial rewrite of layer modes and how they are stored in XCF +* Simplistic widget for switching between legacy modes (2.8 and earlier), linear modes, gamma-corrected modes +* New LCH layer modes: Hue, Chroma, Color, and Lightness. See [http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html] for details +* New Pass Through mode for layer groups +* New Linear Burn, Vivid Light, Linear Light, Pin Light, Hard Mix, and Exclusion layer modes (as described on [http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html]) +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Configurable compositing of layers with the following modes: Auto, Source over, Source atop, Source in, Destination atop +* Support layer masks on layer groups. +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Enhance the ''Layer Attributes'' dialog to provide the single UI for: +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +* setting layer's name +* changing blending mode and opacity +* setting offset in X/Y +* toggling visibility, link status, various locks +* Add color tags to layers for better layers management (can be set via ''Layers'' menu, ''Layer Attributes'' dialog, and accessible via shortcuts), also available for channels and paths +* Add new clipboard implementation for entire images to copy/paste layers and layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +==Tools== + +===New Tool: Unified Transform=== + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + + +===New Tool: Warp Transform=== + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + + +===New Tool: Handle Transform=== + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + + +===New Tool: N-Point Deformation (experimental)=== + +A new way to bend objects while preserving a natural look. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + + +===New Tool: Seamless Clone (experimental)=== + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + + +===New Tool: MyPaint Brush=== + +Use MyPaint brushes for painting. + + +===Updated Tool: all paint tools=== + +All paint tools now display the angle (relatively to the horizontal line, centered on previously drawn position) alongside distance in status bar when straight line constraining (holding '''Shift''' when painting). + + +===Updated Tool: Smudge=== + +* New ''No erase effect'' option to prevent the tool from changing alpha of pixels +* FG color can now be blended into smudged pixels, controlled by new ''Flow'' slider. With 0, there is no blending. + +Detailed information: [https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting] + + +===Updated Tool: Flip=== + +* Add support for reflecting across guides to the Flip tool. When clicking on a guide while using the flip tool, reflect the active item across the guide, rather than around its center. +* Add "clipping" option to the Flip tool. This option behaves similarly to the other transform tool, however it's limited to "adjust" and "clip" only. Now that the flip tool can reflect across guides, this option is meaningful. + +===Updated Tool: Blend=== + +The Blend tool now features on-canvas gradient editing: adding, shifting, removing color stops, shifting midpoints and converting them to color stops, assigning colors to color stops, changing blending type for midpoints. + +New options: + + +* 'Instant mode' (active before you start blending), enables support of the old workflow where you can't edit color stops before applying the gradient fill +* 'Modify active gradient', allows changing user-writable gradients directly rather than creating copies of them + +===Updated Tool: Align=== + +Now features: + + +* vertical and horizontal fill modes; +* vertical offset. + +===Updated Tool: Move=== + +Now features: + + +* Show relative coordinates when moving guides and sample points. + +===Updated Tool: Text=== + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +===Updated Tool: Foreground Select=== + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + + +===Updated Tool: Select by Color=== + +* New ''Draw mask'' option to display future selection area with a magenta fill + +===Updated Tool: Fuzzy Select=== + +* New ''Draw mask'' option to display future selection area with a magenta fill +* New ''Diagonal neighbors'' option to select diagonally neighboring pixels + +===Updated Tool: Free Select=== + +* Closing a polygonal/free selection now doesn't confirm the selection automatically. Instead you still can tweak positions of nodes (where applicable), then press Enter or switch to another tool to confirm the selection. + +===Updated Tool: Intelligent Scissors=== + +* allow to remove the last added IScissors segment with backspace +* GIMP now checks, whether the first and the last isegments are distinct before closing the curve + +===Updated Tool: Bucket Fill=== + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +===Updated Tool: Desaturate=== + +* Turn the Desaturate tool into a normal GEGL filter +* Move "Desaturate" to Colors -> Desaturate + +===Updated Tool: Posterize=== + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +===Updated Tool: Colorize=== + +* Remove the Colorize tool and replace it by a generic filter action. + +===Updated Tool: Color Balance=== + +* Replace the color balance tool by a generic filter action + +===Updated Tool: Hue-Saturation=== + +* Remove the Hue-Saturation tool and replace it by a generic filter action. + +===Updated Tool: Color Picker=== + +* Don't snap to anything when picking colors +* Color picker tools now always draw the outline of the averaged region, not only while the mouse is being pressed +* Support arbitrary range of values regardless of the actual image color precision +* Add LAB and LCH readout to Info window + +===Removed menu: Color Tools=== + +'Image -> Tools -> Color Tools' is gone now that all color tools are basically GEGL operations with custom UI. + + +===Refactoring=== + +Move on-canvas interaction code of some tools to new GimpToolWidget class and make it available to GEGL-based filters. + + +==Plugins== + +* Allow plug-ins to access image data at full bit depth. +* On-canvas preview for all filters that use a GEGL operation. +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain). +* On-canvas controls for ''Spiral'' (experimental) and ''Supernova'' GEGL-based filters. +* Add a compat mode so unported plug-ins always get 8-bit data. +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure, Extract Component, Dither, RGB Clip, Waterpixels, Image Gradient, Symmetric Nearest Neighbor, Wavelet Decompose, Simple Linear Interactive Clustering, Fattal, Mantiuk, Reinhard, Stress ('''FIXME:''' CHECK the full list). +* New ''Hue-Chroma'' operation/tool. +* New file-darktable and file-rawtherapee plug-ins to load raw (digital negative) files by having them developed in darktable or RawTherapee. +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list). +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models). +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). +* Add interpreter for the GUM (GEGL UI Metadata) language. GUM is a small DSL, used in some property keys of GEGL operations to dynamically control UI attributes based on context. +* Allow plug-in inside first-level directories of plug-ins folders. GIMP doesn't search recursively, but only at the first level. If a plug-in is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). +* Allow filter actions to have hardcoded default operation settings by encoding them directly in the string attached to all filter actions. The code now supports both "gegl:some-operation" and "gegl:some-operation\n". + + +==Color Management, Color Spaces and Models== + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Mark out-of-gamut colors also in the RGB and HSV color areas +* Make the screenshot plug-in color-managed +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* layer/image/color palette/gradient/pattern previews, +* Color Picker tool, +* GimpColorHistory, +* GimpFgBgEditor, +* GimpColorFrame (Mouse Pointer dialog), +* color selectors, +* script-fu color buttons, +* DND widget, +* painting tools, +* copying layers/paste buffer between images +* Add LCH channels to color selector dialog (FG/BG etc.) +* Allow decomposing/composing to/from LCH +* New ''Extract Channel'' command to extract channels in various color spaces +* Re-arrange color models in the Color dock: add a switch between HSV and LCH + +==File Access== + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* SSL/TLS support is now a mandatory dependency (HTTPS being now the web standard, and HTTP being more and more deprecated by browsers everyday) +* Improved automatic file formats recognition + +==Metadata== + +* Implement metadata handling in the core +* Add ''Image -> Metadata -> View Metadata'' dialog for viewing Exif, IPTC, and XMP info (DICOM metadata is displayed in the XMP tab) +* Add ''Image -> Metadata -> Edit Metadata'' dialog for editing IPTC (plus extensions), GPS and DICOM metadata +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings +* Defaults for saving metadata are configurable now in the ''Preferences'' dialog + +==File Format Support== + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* PSD plug-in now supports more blend modes (import/export), reads Pass Through mode for layer groups +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) +* Writing linear gamma TIFF images +* Allow exporting layers as PDF pages +* Improve the raw ('''not''' the digital negative) files plugin: +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) +* Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +* Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +* Use GtkBuilder to construct the export dialog (similar to PNG plugin) +* Make the plugin remember last used export settings (similar to PNG plugin) +* Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +* Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) + +==Printing== + +* Print resolution can now be reset to defaults, new values for the same image is actually used now without reloading the image. + +==Color Palettes== + +* Selecting multiple palettes and merging them into one is possible now (''Palette > Merge Palettes...'') +* Add an automatic palette of recently used colors + +==Dockable Dialogs== + +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog +* Add LAB and LCH readout to Pointer and Sample Points dialogs +* New dashboard dockable: shows the current GEGL cache and swap sizes and CPU usage and active time, and their recent history. It has options to control the update rate and history duration of the data, and an option to warn (by raising/blinking the dialog) when the swap size approaches its limit. + +==Digital Painting== + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. +* For bitmap brushes, GIMP now caches hardness and disables dynamic change of hardness to improve painting performance. Botmap brushes also don't get clipped anymore, when hardness is less than 100. + +==Configurability and usability== + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Import'' page in the ''Preferences'' dialog to define image importing policies (promoting to 32-bit float and dithering) +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialogs +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the ''Color Management'' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the ''Interface'' page of the 'Preferences' dialog) +* Allow mouse to optionally configure tablet devices +* Allow creating shortcuts containing the Cmd key + mouse wheel events +* Default to 300ppi and 1920x1080px for new documents. +* Do not allow Alt+[0-9] shortcuts, they are typically used for display switching +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} + +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} + +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + + + +==Usability== + +* Enable "save-tool-options" and "save-device-status" by default, it's the expected behavior these days. +* Brightness-Contrast, Curves, Levels and Threshold are now available in "Repeat last" history. + +==General Changes== + +===Internal Changes=== + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +===UI changes=== + +* Add '''Save As''' buttons to the “Quit GIMP” dialog for every opened image +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Turn invert-perceptual, -linear and -value into normal filter actions, so they show up in recent filters, and don't need their own callbacks. +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). +* Allow to choose fill color when resizing layers and images +* Allow to zoom with middle mouse button + control + drag up/down +* Check and clean out duplicate accelerators on startup +* Toolbox buttons do not grab focus anymore, which used to break usage of the Tab key and other canvas-related shortcuts after changing tools with a pointing device click +* '''Delete Layer/Channel/Path''' are consistently the last option in respective dialogs now +* Extend the text along the tangent of the last path stroke, when the length of the path along which the text layer content is warped is shorter than the width of the text +* Allow to toggle the histogram dialog between gamma and linear +* New '''Colors -> Linear Invert''' command to provide radiometrically correct color inversion +* Optimal digit precision for length display in physical units in various widgets +* Switching between linear and perceptual (gamma-corrected) spaces in the Histogram dialog is easier now: two buttons instead of one two-way button where current state was difficult to understand. +* Shorten color channel labels in the color frame (color picker tool, sample point editor…) with conventional 1 or 2-letter abbreviations, and split coordinates on 2 lines. +* We now switch to "Huge" icons by default when the display pixel density is over 250 PPI (used to be 300 PPI). + +==Assets== + +* Modernize default list of document templates. +* Add 4x3 Landscape/Portrait, 3x2 Landscape/Portrait, 16x10, 16x9, and Square presets for the Crop tool. +* Add a basic "Pressure Size" dynamics. This is a common dynamics, for instance when you do colorization bases. This allows to control the size of the brush with pressure and always keep unified color without opacity changes. + +==Batch processing== + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: +
    gimp -i -b '(with-files "*.png" (gimp-invert layer) \
    +             (gimp-file-save 1 image layer \
    +             (string-append basename ".jpg") \
    +             (string-append basename ".jpg") ))'
    +
    + +==API Changes== + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside +* New gimp_export_exif(), gimp_export_xmp() and gimp_export_iptc() functions returning the creator choice regarding default handling for metadata export (as set in the Preferences). +* New gimp_get_pdb_status() to return the status of the last PDB call. This is needed for plug-ins which depend on other plug-ins' procedures. If for instance, a second-level plug-in is interrupted interactively, we don't want to process this as an error but as a cancellation. +* New gimp_stack_trace_available(), gimp_stack_trace_print() and gimp_stack_trace_query() for debugging. +* Use gegl:distance-transform in gimp_edit_blend() implementation making it much faster for all GRADIENT_SHAPEBURST_* gradient types. Legacy gimp:shapeburst operation has been deleted. +* New gimp_context_get_distance_metric() and gimp_context_set_distance_metric() for distance metric used in gimp_edit_blend() (and future usage). +* app, pdb: Modify gimp_channel_border() to take a style parameter +* pdb: Modify gimp-selection-border to use BORDER_STYLE_SMOOTH +* pdb, app, libgimp: rename *-paste-as-new to *-paste-as-new-image +* Add PDB API for color tags/labels (for layers/channels/paths) +* pdb, app, libgimp: change ranges for histogram and threshold to 0.0..1.0 +* app, pdb, libgimp: allow to choose the channel when thresholding +* app, pdb: use GeglDitherMethod instead of simply an integer +* Add PDB API and UI to control a layer's composite mode +* Remove the _LINEAR layer mode variants +* Add PDB API for layer blend space and compositing space +* Rename values of enum GimpConvertPaletteType and GimpConvertDitherType +* pdb: add debug group; add debug-timer-{start,end} procs +* pdb: fix input range of context-set-brush-size +* app: add gimp_edit_paste_as_new_image() and use it from GUI and PDB +* app, pdb, libgimp: make the raw image importer configurable +* app, pdb: change a lot of GIMP_LAYER_MODE_NORMAL_LEGACY to just NORMAL +* pdb: add new procedure gimp-get-default-new-layer-mode +* pdb, libgimp: rename gimp_drawable_invert() to _invert_non_linear() +* pdb, libgimp: change the gimp-drawable-invert API again +* add file-pdf-load2 PDB API. +* pdb, libgimp: add gimp-item-{get,set}-expanded() +* app, pdb: prevent custom gradient from being renamed +* add file-hgt-load new PDB call +* pdb: fail layer-remove-mask if applying a mask to a group layer +* pdb: allow adding masks to group layers in layer-add-mask +* app, pdb, libgimp, plug-ins, menus: rename layer composite modes +* app, libgimp, libgimpbase, pdb: s/GimpDistanceMetric/GeglDistanceMetric/ +* pdb, libgimp: allow to use external GType-registered enums in the PDB +* pdb: prepend GEGL enum types with GEGL_TYPE. +* app, libgimp, pdb: add "distance-metric" property to GimpPDBContext. +* pdb: add jehan_pdb_misc() and use it in the new procedures +* Rename Blend tool and provide PDB compatibility +* app: add gimp_pdb_context_get_paint_options_list() +* add drawable_edit.pdb and deprecate all non-clipboard functions in the "edit" group +* pdb: never pass bogus supersample values to gimp_drawable_gradient() +* pdb: add procedures to set the built-in gradients +* pdb: fix use of "seed" properties in plug_in_compat.pdb +* app, pdb: s/gimp_pdb_item_is_modifyable/gimp_pdb_item_is_modifiable/ +* pdb: add gimp-item-transform-translate procedure +* pdb: deprecated gimp-layer-translate +* pdb: make all item-transform procedures honor the "linked" flag +* pdb: finally deprecate gimp-color-balance + +==Debugging and bug reporting== + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. +* New debug tool and infrastructure to handle WARNING and CRITICAL errors, as well as fatal errors (crashes), raising a pop-up with all version information on GIMP and its main dependencies, as well as the error message and backtraces, and encouraging people to make bug reports. +* GIMP now attempts to backup unsaved images when it crashes. Then at next startup, it will suggest to recover the salvaged images. Image recovery is not 100% guaranteed. diff --git a/wiki/Release:2.10_changelog-20210301093442-edit.txt b/wiki/Release:2.10_changelog-20210301093442-edit.txt new file mode 100644 index 0000000..4a3f290 --- /dev/null +++ b/wiki/Release:2.10_changelog-20210301093442-edit.txt @@ -0,0 +1,460 @@ +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + +== Core == + +GIMP 2.10 uses GEGL image processing library for all operations. + +* Processing with 8-bit, 16-bit, and 32-bit per color channel precision, accessible via new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* A switch between perceptual gamma and linear light for already opened images +* Layer modes available in gamma-corrected and linear light versions now (where applicable), legacy rendering preserved for older XCF files +* Gamma, precision, and color profile selector for newly created images (GimpTemplate) +* Optional dithering during conversions between precision modes, never dither when converting to a higher bit depth, or to anything more than 16 bits +* Optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') +* Optional multi-threading available again, the default value is set to the amount of automatically discovered CPU cores, max is 64 +* Pre-initialize some babl-based pixel format conversion routines at the start-up to decrease the initial lazy initialization cost for some interactions + +== Layers, Masks, Paths, Channels == + +* Substantial rewrite of layer modes and how they are stored in XCF +* Simplistic widget for switching between legacy modes (2.8 and earlier), linear modes, gamma-corrected modes +* New LCH layer modes: Hue, Chroma, Color, and Lightness. See http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html for details +* New Pass Through mode for layer groups +* New Linear Burn, Vivid Light, Linear Light, Pin Light, Hard Mix, and Exclusion layer modes (as described on http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html) +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Configurable compositing of layers with the following modes: Auto, Source over, Source atop, Source in, Destination atop +* Support layer masks on layer groups. +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Enhance the ''Layer Attributes'' dialog to provide the single UI for: +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +* Add color tags to layers for better layers management (can be set via ''Layers'' menu, ''Layer Attributes'' dialog, and accessible via shortcuts), also available for channels and paths +* Add new clipboard implementation for entire images to copy/paste layers and layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +== Tools == + +=== New Tool: Unified Transform === + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + +=== New Tool: Warp Transform === + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + +=== New Tool: Handle Transform === + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + +=== New Tool: N-Point Deformation (experimental) === + +A new way to bend objects while preserving a natural look. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + +=== New Tool: Seamless Clone (experimental) === + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + +=== New Tool: MyPaint Brush === + +Use MyPaint brushes for painting. + +=== Updated Tool: all paint tools === + +All paint tools now display the angle (relatively to the horizontal line, centered on previously drawn position) alongside distance in status bar when straight line constraining (holding '''Shift''' when painting). + +=== Updated Tool: Smudge === + +* New ''No erase effect'' option to prevent the tool from changing alpha of pixels +* FG color can now be blended into smudged pixels, controlled by new ''Flow'' slider. With 0, there is no blending. + +Detailed information: https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting + +=== Updated Tool: Flip === + +* Add support for reflecting across guides to the Flip tool. When clicking on a guide while using the flip tool, reflect the active item across the guide, rather than around its center. +* Add "clipping" option to the Flip tool. This option behaves similarly to the other transform tool, however it's limited to "adjust" and "clip" only. Now that the flip tool can reflect across guides, this option is meaningful. + +=== Updated Tool: Blend === + +The Blend tool now features on-canvas gradient editing: adding, shifting, removing color stops, shifting midpoints and converting them to color stops, assigning colors to color stops, changing blending type for midpoints. + +New options: + +* 'Instant mode' (active before you start blending), enables support of the old workflow where you can't edit color stops before applying the gradient fill +* 'Modify active gradient', allows changing user-writable gradients directly rather than creating copies of them + +=== Updated Tool: Align === + +Now features: + +* vertical and horizontal fill modes; +* vertical offset. + +=== Updated Tool: Move === + +Now features: + +* Show relative coordinates when moving guides and sample points. + +=== Updated Tool: Text === + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +=== Updated Tool: Foreground Select === + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + +=== Updated Tool: Select by Color === + +* New ''Draw mask'' option to display future selection area with a magenta fill + +=== Updated Tool: Fuzzy Select === + +* New ''Draw mask'' option to display future selection area with a magenta fill +* New ''Diagonal neighbors'' option to select diagonally neighboring pixels + +=== Updated Tool: Free Select === + +* Closing a polygonal/free selection now doesn't confirm the selection automatically. Instead you still can tweak positions of nodes (where applicable), then press Enter or switch to another tool to confirm the selection. + +=== Updated Tool: Intelligent Scissors === + +* allow to remove the last added IScissors segment with backspace +* GIMP now checks, whether the first and the last isegments are distinct before closing the curve + +=== Updated Tool: Bucket Fill === + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +=== Updated Tool: Desaturate === + +* Turn the Desaturate tool into a normal GEGL filter +* Move "Desaturate" to Colors -> Desaturate + +=== Updated Tool: Posterize === + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +=== Updated Tool: Colorize === + +* Remove the Colorize tool and replace it by a generic filter action. + +=== Updated Tool: Color Balance === + +* Replace the color balance tool by a generic filter action + +=== Updated Tool: Hue-Saturation === + +* Remove the Hue-Saturation tool and replace it by a generic filter action. + +=== Updated Tool: Color Picker === + +* Don't snap to anything when picking colors +* Color picker tools now always draw the outline of the averaged region, not only while the mouse is being pressed +* Support arbitrary range of values regardless of the actual image color precision +* Add LAB and LCH readout to Info window + +=== Removed menu: Color Tools === + +'Image -> Tools -> Color Tools' is gone now that all color tools are basically GEGL operations with custom UI. + +=== Refactoring === + +Move on-canvas interaction code of some tools to new GimpToolWidget class and make it available to GEGL-based filters. + +== Plugins == + +* Allow plug-ins to access image data at full bit depth. +* On-canvas preview for all filters that use a GEGL operation. +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain). +* On-canvas controls for ''Spiral'' (experimental) and ''Supernova'' GEGL-based filters. +* Add a compat mode so unported plug-ins always get 8-bit data. +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure, Extract Component, Dither, RGB Clip, Waterpixels, Image Gradient, Symmetric Nearest Neighbor, Wavelet Decompose, Simple Linear Interactive Clustering, Fattal, Mantiuk, Reinhard, Stress ('''FIXME:''' CHECK the full list). +* New ''Hue-Chroma'' operation/tool. +* New file-darktable and file-rawtherapee plug-ins to load raw (digital negative) files by having them developed in darktable or RawTherapee. +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list). +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models). +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). +* Add interpreter for the GUM (GEGL UI Metadata) language. GUM is a small DSL, used in some property keys of GEGL operations to dynamically control UI attributes based on context. +* Allow plug-in inside first-level directories of plug-ins folders. GIMP doesn't search recursively, but only at the first level. If a plug-in is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). +* Allow filter actions to have hardcoded default operation settings by encoding them directly in the string attached to all filter actions. The code now supports both "gegl:some-operation" and "gegl:some-operation\n". + +== Color Management, Color Spaces and Models == + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Mark out-of-gamut colors also in the RGB and HSV color areas +* Make the screenshot plug-in color-managed +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* Add LCH channels to color selector dialog (FG/BG etc.) +* Allow decomposing/composing to/from LCH +* New ''Extract Channel'' command to extract channels in various color spaces +* Re-arrange color models in the Color dock: add a switch between HSV and LCH + +== File Access == + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* SSL/TLS support is now a mandatory dependency (HTTPS being now the web standard, and HTTP being more and more deprecated by browsers everyday) +* Improved automatic file formats recognition + +== Metadata == + +* Implement metadata handling in the core +* Add ''Image -> Metadata -> View Metadata'' dialog for viewing Exif, IPTC, and XMP info (DICOM metadata is displayed in the XMP tab) +* Add ''Image -> Metadata -> Edit Metadata'' dialog for editing IPTC (plus extensions), GPS and DICOM metadata +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings +* Defaults for saving metadata are configurable now in the ''Preferences'' dialog + +== File Format Support == + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* PSD plug-in now supports more blend modes (import/export), reads Pass Through mode for layer groups +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) +* Writing linear gamma TIFF images +* Allow exporting layers as PDF pages +* Improve the raw ('''not''' the digital negative) files plugin: +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) + +== Printing == + +* Print resolution can now be reset to defaults, new values for the same image is actually used now without reloading the image. + +== Color Palettes == + +* Selecting multiple palettes and merging them into one is possible now (''Palette > Merge Palettes...'') +* Add an automatic palette of recently used colors + +== Dockable Dialogs == + +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog +* Add LAB and LCH readout to Pointer and Sample Points dialogs +* New dashboard dockable: shows the current GEGL cache and swap sizes and CPU usage and active time, and their recent history. It has options to control the update rate and history duration of the data, and an option to warn (by raising/blinking the dialog) when the swap size approaches its limit. + +== Digital Painting == + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. +* For bitmap brushes, GIMP now caches hardness and disables dynamic change of hardness to improve painting performance. Botmap brushes also don't get clipped anymore, when hardness is less than 100. + +== Configurability and usability == + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Import'' page in the ''Preferences'' dialog to define image importing policies (promoting to 32-bit float and dithering) +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialogs +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the ''Color Management'' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the ''Interface'' page of the 'Preferences' dialog) +* Allow mouse to optionally configure tablet devices +* Allow creating shortcuts containing the Cmd key + mouse wheel events +* Default to 300ppi and 1920x1080px for new documents. +* Do not allow Alt+[0-9] shortcuts, they are typically used for display switching +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + +== Usability == + +* Enable "save-tool-options" and "save-device-status" by default, it's the expected behavior these days. +* Brightness-Contrast, Curves, Levels and Threshold are now available in "Repeat last" history. + +== General Changes == + +=== Internal Changes === + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +=== UI changes === + +* Add '''Save As''' buttons to the “Quit GIMP” dialog for every opened image +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Turn invert-perceptual, -linear and -value into normal filter actions, so they show up in recent filters, and don't need their own callbacks. +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). +* Allow to choose fill color when resizing layers and images +* Allow to zoom with middle mouse button + control + drag up/down +* Check and clean out duplicate accelerators on startup +* Toolbox buttons do not grab focus anymore, which used to break usage of the Tab key and other canvas-related shortcuts after changing tools with a pointing device click +* '''Delete Layer/Channel/Path''' are consistently the last option in respective dialogs now +* Extend the text along the tangent of the last path stroke, when the length of the path along which the text layer content is warped is shorter than the width of the text +* Allow to toggle the histogram dialog between gamma and linear +* New '''Colors -> Linear Invert''' command to provide radiometrically correct color inversion +* Optimal digit precision for length display in physical units in various widgets +* Switching between linear and perceptual (gamma-corrected) spaces in the Histogram dialog is easier now: two buttons instead of one two-way button where current state was difficult to understand. +* Shorten color channel labels in the color frame (color picker tool, sample point editor…) with conventional 1 or 2-letter abbreviations, and split coordinates on 2 lines. +* We now switch to "Huge" icons by default when the display pixel density is over 250 PPI (used to be 300 PPI). + +== Assets == + +* Modernize default list of document templates. +* Add 4x3 Landscape/Portrait, 3x2 Landscape/Portrait, 16x10, 16x9, and Square presets for the Crop tool. +* Add a basic "Pressure Size" dynamics. This is a common dynamics, for instance when you do colorization bases. This allows to control the size of the brush with pressure and always keep unified color without opacity changes. + +== Batch processing == + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: + + gimp -i -b '(with-files "*.png" (gimp-invert layer) \ + (gimp-file-save 1 image layer \ + (string-append basename ".jpg") \ + (string-append basename ".jpg") ))' + +== API Changes == + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside +* New gimp_export_exif(), gimp_export_xmp() and gimp_export_iptc() functions returning the creator choice regarding default handling for metadata export (as set in the Preferences). +* New gimp_get_pdb_status() to return the status of the last PDB call. This is needed for plug-ins which depend on other plug-ins' procedures. If for instance, a second-level plug-in is interrupted interactively, we don't want to process this as an error but as a cancellation. +* New gimp_stack_trace_available(), gimp_stack_trace_print() and gimp_stack_trace_query() for debugging. +* Use gegl:distance-transform in gimp_edit_blend() implementation making it much faster for all GRADIENT_SHAPEBURST_* gradient types. Legacy gimp:shapeburst operation has been deleted. +* New gimp_context_get_distance_metric() and gimp_context_set_distance_metric() for distance metric used in gimp_edit_blend() (and future usage). +* app, pdb: Modify gimp_channel_border() to take a style parameter +* pdb: Modify gimp-selection-border to use BORDER_STYLE_SMOOTH +* pdb, app, libgimp: rename *-paste-as-new to *-paste-as-new-image +* Add PDB API for color tags/labels (for layers/channels/paths) +* pdb, app, libgimp: change ranges for histogram and threshold to 0.0..1.0 +* app, pdb, libgimp: allow to choose the channel when thresholding +* app, pdb: use GeglDitherMethod instead of simply an integer +* Add PDB API and UI to control a layer's composite mode +* Remove the _LINEAR layer mode variants +* Add PDB API for layer blend space and compositing space +* Rename values of enum GimpConvertPaletteType and GimpConvertDitherType +* pdb: add debug group; add debug-timer-{start,end} procs +* pdb: fix input range of context-set-brush-size +* app: add gimp_edit_paste_as_new_image() and use it from GUI and PDB +* app, pdb, libgimp: make the raw image importer configurable +* app, pdb: change a lot of GIMP_LAYER_MODE_NORMAL_LEGACY to just NORMAL +* pdb: add new procedure gimp-get-default-new-layer-mode +* pdb, libgimp: rename gimp_drawable_invert() to _invert_non_linear() +* pdb, libgimp: change the gimp-drawable-invert API again +* add file-pdf-load2 PDB API. +* pdb, libgimp: add gimp-item-{get,set}-expanded() +* app, pdb: prevent custom gradient from being renamed +* add file-hgt-load new PDB call +* pdb: fail layer-remove-mask if applying a mask to a group layer +* pdb: allow adding masks to group layers in layer-add-mask +* app, pdb, libgimp, plug-ins, menus: rename layer composite modes +* app, libgimp, libgimpbase, pdb: s/GimpDistanceMetric/GeglDistanceMetric/ +* pdb, libgimp: allow to use external GType-registered enums in the PDB +* pdb: prepend GEGL enum types with GEGL_TYPE. +* app, libgimp, pdb: add "distance-metric" property to GimpPDBContext. +* pdb: add jehan_pdb_misc() and use it in the new procedures +* Rename Blend tool and provide PDB compatibility +* app: add gimp_pdb_context_get_paint_options_list() +* add drawable_edit.pdb and deprecate all non-clipboard functions in the "edit" group +* pdb: never pass bogus supersample values to gimp_drawable_gradient() +* pdb: add procedures to set the built-in gradients +* pdb: fix use of "seed" properties in plug_in_compat.pdb +* app, pdb: s/gimp_pdb_item_is_modifyable/gimp_pdb_item_is_modifiable/ +* pdb: add gimp-item-transform-translate procedure +* pdb: deprecated gimp-layer-translate +* pdb: make all item-transform procedures honor the "linked" flag +* pdb: finally deprecate gimp-color-balance + +== Debugging and bug reporting == + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. +* New debug tool and infrastructure to handle WARNING and CRITICAL errors, as well as fatal errors (crashes), raising a pop-up with all version information on GIMP and its main dependencies, as well as the error message and backtraces, and encouraging people to make bug reports. +* GIMP now attempts to backup unsaved images when it crashes. Then at next startup, it will suggest to recover the salvaged images. Image recovery is not 100% guaranteed. diff --git a/wiki/Release:2.10_changelog-20210511062716-edit.txt b/wiki/Release:2.10_changelog-20210511062716-edit.txt new file mode 100644 index 0000000..4a3f290 --- /dev/null +++ b/wiki/Release:2.10_changelog-20210511062716-edit.txt @@ -0,0 +1,460 @@ +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + +== Core == + +GIMP 2.10 uses GEGL image processing library for all operations. + +* Processing with 8-bit, 16-bit, and 32-bit per color channel precision, accessible via new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* A switch between perceptual gamma and linear light for already opened images +* Layer modes available in gamma-corrected and linear light versions now (where applicable), legacy rendering preserved for older XCF files +* Gamma, precision, and color profile selector for newly created images (GimpTemplate) +* Optional dithering during conversions between precision modes, never dither when converting to a higher bit depth, or to anything more than 16 bits +* Optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') +* Optional multi-threading available again, the default value is set to the amount of automatically discovered CPU cores, max is 64 +* Pre-initialize some babl-based pixel format conversion routines at the start-up to decrease the initial lazy initialization cost for some interactions + +== Layers, Masks, Paths, Channels == + +* Substantial rewrite of layer modes and how they are stored in XCF +* Simplistic widget for switching between legacy modes (2.8 and earlier), linear modes, gamma-corrected modes +* New LCH layer modes: Hue, Chroma, Color, and Lightness. See http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html for details +* New Pass Through mode for layer groups +* New Linear Burn, Vivid Light, Linear Light, Pin Light, Hard Mix, and Exclusion layer modes (as described on http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html) +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Configurable compositing of layers with the following modes: Auto, Source over, Source atop, Source in, Destination atop +* Support layer masks on layer groups. +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Enhance the ''Layer Attributes'' dialog to provide the single UI for: +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +* Add color tags to layers for better layers management (can be set via ''Layers'' menu, ''Layer Attributes'' dialog, and accessible via shortcuts), also available for channels and paths +* Add new clipboard implementation for entire images to copy/paste layers and layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +== Tools == + +=== New Tool: Unified Transform === + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + +=== New Tool: Warp Transform === + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + +=== New Tool: Handle Transform === + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + +=== New Tool: N-Point Deformation (experimental) === + +A new way to bend objects while preserving a natural look. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + +=== New Tool: Seamless Clone (experimental) === + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + +=== New Tool: MyPaint Brush === + +Use MyPaint brushes for painting. + +=== Updated Tool: all paint tools === + +All paint tools now display the angle (relatively to the horizontal line, centered on previously drawn position) alongside distance in status bar when straight line constraining (holding '''Shift''' when painting). + +=== Updated Tool: Smudge === + +* New ''No erase effect'' option to prevent the tool from changing alpha of pixels +* FG color can now be blended into smudged pixels, controlled by new ''Flow'' slider. With 0, there is no blending. + +Detailed information: https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting + +=== Updated Tool: Flip === + +* Add support for reflecting across guides to the Flip tool. When clicking on a guide while using the flip tool, reflect the active item across the guide, rather than around its center. +* Add "clipping" option to the Flip tool. This option behaves similarly to the other transform tool, however it's limited to "adjust" and "clip" only. Now that the flip tool can reflect across guides, this option is meaningful. + +=== Updated Tool: Blend === + +The Blend tool now features on-canvas gradient editing: adding, shifting, removing color stops, shifting midpoints and converting them to color stops, assigning colors to color stops, changing blending type for midpoints. + +New options: + +* 'Instant mode' (active before you start blending), enables support of the old workflow where you can't edit color stops before applying the gradient fill +* 'Modify active gradient', allows changing user-writable gradients directly rather than creating copies of them + +=== Updated Tool: Align === + +Now features: + +* vertical and horizontal fill modes; +* vertical offset. + +=== Updated Tool: Move === + +Now features: + +* Show relative coordinates when moving guides and sample points. + +=== Updated Tool: Text === + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +=== Updated Tool: Foreground Select === + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + +=== Updated Tool: Select by Color === + +* New ''Draw mask'' option to display future selection area with a magenta fill + +=== Updated Tool: Fuzzy Select === + +* New ''Draw mask'' option to display future selection area with a magenta fill +* New ''Diagonal neighbors'' option to select diagonally neighboring pixels + +=== Updated Tool: Free Select === + +* Closing a polygonal/free selection now doesn't confirm the selection automatically. Instead you still can tweak positions of nodes (where applicable), then press Enter or switch to another tool to confirm the selection. + +=== Updated Tool: Intelligent Scissors === + +* allow to remove the last added IScissors segment with backspace +* GIMP now checks, whether the first and the last isegments are distinct before closing the curve + +=== Updated Tool: Bucket Fill === + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +=== Updated Tool: Desaturate === + +* Turn the Desaturate tool into a normal GEGL filter +* Move "Desaturate" to Colors -> Desaturate + +=== Updated Tool: Posterize === + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +=== Updated Tool: Colorize === + +* Remove the Colorize tool and replace it by a generic filter action. + +=== Updated Tool: Color Balance === + +* Replace the color balance tool by a generic filter action + +=== Updated Tool: Hue-Saturation === + +* Remove the Hue-Saturation tool and replace it by a generic filter action. + +=== Updated Tool: Color Picker === + +* Don't snap to anything when picking colors +* Color picker tools now always draw the outline of the averaged region, not only while the mouse is being pressed +* Support arbitrary range of values regardless of the actual image color precision +* Add LAB and LCH readout to Info window + +=== Removed menu: Color Tools === + +'Image -> Tools -> Color Tools' is gone now that all color tools are basically GEGL operations with custom UI. + +=== Refactoring === + +Move on-canvas interaction code of some tools to new GimpToolWidget class and make it available to GEGL-based filters. + +== Plugins == + +* Allow plug-ins to access image data at full bit depth. +* On-canvas preview for all filters that use a GEGL operation. +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain). +* On-canvas controls for ''Spiral'' (experimental) and ''Supernova'' GEGL-based filters. +* Add a compat mode so unported plug-ins always get 8-bit data. +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure, Extract Component, Dither, RGB Clip, Waterpixels, Image Gradient, Symmetric Nearest Neighbor, Wavelet Decompose, Simple Linear Interactive Clustering, Fattal, Mantiuk, Reinhard, Stress ('''FIXME:''' CHECK the full list). +* New ''Hue-Chroma'' operation/tool. +* New file-darktable and file-rawtherapee plug-ins to load raw (digital negative) files by having them developed in darktable or RawTherapee. +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list). +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models). +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). +* Add interpreter for the GUM (GEGL UI Metadata) language. GUM is a small DSL, used in some property keys of GEGL operations to dynamically control UI attributes based on context. +* Allow plug-in inside first-level directories of plug-ins folders. GIMP doesn't search recursively, but only at the first level. If a plug-in is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). +* Allow filter actions to have hardcoded default operation settings by encoding them directly in the string attached to all filter actions. The code now supports both "gegl:some-operation" and "gegl:some-operation\n". + +== Color Management, Color Spaces and Models == + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Mark out-of-gamut colors also in the RGB and HSV color areas +* Make the screenshot plug-in color-managed +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* Add LCH channels to color selector dialog (FG/BG etc.) +* Allow decomposing/composing to/from LCH +* New ''Extract Channel'' command to extract channels in various color spaces +* Re-arrange color models in the Color dock: add a switch between HSV and LCH + +== File Access == + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* SSL/TLS support is now a mandatory dependency (HTTPS being now the web standard, and HTTP being more and more deprecated by browsers everyday) +* Improved automatic file formats recognition + +== Metadata == + +* Implement metadata handling in the core +* Add ''Image -> Metadata -> View Metadata'' dialog for viewing Exif, IPTC, and XMP info (DICOM metadata is displayed in the XMP tab) +* Add ''Image -> Metadata -> Edit Metadata'' dialog for editing IPTC (plus extensions), GPS and DICOM metadata +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings +* Defaults for saving metadata are configurable now in the ''Preferences'' dialog + +== File Format Support == + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* PSD plug-in now supports more blend modes (import/export), reads Pass Through mode for layer groups +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) +* Writing linear gamma TIFF images +* Allow exporting layers as PDF pages +* Improve the raw ('''not''' the digital negative) files plugin: +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) + +== Printing == + +* Print resolution can now be reset to defaults, new values for the same image is actually used now without reloading the image. + +== Color Palettes == + +* Selecting multiple palettes and merging them into one is possible now (''Palette > Merge Palettes...'') +* Add an automatic palette of recently used colors + +== Dockable Dialogs == + +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog +* Add LAB and LCH readout to Pointer and Sample Points dialogs +* New dashboard dockable: shows the current GEGL cache and swap sizes and CPU usage and active time, and their recent history. It has options to control the update rate and history duration of the data, and an option to warn (by raising/blinking the dialog) when the swap size approaches its limit. + +== Digital Painting == + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. +* For bitmap brushes, GIMP now caches hardness and disables dynamic change of hardness to improve painting performance. Botmap brushes also don't get clipped anymore, when hardness is less than 100. + +== Configurability and usability == + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Import'' page in the ''Preferences'' dialog to define image importing policies (promoting to 32-bit float and dithering) +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialogs +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the ''Color Management'' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the ''Interface'' page of the 'Preferences' dialog) +* Allow mouse to optionally configure tablet devices +* Allow creating shortcuts containing the Cmd key + mouse wheel events +* Default to 300ppi and 1920x1080px for new documents. +* Do not allow Alt+[0-9] shortcuts, they are typically used for display switching +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + +== Usability == + +* Enable "save-tool-options" and "save-device-status" by default, it's the expected behavior these days. +* Brightness-Contrast, Curves, Levels and Threshold are now available in "Repeat last" history. + +== General Changes == + +=== Internal Changes === + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +=== UI changes === + +* Add '''Save As''' buttons to the “Quit GIMP” dialog for every opened image +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Turn invert-perceptual, -linear and -value into normal filter actions, so they show up in recent filters, and don't need their own callbacks. +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). +* Allow to choose fill color when resizing layers and images +* Allow to zoom with middle mouse button + control + drag up/down +* Check and clean out duplicate accelerators on startup +* Toolbox buttons do not grab focus anymore, which used to break usage of the Tab key and other canvas-related shortcuts after changing tools with a pointing device click +* '''Delete Layer/Channel/Path''' are consistently the last option in respective dialogs now +* Extend the text along the tangent of the last path stroke, when the length of the path along which the text layer content is warped is shorter than the width of the text +* Allow to toggle the histogram dialog between gamma and linear +* New '''Colors -> Linear Invert''' command to provide radiometrically correct color inversion +* Optimal digit precision for length display in physical units in various widgets +* Switching between linear and perceptual (gamma-corrected) spaces in the Histogram dialog is easier now: two buttons instead of one two-way button where current state was difficult to understand. +* Shorten color channel labels in the color frame (color picker tool, sample point editor…) with conventional 1 or 2-letter abbreviations, and split coordinates on 2 lines. +* We now switch to "Huge" icons by default when the display pixel density is over 250 PPI (used to be 300 PPI). + +== Assets == + +* Modernize default list of document templates. +* Add 4x3 Landscape/Portrait, 3x2 Landscape/Portrait, 16x10, 16x9, and Square presets for the Crop tool. +* Add a basic "Pressure Size" dynamics. This is a common dynamics, for instance when you do colorization bases. This allows to control the size of the brush with pressure and always keep unified color without opacity changes. + +== Batch processing == + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: + + gimp -i -b '(with-files "*.png" (gimp-invert layer) \ + (gimp-file-save 1 image layer \ + (string-append basename ".jpg") \ + (string-append basename ".jpg") ))' + +== API Changes == + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside +* New gimp_export_exif(), gimp_export_xmp() and gimp_export_iptc() functions returning the creator choice regarding default handling for metadata export (as set in the Preferences). +* New gimp_get_pdb_status() to return the status of the last PDB call. This is needed for plug-ins which depend on other plug-ins' procedures. If for instance, a second-level plug-in is interrupted interactively, we don't want to process this as an error but as a cancellation. +* New gimp_stack_trace_available(), gimp_stack_trace_print() and gimp_stack_trace_query() for debugging. +* Use gegl:distance-transform in gimp_edit_blend() implementation making it much faster for all GRADIENT_SHAPEBURST_* gradient types. Legacy gimp:shapeburst operation has been deleted. +* New gimp_context_get_distance_metric() and gimp_context_set_distance_metric() for distance metric used in gimp_edit_blend() (and future usage). +* app, pdb: Modify gimp_channel_border() to take a style parameter +* pdb: Modify gimp-selection-border to use BORDER_STYLE_SMOOTH +* pdb, app, libgimp: rename *-paste-as-new to *-paste-as-new-image +* Add PDB API for color tags/labels (for layers/channels/paths) +* pdb, app, libgimp: change ranges for histogram and threshold to 0.0..1.0 +* app, pdb, libgimp: allow to choose the channel when thresholding +* app, pdb: use GeglDitherMethod instead of simply an integer +* Add PDB API and UI to control a layer's composite mode +* Remove the _LINEAR layer mode variants +* Add PDB API for layer blend space and compositing space +* Rename values of enum GimpConvertPaletteType and GimpConvertDitherType +* pdb: add debug group; add debug-timer-{start,end} procs +* pdb: fix input range of context-set-brush-size +* app: add gimp_edit_paste_as_new_image() and use it from GUI and PDB +* app, pdb, libgimp: make the raw image importer configurable +* app, pdb: change a lot of GIMP_LAYER_MODE_NORMAL_LEGACY to just NORMAL +* pdb: add new procedure gimp-get-default-new-layer-mode +* pdb, libgimp: rename gimp_drawable_invert() to _invert_non_linear() +* pdb, libgimp: change the gimp-drawable-invert API again +* add file-pdf-load2 PDB API. +* pdb, libgimp: add gimp-item-{get,set}-expanded() +* app, pdb: prevent custom gradient from being renamed +* add file-hgt-load new PDB call +* pdb: fail layer-remove-mask if applying a mask to a group layer +* pdb: allow adding masks to group layers in layer-add-mask +* app, pdb, libgimp, plug-ins, menus: rename layer composite modes +* app, libgimp, libgimpbase, pdb: s/GimpDistanceMetric/GeglDistanceMetric/ +* pdb, libgimp: allow to use external GType-registered enums in the PDB +* pdb: prepend GEGL enum types with GEGL_TYPE. +* app, libgimp, pdb: add "distance-metric" property to GimpPDBContext. +* pdb: add jehan_pdb_misc() and use it in the new procedures +* Rename Blend tool and provide PDB compatibility +* app: add gimp_pdb_context_get_paint_options_list() +* add drawable_edit.pdb and deprecate all non-clipboard functions in the "edit" group +* pdb: never pass bogus supersample values to gimp_drawable_gradient() +* pdb: add procedures to set the built-in gradients +* pdb: fix use of "seed" properties in plug_in_compat.pdb +* app, pdb: s/gimp_pdb_item_is_modifyable/gimp_pdb_item_is_modifiable/ +* pdb: add gimp-item-transform-translate procedure +* pdb: deprecated gimp-layer-translate +* pdb: make all item-transform procedures honor the "linked" flag +* pdb: finally deprecate gimp-color-balance + +== Debugging and bug reporting == + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. +* New debug tool and infrastructure to handle WARNING and CRITICAL errors, as well as fatal errors (crashes), raising a pop-up with all version information on GIMP and its main dependencies, as well as the error message and backtraces, and encouraging people to make bug reports. +* GIMP now attempts to backup unsaved images when it crashes. Then at next startup, it will suggest to recover the salvaged images. Image recovery is not 100% guaranteed. diff --git a/wiki/Release:2.10_changelog-20220401181910-show.txt b/wiki/Release:2.10_changelog-20220401181910-show.txt new file mode 100644 index 0000000..68d2bae --- /dev/null +++ b/wiki/Release:2.10_changelog-20220401181910-show.txt @@ -0,0 +1,525 @@ + + +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + + +__TOC__ + +==Core== + +GIMP 2.10 uses GEGL image processing library for all operations. + + +* Processing with 8-bit, 16-bit, and 32-bit per color channel precision, accessible via new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* A switch between perceptual gamma and linear light for already opened images +* Layer modes available in gamma-corrected and linear light versions now (where applicable), legacy rendering preserved for older XCF files +* Gamma, precision, and color profile selector for newly created images (GimpTemplate) +* Optional dithering during conversions between precision modes, never dither when converting to a higher bit depth, or to anything more than 16 bits +* Optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') +* Optional multi-threading available again, the default value is set to the amount of automatically discovered CPU cores, max is 64 +* Pre-initialize some babl-based pixel format conversion routines at the start-up to decrease the initial lazy initialization cost for some interactions + +==Layers, Masks, Paths, Channels== + +* Substantial rewrite of layer modes and how they are stored in XCF +* Simplistic widget for switching between legacy modes (2.8 and earlier), linear modes, gamma-corrected modes +* New LCH layer modes: Hue, Chroma, Color, and Lightness. See [http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html] for details +* New Pass Through mode for layer groups +* New Linear Burn, Vivid Light, Linear Light, Pin Light, Hard Mix, and Exclusion layer modes (as described on [http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html]) +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Configurable compositing of layers with the following modes: Auto, Source over, Source atop, Source in, Destination atop +* Support layer masks on layer groups. +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Enhance the ''Layer Attributes'' dialog to provide the single UI for: +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +* setting layer's name +* changing blending mode and opacity +* setting offset in X/Y +* toggling visibility, link status, various locks +* Add color tags to layers for better layers management (can be set via ''Layers'' menu, ''Layer Attributes'' dialog, and accessible via shortcuts), also available for channels and paths +* Add new clipboard implementation for entire images to copy/paste layers and layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +==Tools== + +===New Tool: Unified Transform=== + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + + +===New Tool: Warp Transform=== + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + + +===New Tool: Handle Transform=== + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + + +===New Tool: N-Point Deformation (experimental)=== + +A new way to bend objects while preserving a natural look. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + + +===New Tool: Seamless Clone (experimental)=== + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + + +===New Tool: MyPaint Brush=== + +Use MyPaint brushes for painting. + + +===Updated Tool: all paint tools=== + +All paint tools now display the angle (relatively to the horizontal line, centered on previously drawn position) alongside distance in status bar when straight line constraining (holding '''Shift''' when painting). + + +===Updated Tool: Smudge=== + +* New ''No erase effect'' option to prevent the tool from changing alpha of pixels +* FG color can now be blended into smudged pixels, controlled by new ''Flow'' slider. With 0, there is no blending. + +Detailed information: [https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting] + + +===Updated Tool: Flip=== + +* Add support for reflecting across guides to the Flip tool. When clicking on a guide while using the flip tool, reflect the active item across the guide, rather than around its center. +* Add "clipping" option to the Flip tool. This option behaves similarly to the other transform tool, however it's limited to "adjust" and "clip" only. Now that the flip tool can reflect across guides, this option is meaningful. + +===Updated Tool: Blend=== + +The Blend tool now features on-canvas gradient editing: adding, shifting, removing color stops, shifting midpoints and converting them to color stops, assigning colors to color stops, changing blending type for midpoints. + +New options: + + +* 'Instant mode' (active before you start blending), enables support of the old workflow where you can't edit color stops before applying the gradient fill +* 'Modify active gradient', allows changing user-writable gradients directly rather than creating copies of them + +===Updated Tool: Align=== + +Now features: + + +* vertical and horizontal fill modes; +* vertical offset. + +===Updated Tool: Move=== + +Now features: + + +* Show relative coordinates when moving guides and sample points. + +===Updated Tool: Text=== + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +===Updated Tool: Foreground Select=== + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + + +===Updated Tool: Select by Color=== + +* New ''Draw mask'' option to display future selection area with a magenta fill + +===Updated Tool: Fuzzy Select=== + +* New ''Draw mask'' option to display future selection area with a magenta fill +* New ''Diagonal neighbors'' option to select diagonally neighboring pixels + +===Updated Tool: Free Select=== + +* Closing a polygonal/free selection now doesn't confirm the selection automatically. Instead you still can tweak positions of nodes (where applicable), then press Enter or switch to another tool to confirm the selection. + +===Updated Tool: Intelligent Scissors=== + +* allow to remove the last added IScissors segment with backspace +* GIMP now checks, whether the first and the last isegments are distinct before closing the curve + +===Updated Tool: Bucket Fill=== + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +===Updated Tool: Desaturate=== + +* Turn the Desaturate tool into a normal GEGL filter +* Move "Desaturate" to Colors -> Desaturate + +===Updated Tool: Posterize=== + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +===Updated Tool: Colorize=== + +* Remove the Colorize tool and replace it by a generic filter action. + +===Updated Tool: Color Balance=== + +* Replace the color balance tool by a generic filter action + +===Updated Tool: Hue-Saturation=== + +* Remove the Hue-Saturation tool and replace it by a generic filter action. + +===Updated Tool: Color Picker=== + +* Don't snap to anything when picking colors +* Color picker tools now always draw the outline of the averaged region, not only while the mouse is being pressed +* Support arbitrary range of values regardless of the actual image color precision +* Add LAB and LCH readout to Info window + +===Removed menu: Color Tools=== + +'Image -> Tools -> Color Tools' is gone now that all color tools are basically GEGL operations with custom UI. + + +===Refactoring=== + +Move on-canvas interaction code of some tools to new GimpToolWidget class and make it available to GEGL-based filters. + + +==Plugins== + +* Allow plug-ins to access image data at full bit depth. +* On-canvas preview for all filters that use a GEGL operation. +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain). +* On-canvas controls for ''Spiral'' (experimental) and ''Supernova'' GEGL-based filters. +* Add a compat mode so unported plug-ins always get 8-bit data. +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure, Extract Component, Dither, RGB Clip, Waterpixels, Image Gradient, Symmetric Nearest Neighbor, Wavelet Decompose, Simple Linear Interactive Clustering, Fattal, Mantiuk, Reinhard, Stress ('''FIXME:''' CHECK the full list). +* New ''Hue-Chroma'' operation/tool. +* New file-darktable and file-rawtherapee plug-ins to load raw (digital negative) files by having them developed in darktable or RawTherapee. +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list). +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models). +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). +* Add interpreter for the GUM (GEGL UI Metadata) language. GUM is a small DSL, used in some property keys of GEGL operations to dynamically control UI attributes based on context. +* Allow plug-in inside first-level directories of plug-ins folders. GIMP doesn't search recursively, but only at the first level. If a plug-in is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). +* Allow filter actions to have hardcoded default operation settings by encoding them directly in the string attached to all filter actions. The code now supports both "gegl:some-operation" and "gegl:some-operation\n". + + +==Color Management, Color Spaces and Models== + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Mark out-of-gamut colors also in the RGB and HSV color areas +* Make the screenshot plug-in color-managed +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* layer/image/color palette/gradient/pattern previews, +* Color Picker tool, +* GimpColorHistory, +* GimpFgBgEditor, +* GimpColorFrame (Mouse Pointer dialog), +* color selectors, +* script-fu color buttons, +* DND widget, +* painting tools, +* copying layers/paste buffer between images +* Add LCH channels to color selector dialog (FG/BG etc.) +* Allow decomposing/composing to/from LCH +* New ''Extract Channel'' command to extract channels in various color spaces +* Re-arrange color models in the Color dock: add a switch between HSV and LCH + +==File Access== + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* SSL/TLS support is now a mandatory dependency (HTTPS being now the web standard, and HTTP being more and more deprecated by browsers everyday) +* Improved automatic file formats recognition + +==Metadata== + +* Implement metadata handling in the core +* Add ''Image -> Metadata -> View Metadata'' dialog for viewing Exif, IPTC, and XMP info (DICOM metadata is displayed in the XMP tab) +* Add ''Image -> Metadata -> Edit Metadata'' dialog for editing IPTC (plus extensions), GPS and DICOM metadata +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings +* Defaults for saving metadata are configurable now in the ''Preferences'' dialog + +==File Format Support== + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* PSD plug-in now supports more blend modes (import/export), reads Pass Through mode for layer groups +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) +* Writing linear gamma TIFF images +* Allow exporting layers as PDF pages +* Improve the raw ('''not''' the digital negative) files plugin: +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) +* Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +* Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +* Use GtkBuilder to construct the export dialog (similar to PNG plugin) +* Make the plugin remember last used export settings (similar to PNG plugin) +* Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +* Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) + +==Printing== + +* Print resolution can now be reset to defaults, new values for the same image is actually used now without reloading the image. + +==Color Palettes== + +* Selecting multiple palettes and merging them into one is possible now (''Palette > Merge Palettes...'') +* Add an automatic palette of recently used colors + +==Dockable Dialogs== + +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog +* Add LAB and LCH readout to Pointer and Sample Points dialogs +* New dashboard dockable: shows the current GEGL cache and swap sizes and CPU usage and active time, and their recent history. It has options to control the update rate and history duration of the data, and an option to warn (by raising/blinking the dialog) when the swap size approaches its limit. + +==Digital Painting== + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. +* For bitmap brushes, GIMP now caches hardness and disables dynamic change of hardness to improve painting performance. Botmap brushes also don't get clipped anymore, when hardness is less than 100. + +==Configurability and usability== + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Import'' page in the ''Preferences'' dialog to define image importing policies (promoting to 32-bit float and dithering) +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialogs +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the ''Color Management'' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the ''Interface'' page of the 'Preferences' dialog) +* Allow mouse to optionally configure tablet devices +* Allow creating shortcuts containing the Cmd key + mouse wheel events +* Default to 300ppi and 1920x1080px for new documents. +* Do not allow Alt+[0-9] shortcuts, they are typically used for display switching +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} + +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} + +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + + + +==Usability== + +* Enable "save-tool-options" and "save-device-status" by default, it's the expected behavior these days. +* Brightness-Contrast, Curves, Levels and Threshold are now available in "Repeat last" history. + +==General Changes== + +===Internal Changes=== + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +===UI changes=== + +* Add '''Save As''' buttons to the “Quit GIMP” dialog for every opened image +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Turn invert-perceptual, -linear and -value into normal filter actions, so they show up in recent filters, and don't need their own callbacks. +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). +* Allow to choose fill color when resizing layers and images +* Allow to zoom with middle mouse button + control + drag up/down +* Check and clean out duplicate accelerators on startup +* Toolbox buttons do not grab focus anymore, which used to break usage of the Tab key and other canvas-related shortcuts after changing tools with a pointing device click +* '''Delete Layer/Channel/Path''' are consistently the last option in respective dialogs now +* Extend the text along the tangent of the last path stroke, when the length of the path along which the text layer content is warped is shorter than the width of the text +* Allow to toggle the histogram dialog between gamma and linear +* New '''Colors -> Linear Invert''' command to provide radiometrically correct color inversion +* Optimal digit precision for length display in physical units in various widgets +* Switching between linear and perceptual (gamma-corrected) spaces in the Histogram dialog is easier now: two buttons instead of one two-way button where current state was difficult to understand. +* Shorten color channel labels in the color frame (color picker tool, sample point editor…) with conventional 1 or 2-letter abbreviations, and split coordinates on 2 lines. +* We now switch to "Huge" icons by default when the display pixel density is over 250 PPI (used to be 300 PPI). + +==Assets== + +* Modernize default list of document templates. +* Add 4x3 Landscape/Portrait, 3x2 Landscape/Portrait, 16x10, 16x9, and Square presets for the Crop tool. +* Add a basic "Pressure Size" dynamics. This is a common dynamics, for instance when you do colorization bases. This allows to control the size of the brush with pressure and always keep unified color without opacity changes. + +==Batch processing== + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: +
    gimp -i -b '(with-files "*.png" (gimp-invert layer) \
    +             (gimp-file-save 1 image layer \
    +             (string-append basename ".jpg") \
    +             (string-append basename ".jpg") ))'
    +
    + +==API Changes== + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside +* New gimp_export_exif(), gimp_export_xmp() and gimp_export_iptc() functions returning the creator choice regarding default handling for metadata export (as set in the Preferences). +* New gimp_get_pdb_status() to return the status of the last PDB call. This is needed for plug-ins which depend on other plug-ins' procedures. If for instance, a second-level plug-in is interrupted interactively, we don't want to process this as an error but as a cancellation. +* New gimp_stack_trace_available(), gimp_stack_trace_print() and gimp_stack_trace_query() for debugging. +* Use gegl:distance-transform in gimp_edit_blend() implementation making it much faster for all GRADIENT_SHAPEBURST_* gradient types. Legacy gimp:shapeburst operation has been deleted. +* New gimp_context_get_distance_metric() and gimp_context_set_distance_metric() for distance metric used in gimp_edit_blend() (and future usage). +* app, pdb: Modify gimp_channel_border() to take a style parameter +* pdb: Modify gimp-selection-border to use BORDER_STYLE_SMOOTH +* pdb, app, libgimp: rename *-paste-as-new to *-paste-as-new-image +* Add PDB API for color tags/labels (for layers/channels/paths) +* pdb, app, libgimp: change ranges for histogram and threshold to 0.0..1.0 +* app, pdb, libgimp: allow to choose the channel when thresholding +* app, pdb: use GeglDitherMethod instead of simply an integer +* Add PDB API and UI to control a layer's composite mode +* Remove the _LINEAR layer mode variants +* Add PDB API for layer blend space and compositing space +* Rename values of enum GimpConvertPaletteType and GimpConvertDitherType +* pdb: add debug group; add debug-timer-{start,end} procs +* pdb: fix input range of context-set-brush-size +* app: add gimp_edit_paste_as_new_image() and use it from GUI and PDB +* app, pdb, libgimp: make the raw image importer configurable +* app, pdb: change a lot of GIMP_LAYER_MODE_NORMAL_LEGACY to just NORMAL +* pdb: add new procedure gimp-get-default-new-layer-mode +* pdb, libgimp: rename gimp_drawable_invert() to _invert_non_linear() +* pdb, libgimp: change the gimp-drawable-invert API again +* add file-pdf-load2 PDB API. +* pdb, libgimp: add gimp-item-{get,set}-expanded() +* app, pdb: prevent custom gradient from being renamed +* add file-hgt-load new PDB call +* pdb: fail layer-remove-mask if applying a mask to a group layer +* pdb: allow adding masks to group layers in layer-add-mask +* app, pdb, libgimp, plug-ins, menus: rename layer composite modes +* app, libgimp, libgimpbase, pdb: s/GimpDistanceMetric/GeglDistanceMetric/ +* pdb, libgimp: allow to use external GType-registered enums in the PDB +* pdb: prepend GEGL enum types with GEGL_TYPE. +* app, libgimp, pdb: add "distance-metric" property to GimpPDBContext. +* pdb: add jehan_pdb_misc() and use it in the new procedures +* Rename Blend tool and provide PDB compatibility +* app: add gimp_pdb_context_get_paint_options_list() +* add drawable_edit.pdb and deprecate all non-clipboard functions in the "edit" group +* pdb: never pass bogus supersample values to gimp_drawable_gradient() +* pdb: add procedures to set the built-in gradients +* pdb: fix use of "seed" properties in plug_in_compat.pdb +* app, pdb: s/gimp_pdb_item_is_modifyable/gimp_pdb_item_is_modifiable/ +* pdb: add gimp-item-transform-translate procedure +* pdb: deprecated gimp-layer-translate +* pdb: make all item-transform procedures honor the "linked" flag +* pdb: finally deprecate gimp-color-balance + +==Debugging and bug reporting== + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. +* New debug tool and infrastructure to handle WARNING and CRITICAL errors, as well as fatal errors (crashes), raising a pop-up with all version information on GIMP and its main dependencies, as well as the error message and backtraces, and encouraging people to make bug reports. +* GIMP now attempts to backup unsaved images when it crashes. Then at next startup, it will suggest to recover the salvaged images. Image recovery is not 100% guaranteed. diff --git a/wiki/Release:2.10_changelog-20220426085359-show.txt b/wiki/Release:2.10_changelog-20220426085359-show.txt new file mode 100644 index 0000000..68d2bae --- /dev/null +++ b/wiki/Release:2.10_changelog-20220426085359-show.txt @@ -0,0 +1,525 @@ + + +This page should aid documentation authors in updating the user manual for the upcoming 2.10 release. + +The changes listed here are being filed as bug reports. We encourage you to contribute new docs and updates. For the list of reports please [https://bugzilla.gnome.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&list_id=137895&product=GIMP-manual&version=2.10 visit the bugzilla]. + + +__TOC__ + +==Core== + +GIMP 2.10 uses GEGL image processing library for all operations. + + +* Processing with 8-bit, 16-bit, and 32-bit per color channel precision, accessible via new ''Image -> Precision'' submenu +* 'Precision' option in the 'New Image' dialog +* A switch between perceptual gamma and linear light for already opened images +* Layer modes available in gamma-corrected and linear light versions now (where applicable), legacy rendering preserved for older XCF files +* Gamma, precision, and color profile selector for newly created images (GimpTemplate) +* Optional dithering during conversions between precision modes, never dither when converting to a higher bit depth, or to anything more than 16 bits +* Optional experimental hardware-accelerated rendering and processing via OpenCL (see ''Edit -> Preferences -> System Resources'') +* Optional multi-threading available again, the default value is set to the amount of automatically discovered CPU cores, max is 64 +* Pre-initialize some babl-based pixel format conversion routines at the start-up to decrease the initial lazy initialization cost for some interactions + +==Layers, Masks, Paths, Channels== + +* Substantial rewrite of layer modes and how they are stored in XCF +* Simplistic widget for switching between legacy modes (2.8 and earlier), linear modes, gamma-corrected modes +* New LCH layer modes: Hue, Chroma, Color, and Lightness. See [http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html http://ninedegreesbelow.com/photography/gimp-lch-blend-modes.html] for details +* New Pass Through mode for layer groups +* New Linear Burn, Vivid Light, Linear Light, Pin Light, Hard Mix, and Exclusion layer modes (as described on [http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html]) +* Overlay mode is not identical to Soft Light mode anymore and finally relies on a widely used formula from both PDF specification, as well as W3C’s “Compositing and Blending Level 1” spec +* Configurable compositing of layers with the following modes: Auto, Source over, Source atop, Source in, Destination atop +* Support layer masks on layer groups. +* Add content locking to items to prevent them from being edited +* Add position locking to items to prevent them from being translated +* Enhance the ''Layer Attributes'' dialog to provide the single UI for: +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +** setting layer's name +** changing blending mode and opacity +** setting offset in X/Y +** toggling visibility, link status, various locks +* setting layer's name +* changing blending mode and opacity +* setting offset in X/Y +* toggling visibility, link status, various locks +* Add color tags to layers for better layers management (can be set via ''Layers'' menu, ''Layer Attributes'' dialog, and accessible via shortcuts), also available for channels and paths +* Add new clipboard implementation for entire images to copy/paste layers and layer groups +* Always paste layers as new layers, not floating selections; always paste new layers on top of the active layer +* Add/Remove layer masks by clicking the layer preview +* Remember the added mask's type and the invert boolean +* Add a button to the layers dialog which supports add, add with last values, delete, apply masks +* Add modifier-click shortcuts on the layer preview with the same modifiers as on the button + +==Tools== + +===New Tool: Unified Transform=== + +Combines rotation, scaling, skewing, and adjusting perspective in a single tool. + + +===New Tool: Warp Transform=== + +Replaces the old iWarp plugin and provides its features in a tool that works directly on images, without a preview window. + + +===New Tool: Handle Transform=== + +Apply scaling, rotating, and perspective correction using handles placed on the canvas. + + +===New Tool: N-Point Deformation (experimental)=== + +A new way to bend objects while preserving a natural look. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + + +===New Tool: Seamless Clone (experimental)=== + +Simplifies merging one image into another by adjusting brightness and colors of the pasted image to match the look of the image it is pasted to. + +This tool is incomplete and unavailable by default. You need to run GIMP with '''--show-playground''' and then enable it in ''Preferences > Playground''. + + +===New Tool: MyPaint Brush=== + +Use MyPaint brushes for painting. + + +===Updated Tool: all paint tools=== + +All paint tools now display the angle (relatively to the horizontal line, centered on previously drawn position) alongside distance in status bar when straight line constraining (holding '''Shift''' when painting). + + +===Updated Tool: Smudge=== + +* New ''No erase effect'' option to prevent the tool from changing alpha of pixels +* FG color can now be blended into smudged pixels, controlled by new ''Flow'' slider. With 0, there is no blending. + +Detailed information: [https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting https://www.gimp-forum.net/Thread-Customized-smudge-tool-Smudge-with-painting] + + +===Updated Tool: Flip=== + +* Add support for reflecting across guides to the Flip tool. When clicking on a guide while using the flip tool, reflect the active item across the guide, rather than around its center. +* Add "clipping" option to the Flip tool. This option behaves similarly to the other transform tool, however it's limited to "adjust" and "clip" only. Now that the flip tool can reflect across guides, this option is meaningful. + +===Updated Tool: Blend=== + +The Blend tool now features on-canvas gradient editing: adding, shifting, removing color stops, shifting midpoints and converting them to color stops, assigning colors to color stops, changing blending type for midpoints. + +New options: + + +* 'Instant mode' (active before you start blending), enables support of the old workflow where you can't edit color stops before applying the gradient fill +* 'Modify active gradient', allows changing user-writable gradients directly rather than creating copies of them + +===Updated Tool: Align=== + +Now features: + + +* vertical and horizontal fill modes; +* vertical offset. + +===Updated Tool: Move=== + +Now features: + + +* Show relative coordinates when moving guides and sample points. + +===Updated Tool: Text=== + +* Port text rendering to GEGL +* Use HarfBuzz to inspect fonts for creating an example string +* Improved support for languages using Input Method Engines (IME). + +===Updated Tool: Foreground Select=== + +Can finally make subpixel selections in complex cases such as strays of hair on textured background. Two new masking methods for that were added, and the user interface was updated accordingly. + + +===Updated Tool: Select by Color=== + +* New ''Draw mask'' option to display future selection area with a magenta fill + +===Updated Tool: Fuzzy Select=== + +* New ''Draw mask'' option to display future selection area with a magenta fill +* New ''Diagonal neighbors'' option to select diagonally neighboring pixels + +===Updated Tool: Free Select=== + +* Closing a polygonal/free selection now doesn't confirm the selection automatically. Instead you still can tweak positions of nodes (where applicable), then press Enter or switch to another tool to confirm the selection. + +===Updated Tool: Intelligent Scissors=== + +* allow to remove the last added IScissors segment with backspace +* GIMP now checks, whether the first and the last isegments are distinct before closing the curve + +===Updated Tool: Bucket Fill=== + +* new ''Diagonal neighbours'' option to fill diagonally neighboring pixels + +===Updated Tool: Desaturate=== + +* Turn the Desaturate tool into a normal GEGL filter +* Move "Desaturate" to Colors -> Desaturate + +===Updated Tool: Posterize=== + +* Turn the posterize tool into an ordinary GEGL filter +* Remove posterize from Tools -> Colors + +===Updated Tool: Colorize=== + +* Remove the Colorize tool and replace it by a generic filter action. + +===Updated Tool: Color Balance=== + +* Replace the color balance tool by a generic filter action + +===Updated Tool: Hue-Saturation=== + +* Remove the Hue-Saturation tool and replace it by a generic filter action. + +===Updated Tool: Color Picker=== + +* Don't snap to anything when picking colors +* Color picker tools now always draw the outline of the averaged region, not only while the mouse is being pressed +* Support arbitrary range of values regardless of the actual image color precision +* Add LAB and LCH readout to Info window + +===Removed menu: Color Tools=== + +'Image -> Tools -> Color Tools' is gone now that all color tools are basically GEGL operations with custom UI. + + +===Refactoring=== + +Move on-canvas interaction code of some tools to new GimpToolWidget class and make it available to GEGL-based filters. + + +==Plugins== + +* Allow plug-ins to access image data at full bit depth. +* On-canvas preview for all filters that use a GEGL operation. +* On-canvas preview can be split to see part of the image before and part after the filter (preview curtain). +* On-canvas controls for ''Spiral'' (experimental) and ''Supernova'' GEGL-based filters. +* Add a compat mode so unported plug-ins always get 8-bit data. +* New plugins/filters: Mono Mixer, Color to Gray, Sepia, Color Temperature, Exposure, Extract Component, Dither, RGB Clip, Waterpixels, Image Gradient, Symmetric Nearest Neighbor, Wavelet Decompose, Simple Linear Interactive Clustering, Fattal, Mantiuk, Reinhard, Stress ('''FIXME:''' CHECK the full list). +* New ''Hue-Chroma'' operation/tool. +* New file-darktable and file-rawtherapee plug-ins to load raw (digital negative) files by having them developed in darktable or RawTherapee. +* Removed plugins: Maximum RGB, iWarp ('''FIXME:''' CHECK the full list). +* Decompose plugin supports LCH now ('''FIXME:''' CHECK the full list of supported color models). +* 'File -> Send' plugin for emailing images is available again on platforms with `xdg-email` (Linux only?). The original sendmail implementation is still available if built with --with-sendmail option (since this requires less common configuration, usually only done on servers). +* Add interpreter for the GUM (GEGL UI Metadata) language. GUM is a small DSL, used in some property keys of GEGL operations to dynamically control UI attributes based on context. +* Allow plug-in inside first-level directories of plug-ins folders. GIMP doesn't search recursively, but only at the first level. If a plug-in is in its own subdirectory, the entry point has to be named the same (minus extension) as the directory. For instance my-plugin/my-plugin for a binary, or my-plugin/my-plugin.(py|exe|…). +* Allow filter actions to have hardcoded default operation settings by encoding them directly in the string attached to all filter actions. The code now supports both "gegl:some-operation" and "gegl:some-operation\n". + + +==Color Management, Color Spaces and Models== + +* Implement all color management in the core (not as a plugin) +* Depends on LCMS2.7+, because earlier LCMS2 releases caused problems with certain GIMP blend modes +* Support ICC v4 color profiles +* Make both RGB and Greyscale images color managed +* Reimplement assigning, converting, and discarding ICC profiles +* Display ICC profiles metadata in various parts of UI (color space conversion, selection of a profile from the disk etc.) +* Add preferred RGB and GREY color profiles settings to the ''Preferences'' dialog to make them quickly accessible in profile selection combo boxes +* New 'Image -> Color Management -> Save Color Profile to File...' command +* New 'View -> Color Management' submenu to enable softproofing, change rendering intent etc. +* 'New Image' dialog allows selecting an ICC profile for a new image +* New Prefs options to toggle color transforms optimization, disabling optimization may improve quality at the cost of speed +* Ask user for intent and bpc settings in the profile import dialog (FIXME: FACTCHECK) +* Mark out-of-gamut colors also in the RGB and HSV color areas +* Make the screenshot plug-in color-managed +* Now color-managed: +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +** layer/image/color palette/gradient/pattern previews, +** Color Picker tool, +** GimpColorHistory, +** GimpFgBgEditor, +** GimpColorFrame (Mouse Pointer dialog), +** color selectors, +** script-fu color buttons, +** DND widget, +** painting tools, +** copying layers/paste buffer between images +* layer/image/color palette/gradient/pattern previews, +* Color Picker tool, +* GimpColorHistory, +* GimpFgBgEditor, +* GimpColorFrame (Mouse Pointer dialog), +* color selectors, +* script-fu color buttons, +* DND widget, +* painting tools, +* copying layers/paste buffer between images +* Add LCH channels to color selector dialog (FG/BG etc.) +* Allow decomposing/composing to/from LCH +* New ''Extract Channel'' command to extract channels in various color spaces +* Re-arrange color models in the Color dock: add a switch between HSV and LCH + +==File Access== + +* File access ported to [https://developer.gnome.org/gio/ GIO] allowing to access remote files seamlessly, file-uri plugin therefore removed +* SSL/TLS support is now a mandatory dependency (HTTPS being now the web standard, and HTTP being more and more deprecated by browsers everyday) +* Improved automatic file formats recognition + +==Metadata== + +* Implement metadata handling in the core +* Add ''Image -> Metadata -> View Metadata'' dialog for viewing Exif, IPTC, and XMP info (DICOM metadata is displayed in the XMP tab) +* Add ''Image -> Metadata -> Edit Metadata'' dialog for editing IPTC (plus extensions), GPS and DICOM metadata +* PNG, JPEG, and TIFF exporters now have ''Save Exif'', ''Save IPTC'', and ''Save XMP'' options in the ''Advanced'' group of settings +* Defaults for saving metadata are configurable now in the ''Preferences'' dialog + +==File Format Support== + +* 16-bit per color channel support for PNG +* 16/32-bit per color channel support for TIFF and PSD +* 16/32/64-bit per color channel support for FITS +* OpenEXR loading and exporting +* WebP loading and exporting, includes support for loading/saving, icc profiles, exif, and xmp data +* PSD plug-in now supports more blend modes (import/export), reads Pass Through mode for layer groups +* Add LZMA2 compressed file support (.xcf.xz/.xcfxz) +* Internal tile compression for XCF is now zlib (instead of RLE) +* Writing linear gamma TIFF images +* Allow exporting layers as PDF pages +* Improve the raw ('''not''' the digital negative) files plugin: +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) +** Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +** Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +** Use GtkBuilder to construct the export dialog (similar to PNG plugin) +** Make the plugin remember last used export settings (similar to PNG plugin) +** Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +** Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) +* Add "data" - which is already a load extension - as save extension and adds "raw" as load and save extension as it is also a common suffix for such files +* Export the image before saving, to get layers merged and so on. Currently only the top layer is saved (similar to PNG plugin) +* Use GtkBuilder to construct the export dialog (similar to PNG plugin) +* Make the plugin remember last used export settings (similar to PNG plugin) +* Introduce some export defaults that can also be modified by the user (similar to PNG plugin) +* Make the plugin able to be invoked non-interactively and with last used values [Ctrl+E] (similar to PNG plugin) + +==Printing== + +* Print resolution can now be reset to defaults, new values for the same image is actually used now without reloading the image. + +==Color Palettes== + +* Selecting multiple palettes and merging them into one is possible now (''Palette > Merge Palettes...'') +* Add an automatic palette of recently used colors + +==Dockable Dialogs== + +* The FG/BG Color dock features the 12 most recent colors at the bottom +* Add ''MyPaint Brushes'' dialog +* Add LAB and LCH readout to Pointer and Sample Points dialogs +* New dashboard dockable: shows the current GEGL cache and swap sizes and CPU usage and active time, and their recent history. It has options to control the update rate and history duration of the data, and an option to warn (by raising/blinking the dialog) when the swap size approaches its limit. + +==Digital Painting== + +* Canvas rotation and flipping have been added to facilitate users who need to paint from a different angle or check composition for errors (''View -> Flip and Rotate'' submenu, '''Shift''' (+ '''Ctrl''') + middle mouse button drag). +* Symmetry painting for all painting tools (Paintbrush, MyPaint Brush, Eraser etc.). Available through likewise named dockable dialog, enabled on per-image basis. Modes: Mirror, Tiling, Mandala (Kaleidoscope). +* Optional locking of brush size to zoom (bottom of every painting tool's options). +* All tools that use GIMP’s brush engine have ''Hardness'' and ''Force'' sliders now. +* For bitmap brushes, GIMP now caches hardness and disables dynamic change of hardness to improve painting performance. Botmap brushes also don't get clipped anymore, when hardness is less than 100. + +==Configurability and usability== + +* Icon Themes can be added, selected, and removed now (''Edit -> Preferences -> Interface -> Icon Theme'') +* Pages in the ''Preferences'' dialog regrouped +* Vertical scrollbar added to keep the height of the ''Preferences'' dialog sensible +* New ''Image Import'' page in the ''Preferences'' dialog to define image importing policies (promoting to 32-bit float and dithering) +* New ''Image Windows -> Snapping'' page in the ''Preferences'' dialog allows choosing default snapping settings for both normal and fullscreen modes +* New ''Interface -> Dialog Defaults'' page in the ''Preferences'' dialog to control defaults values of various dialogs +* Settings on individual pages of the ''Preferences'' dialog can be reset +* Snapping distance setting has move to the ''Image Windows -> Snapping'' page +* Selection of visible tools in the toolbox has moved to the ''Interface -> Toolbox'' page +* Existing settings on the ''Color Management'' page got reorganized, new settings got added +* Undo preview size is now configurable via UI (on the ''Interface'' page of the 'Preferences' dialog) +* Allow mouse to optionally configure tablet devices +* Allow creating shortcuts containing the Cmd key + mouse wheel events +* Default to 300ppi and 1920x1080px for new documents. +* Do not allow Alt+[0-9] shortcuts, they are typically used for display switching +* Configuration directory now follow OS-specific standards: +:- UNIX platforms (except OSX) follow FreeDesktop's XDG standards: $XDG_CONFIG_HOME/GIMP/{GIMP_APP_VERSION} + +:- Windows: %APPDATA%/GIMP/{GIMP_APP_VERSION} + +:- OSX: NSApplicationSupportDirectory/GIMP/{GIMP_APP_VERSION} + + + +==Usability== + +* Enable "save-tool-options" and "save-device-status" by default, it's the expected behavior these days. +* Brightness-Contrast, Curves, Levels and Threshold are now available in "Repeat last" history. + +==General Changes== + +===Internal Changes=== + +* Add undo/redo to many tools using the normal shortcuts ('''FIXME:''' provide a more detailed explanation) + +===UI changes=== + +* Add '''Save As''' buttons to the “Quit GIMP” dialog for every opened image +* Allow zooming to the selection +* Make the image tab position configurable in single window mode +* Add more format string options for the image title ('%e' for offsets, '%r' for rotation, '%o' for current ICC profile) +* Simplify and reduce the actions that modify paint tool behavior ('''FIXME:''' provide a more detailed explanation) +* Allow selecting colors from an image's colormap +* New symbolic icon themes (light and dark) +* New color icon theme (previous color theme is still here under the name "Legacy") +* 5 new themes (lighter, light, gray, dark, darker). +* The new theming defaults are: "Dark" theme and "Symbolic" icon theme. Note: old themes will likely be broken and won't be migrated when updating to GIMP 2.10. +* New "Action Search" dialog +* New "Select -> Remove holes" command to clean up selection with small unselected areas inside (see [https://bugzilla.gnome.org/show_bug.cgi?id=761060 bug 761060]) +* Turn invert-perceptual, -linear and -value into normal filter actions, so they show up in recent filters, and don't need their own callbacks. +* Allow tool dialogs to be embedded on the canvas generically +* Follows "Maximized" hint on Windows ("run" property on a shortcut or `start /max gimp-2.9.exe` from command line). +* Allow to choose fill color when resizing layers and images +* Allow to zoom with middle mouse button + control + drag up/down +* Check and clean out duplicate accelerators on startup +* Toolbox buttons do not grab focus anymore, which used to break usage of the Tab key and other canvas-related shortcuts after changing tools with a pointing device click +* '''Delete Layer/Channel/Path''' are consistently the last option in respective dialogs now +* Extend the text along the tangent of the last path stroke, when the length of the path along which the text layer content is warped is shorter than the width of the text +* Allow to toggle the histogram dialog between gamma and linear +* New '''Colors -> Linear Invert''' command to provide radiometrically correct color inversion +* Optimal digit precision for length display in physical units in various widgets +* Switching between linear and perceptual (gamma-corrected) spaces in the Histogram dialog is easier now: two buttons instead of one two-way button where current state was difficult to understand. +* Shorten color channel labels in the color frame (color picker tool, sample point editor…) with conventional 1 or 2-letter abbreviations, and split coordinates on 2 lines. +* We now switch to "Huge" icons by default when the display pixel density is over 250 PPI (used to be 300 PPI). + +==Assets== + +* Modernize default list of document templates. +* Add 4x3 Landscape/Portrait, 3x2 Landscape/Portrait, 16x10, 16x9, and Square presets for the Crop tool. +* Add a basic "Pressure Size" dynamics. This is a common dynamics, for instance when you do colorization bases. This allows to control the size of the brush with pressure and always keep unified color without opacity changes. + +==Batch processing== + +* Batch commands can now be run on an existing GIMP instance. +* A new 'with-files' macro is available to run commands on several files at once. For instance, if you want to invert colors of all png files in a directory, and save them as jpg, you could run: +
    gimp -i -b '(with-files "*.png" (gimp-invert layer) \
    +             (gimp-file-save 1 image layer \
    +             (string-append basename ".jpg") \
    +             (string-append basename ".jpg") ))'
    +
    + +==API Changes== + +* Add gimp_pdb_image_get_guide() +* Add PDB sample point API similar to how the guide API works. +* Add core API similar to the core guide API to make guide and sample point APIs as similar as possible. +* Add PDB API to configure/query all aspects of line stroking. +* Add gimp_context_set/get_mypaint_brush() +* Add gimp_image_convert_color_profile_from_file() +* Add gimp_image_set_color_profile_from_file() +* Remove "set" and "set-rgb" from the lcms plug-in +* Remove the lcms plug-in and add PDB compat procedures +* Add gimp_image_convert_color_profile() PDB wrapper +* Add gimp_image_get_effective_color_profile() +* Add gimp_image_get_color_profile() and gimp_image_set_color_profile() +* Rename the "guides" PDB group to "imageguides" +* Rename the "grid" PDB group to "imagegrid" +* Rename the "convert" PDB group to "imageconvert" +* Rename the "undo" PDB group to "imageundo" +* Change range of brush-spacing to 0.01..5.0 +* Add gimp_context_get_brush_hardness and gimp_context_set_brush_hardness +* Add gimp_context_get_brush_force and gimp_context_set_brush_force +* Add gimp_context_get_brush_spacing and gimp_context_set_brush_spacing +* Remove enum GimpConvolutionType from the public API +* Add gimp_paint_options_set_default_brush_size() +* Deprecate gimp-brightness-contrast, add gimp-drawable-brightness-contrast +* Deprecate gimp-levels, add gimp-drawable-levels +* Deprecate gimp-levels-auto, add gimp-drawable-levels-stretch +* Deprecate gimp-levels-stretch, add gimp-drawable-levels-stretch +* Deprecate gimp-posterize, add gimp-drawable-posterize +* Deprecate gimp-desaturate, add gimp-drawable-desaturate +* Deprecate gimp-desaturate-full, add gimp-drawable-desaturate +* Deprecate gimp-equalize, add gimp-drawable-equalize +* Deprecate gimp-equalize, add gimp-drawable-colorize-hsl +* Deprecate gimp-hue-saturation, add gimp-drawable-hue-saturation +* Remove all traces of the supersampling recursion level from all transform APIs +* Add gimp_image_get_precision +* Add gimp_image_new_with_precision +* Add gimp_image_convert_precision +* [https://git.gnome.org/browse/gimp/commit/?id=52e40bce42a2d7d7e65845e94f4b4e22b6a9ccb6 Port drawable pixel access API to GEGL] +* Add support for omitting the "gimp-" prefix from the procedure name +* Add gimp-selection-flood PDB op to clean up selection with small unselected areas inside +* New gimp_export_exif(), gimp_export_xmp() and gimp_export_iptc() functions returning the creator choice regarding default handling for metadata export (as set in the Preferences). +* New gimp_get_pdb_status() to return the status of the last PDB call. This is needed for plug-ins which depend on other plug-ins' procedures. If for instance, a second-level plug-in is interrupted interactively, we don't want to process this as an error but as a cancellation. +* New gimp_stack_trace_available(), gimp_stack_trace_print() and gimp_stack_trace_query() for debugging. +* Use gegl:distance-transform in gimp_edit_blend() implementation making it much faster for all GRADIENT_SHAPEBURST_* gradient types. Legacy gimp:shapeburst operation has been deleted. +* New gimp_context_get_distance_metric() and gimp_context_set_distance_metric() for distance metric used in gimp_edit_blend() (and future usage). +* app, pdb: Modify gimp_channel_border() to take a style parameter +* pdb: Modify gimp-selection-border to use BORDER_STYLE_SMOOTH +* pdb, app, libgimp: rename *-paste-as-new to *-paste-as-new-image +* Add PDB API for color tags/labels (for layers/channels/paths) +* pdb, app, libgimp: change ranges for histogram and threshold to 0.0..1.0 +* app, pdb, libgimp: allow to choose the channel when thresholding +* app, pdb: use GeglDitherMethod instead of simply an integer +* Add PDB API and UI to control a layer's composite mode +* Remove the _LINEAR layer mode variants +* Add PDB API for layer blend space and compositing space +* Rename values of enum GimpConvertPaletteType and GimpConvertDitherType +* pdb: add debug group; add debug-timer-{start,end} procs +* pdb: fix input range of context-set-brush-size +* app: add gimp_edit_paste_as_new_image() and use it from GUI and PDB +* app, pdb, libgimp: make the raw image importer configurable +* app, pdb: change a lot of GIMP_LAYER_MODE_NORMAL_LEGACY to just NORMAL +* pdb: add new procedure gimp-get-default-new-layer-mode +* pdb, libgimp: rename gimp_drawable_invert() to _invert_non_linear() +* pdb, libgimp: change the gimp-drawable-invert API again +* add file-pdf-load2 PDB API. +* pdb, libgimp: add gimp-item-{get,set}-expanded() +* app, pdb: prevent custom gradient from being renamed +* add file-hgt-load new PDB call +* pdb: fail layer-remove-mask if applying a mask to a group layer +* pdb: allow adding masks to group layers in layer-add-mask +* app, pdb, libgimp, plug-ins, menus: rename layer composite modes +* app, libgimp, libgimpbase, pdb: s/GimpDistanceMetric/GeglDistanceMetric/ +* pdb, libgimp: allow to use external GType-registered enums in the PDB +* pdb: prepend GEGL enum types with GEGL_TYPE. +* app, libgimp, pdb: add "distance-metric" property to GimpPDBContext. +* pdb: add jehan_pdb_misc() and use it in the new procedures +* Rename Blend tool and provide PDB compatibility +* app: add gimp_pdb_context_get_paint_options_list() +* add drawable_edit.pdb and deprecate all non-clipboard functions in the "edit" group +* pdb: never pass bogus supersample values to gimp_drawable_gradient() +* pdb: add procedures to set the built-in gradients +* pdb: fix use of "seed" properties in plug_in_compat.pdb +* app, pdb: s/gimp_pdb_item_is_modifyable/gimp_pdb_item_is_modifiable/ +* pdb: add gimp-item-transform-translate procedure +* pdb: deprecated gimp-layer-translate +* pdb: make all item-transform procedures honor the "linked" flag +* pdb: finally deprecate gimp-color-balance + +==Debugging and bug reporting== + +* GIMP can be built with crash logs support on Windows thanks to Dr. MinGW. +* New debug tool and infrastructure to handle WARNING and CRITICAL errors, as well as fatal errors (crashes), raising a pop-up with all version information on GIMP and its main dependencies, as well as the error message and backtraces, and encouraging people to make bug reports. +* GIMP now attempts to backup unsaved images when it crashes. Then at next startup, it will suggest to recover the salvaged images. Image recovery is not 100% guaranteed. diff --git a/wiki/Release:GIMP_2.8.10-20161023235635-edit.txt b/wiki/Release:GIMP_2.8.10-20161023235635-edit.txt new file mode 100644 index 0000000..2abb91d --- /dev/null +++ b/wiki/Release:GIMP_2.8.10-20161023235635-edit.txt @@ -0,0 +1,27 @@ +== General release == + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' + +=== Testing === + +''Is there any specific bug fix that we want to make sure is fixed? A new feature to heavily test?'' + +== Windows release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +=== Testing === + +Make sure the [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d configuration bug] is fixed. + +== OSX release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +=== Testing === + +Make sure the serious issues on OS X Mavericks, for instance the [showstopper in the Text tool], of GIMP 2.8.8 are fixed. diff --git a/wiki/Release:GIMP_2.8.10-20180812150607-show.txt b/wiki/Release:GIMP_2.8.10-20180812150607-show.txt new file mode 100644 index 0000000..3ba5bf2 --- /dev/null +++ b/wiki/Release:GIMP_2.8.10-20180812150607-show.txt @@ -0,0 +1,38 @@ + + +__TOC__ + +==General release== + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' + + +===Testing=== + +''Is there any specific bug fix that we want to make sure is fixed? A new feature to heavily test?'' + + +==Windows release== + +===Dependencies=== + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + + +===Testing=== + +Make sure the [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d configuration bug] is fixed. + + +==OSX release== + +===Dependencies=== + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + + +===Testing=== + +Make sure the serious issues on OS X Mavericks, for instance the [showstopper in the Text tool], of GIMP 2.8.8 are fixed. + + \ No newline at end of file diff --git a/wiki/Release:GIMP_2.8.10-20210515091413-edit.txt b/wiki/Release:GIMP_2.8.10-20210515091413-edit.txt new file mode 100644 index 0000000..2abb91d --- /dev/null +++ b/wiki/Release:GIMP_2.8.10-20210515091413-edit.txt @@ -0,0 +1,27 @@ +== General release == + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' + +=== Testing === + +''Is there any specific bug fix that we want to make sure is fixed? A new feature to heavily test?'' + +== Windows release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +=== Testing === + +Make sure the [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d configuration bug] is fixed. + +== OSX release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +=== Testing === + +Make sure the serious issues on OS X Mavericks, for instance the [showstopper in the Text tool], of GIMP 2.8.8 are fixed. diff --git a/wiki/Release:GIMP_2.8.12-20201129013515-edit.txt b/wiki/Release:GIMP_2.8.12-20201129013515-edit.txt new file mode 100644 index 0000000..a3ce56e --- /dev/null +++ b/wiki/Release:GIMP_2.8.12-20201129013515-edit.txt @@ -0,0 +1,41 @@ +== General release == + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance;bug_severity=blocker;bug_severity=critical;classification=Other;query_format=advanced;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;target_milestone=2.8;product=GIMP List of blocker and critical bugs with milestone 2.8] + +[https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now;query_format=advanced;chfield=resolution;chfieldfrom=2013-11-28;chfieldvalue=FIXED;bug_status=RESOLVED;bug_status=VERIFIED;resolution=FIXED;classification=Other;product=GIMP;target_milestone=2.8;known_name=GIMP%20-%20changes%20since%20last%20release;query_based_on=GIMP%20-%20changes%20since%20last%20release List of bugs fixed in version 2.8 since last release] + +=== Dependencies === + +* Make sure poppler-data is installed. Otherwise pdf-import for Asian and Cyrillic characters won't work. See [https://bugzilla.gnome.org/show_bug.cgi?id=733525 bug 733525]. poppler-data is not currently detected by the configure script, therefore had been forgotten in some previous releases. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=720052 Make GIMP require a more recent gettext]: do not try and regenerate the localization files, unless you have gettext 0.19 or over. Older version will "forget" most Script-fu localized strings and you will end up with incomplete localization. + +=== Testing === + +From the list of fixed bugs since last release finally test at least the blocker and critical bugs. + +== Windows release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: make sure, that [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker] is applied resp. the latest fontconfig version used (version 2.11.1 or over). + +* [https://bugzilla.gnome.org/show_bug.cgi?id=708110 fontconfig configuration is incomplete on Windows platforms]: patch fontconfig with the fix in [ https://bugs.freedesktop.org/show_bug.cgi?id=69836#c3 fontconfig bugtracker], or update the fontconfig conf after installation as [https://mail.gnome.org/archives/gimp-developer-list/2013-September/msg00124.html described by drawoc], or finally install a recent version of fontconfig (version 2.11.0 or over). + +=== Testing === + +Make sure the [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d configuration bug] is fixed. + +== OSX release == + +=== Dependencies === + +See the JHBuild [https://git.gnome.org/browse/gimp/plain/build/osx/gimp.modules?h=gimp-2-8 module configuration] for the OS X build. + +=== Testing === + +Testing of Sven's fixes to the OS X build 20.-22.7.2014: done diff --git a/wiki/Release:GIMP_2.8.12-20210515135050-edit.txt b/wiki/Release:GIMP_2.8.12-20210515135050-edit.txt new file mode 100644 index 0000000..a3ce56e --- /dev/null +++ b/wiki/Release:GIMP_2.8.12-20210515135050-edit.txt @@ -0,0 +1,41 @@ +== General release == + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance;bug_severity=blocker;bug_severity=critical;classification=Other;query_format=advanced;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;target_milestone=2.8;product=GIMP List of blocker and critical bugs with milestone 2.8] + +[https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now;query_format=advanced;chfield=resolution;chfieldfrom=2013-11-28;chfieldvalue=FIXED;bug_status=RESOLVED;bug_status=VERIFIED;resolution=FIXED;classification=Other;product=GIMP;target_milestone=2.8;known_name=GIMP%20-%20changes%20since%20last%20release;query_based_on=GIMP%20-%20changes%20since%20last%20release List of bugs fixed in version 2.8 since last release] + +=== Dependencies === + +* Make sure poppler-data is installed. Otherwise pdf-import for Asian and Cyrillic characters won't work. See [https://bugzilla.gnome.org/show_bug.cgi?id=733525 bug 733525]. poppler-data is not currently detected by the configure script, therefore had been forgotten in some previous releases. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=720052 Make GIMP require a more recent gettext]: do not try and regenerate the localization files, unless you have gettext 0.19 or over. Older version will "forget" most Script-fu localized strings and you will end up with incomplete localization. + +=== Testing === + +From the list of fixed bugs since last release finally test at least the blocker and critical bugs. + +== Windows release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: make sure, that [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker] is applied resp. the latest fontconfig version used (version 2.11.1 or over). + +* [https://bugzilla.gnome.org/show_bug.cgi?id=708110 fontconfig configuration is incomplete on Windows platforms]: patch fontconfig with the fix in [ https://bugs.freedesktop.org/show_bug.cgi?id=69836#c3 fontconfig bugtracker], or update the fontconfig conf after installation as [https://mail.gnome.org/archives/gimp-developer-list/2013-September/msg00124.html described by drawoc], or finally install a recent version of fontconfig (version 2.11.0 or over). + +=== Testing === + +Make sure the [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d configuration bug] is fixed. + +== OSX release == + +=== Dependencies === + +See the JHBuild [https://git.gnome.org/browse/gimp/plain/build/osx/gimp.modules?h=gimp-2-8 module configuration] for the OS X build. + +=== Testing === + +Testing of Sven's fixes to the OS X build 20.-22.7.2014: done diff --git a/wiki/Release:GIMP_2.8.12-20210815113345-show.txt b/wiki/Release:GIMP_2.8.12-20210815113345-show.txt new file mode 100644 index 0000000..de89e76 --- /dev/null +++ b/wiki/Release:GIMP_2.8.12-20210815113345-show.txt @@ -0,0 +1,49 @@ + + +__TOC__ + +==General release== + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' +[https://bugzilla.gnome.org/buglist.cgi?order=Importance;bug_severity=blocker;bug_severity=critical;classification=Other;query_format=advanced;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;target_milestone=2.8;product=GIMP List of blocker and critical bugs with milestone 2.8] +[https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now;query_format=advanced;chfield=resolution;chfieldfrom=2013-11-28;chfieldvalue=FIXED;bug_status=RESOLVED;bug_status=VERIFIED;resolution=FIXED;classification=Other;product=GIMP;target_milestone=2.8;known_name=GIMP%20-%20changes%20since%20last%20release;query_based_on=GIMP%20-%20changes%20since%20last%20release List of bugs fixed in version 2.8 since last release] + + +===Dependencies=== + +* Make sure poppler-data is installed. Otherwise pdf-import for Asian and Cyrillic characters won't work. See [https://bugzilla.gnome.org/show_bug.cgi?id=733525 bug 733525]. poppler-data is not currently detected by the configure script, therefore had been forgotten in some previous releases. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=720052 Make GIMP require a more recent gettext]: do not try and regenerate the localization files, unless you have gettext 0.19 or over. Older version will "forget" most Script-fu localized strings and you will end up with incomplete localization. + +===Testing=== + +From the list of fixed bugs since last release finally test at least the blocker and critical bugs. + + +==Windows release== + +===Dependencies=== + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: make sure, that [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker] is applied resp. the latest fontconfig version used (version 2.11.1 or over). + +* [https://bugzilla.gnome.org/show_bug.cgi?id=708110 fontconfig configuration is incomplete on Windows platforms]: patch fontconfig with the fix in [ [https://bugs.freedesktop.org/show_bug.cgi?id=69836#c3 https://bugs.freedesktop.org/show_bug.cgi?id=69836#c3] fontconfig bugtracker], or update the fontconfig conf after installation as [https://mail.gnome.org/archives/gimp-developer-list/2013-September/msg00124.html described by drawoc], or finally install a recent version of fontconfig (version 2.11.0 or over). + +===Testing=== + +Make sure the [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d configuration bug] is fixed. + + +==OSX release== + +===Dependencies=== + +See the JHBuild [https://git.gnome.org/browse/gimp/plain/build/osx/gimp.modules?h=gimp-2-8 module configuration] for the OS X build. + + +===Testing=== + +Testing of Sven's fixes to the OS X build 20.-22.7.2014: done + + \ No newline at end of file diff --git a/wiki/Release:GIMP_2.8.16-20201028003736-edit.txt b/wiki/Release:GIMP_2.8.16-20201028003736-edit.txt new file mode 100644 index 0000000..945bfdf --- /dev/null +++ b/wiki/Release:GIMP_2.8.16-20201028003736-edit.txt @@ -0,0 +1,30 @@ +== General release == + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance;bug_severity=blocker;bug_severity=critical;classification=Other;query_format=advanced;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;target_milestone=2.8;product=GIMP List of blocker and critical bugs with milestone 2.8] + +[https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now;query_format=advanced;chfield=resolution;chfieldfrom=2014-08-26;chfieldvalue=FIXED;bug_status=RESOLVED;bug_status=VERIFIED;resolution=FIXED;classification=Other;product=GIMP;target_milestone=2.8;known_name=GIMP%20-%20changes%20since%20last%20release;query_based_on=GIMP%20-%20changes%20since%20last%20release List of bugs fixed in version 2.8 since last release] + +=== Dependencies === + + +=== Testing === + +From the list of fixed bugs since last release finally test at least the blocker and critical bugs. + +== Windows release == + +=== Dependencies === + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + +=== Testing === + +== OSX release == + +=== Dependencies === + +See the JHBuild [https://git.gnome.org/browse/gimp/plain/build/osx/gimp.modules?h=gimp-2-8 module configuration] for the OS X build. + +=== Testing === diff --git a/wiki/Release:GIMP_2.8.16-20210819010728-show.txt b/wiki/Release:GIMP_2.8.16-20210819010728-show.txt new file mode 100644 index 0000000..a0da356 --- /dev/null +++ b/wiki/Release:GIMP_2.8.16-20210819010728-show.txt @@ -0,0 +1,36 @@ + + +__TOC__ + +==General release== + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' +[https://bugzilla.gnome.org/buglist.cgi?order=Importance;bug_severity=blocker;bug_severity=critical;classification=Other;query_format=advanced;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;target_milestone=2.8;product=GIMP List of blocker and critical bugs with milestone 2.8] +[https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now;query_format=advanced;chfield=resolution;chfieldfrom=2014-08-26;chfieldvalue=FIXED;bug_status=RESOLVED;bug_status=VERIFIED;resolution=FIXED;classification=Other;product=GIMP;target_milestone=2.8;known_name=GIMP%20-%20changes%20since%20last%20release;query_based_on=GIMP%20-%20changes%20since%20last%20release List of bugs fixed in version 2.8 since last release] + + +===Dependencies=== + +===Testing=== + +From the list of fixed bugs since last release finally test at least the blocker and critical bugs. + + +==Windows release== + +===Dependencies=== + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + + +===Testing=== + +==OSX release== + +===Dependencies=== + +See the JHBuild [https://git.gnome.org/browse/gimp/plain/build/osx/gimp.modules?h=gimp-2-8 module configuration] for the OS X build. + + +===Testing=== + \ No newline at end of file diff --git a/wiki/Release:GIMP_2.8.16-20210819010738-show.txt b/wiki/Release:GIMP_2.8.16-20210819010738-show.txt new file mode 100644 index 0000000..a0da356 --- /dev/null +++ b/wiki/Release:GIMP_2.8.16-20210819010738-show.txt @@ -0,0 +1,36 @@ + + +__TOC__ + +==General release== + +''Here goes anything we want to be checked or tested before a release goes out. This is a not-build-specific section.'' +[https://bugzilla.gnome.org/buglist.cgi?order=Importance;bug_severity=blocker;bug_severity=critical;classification=Other;query_format=advanced;bug_status=UNCONFIRMED;bug_status=NEW;bug_status=ASSIGNED;bug_status=REOPENED;bug_status=NEEDINFO;target_milestone=2.8;product=GIMP List of blocker and critical bugs with milestone 2.8] +[https://bugzilla.gnome.org/buglist.cgi?chfieldto=Now;query_format=advanced;chfield=resolution;chfieldfrom=2014-08-26;chfieldvalue=FIXED;bug_status=RESOLVED;bug_status=VERIFIED;resolution=FIXED;classification=Other;product=GIMP;target_milestone=2.8;known_name=GIMP%20-%20changes%20since%20last%20release;query_based_on=GIMP%20-%20changes%20since%20last%20release List of bugs fixed in version 2.8 since last release] + + +===Dependencies=== + +===Testing=== + +From the list of fixed bugs since last release finally test at least the blocker and critical bugs. + + +==Windows release== + +===Dependencies=== + +''Please list down here the dependencies bundled in the build, with their version, their configuration (which options or features are included), and any patch applied.'' + + +===Testing=== + +==OSX release== + +===Dependencies=== + +See the JHBuild [https://git.gnome.org/browse/gimp/plain/build/osx/gimp.modules?h=gimp-2-8 module configuration] for the OS X build. + + +===Testing=== + \ No newline at end of file diff --git a/wiki/Release:General_Information-20201028002844-edit.txt b/wiki/Release:General_Information-20201028002844-edit.txt new file mode 100644 index 0000000..4a5c259 --- /dev/null +++ b/wiki/Release:General_Information-20201028002844-edit.txt @@ -0,0 +1,87 @@ +This is the page dedicated to release maintainers and testers. + +== Source Releases == + +There are release howtos in both the gimp-2-8 and the master branch: + +* https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=gimp-2-8 +* https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=master + +They are currently different, for the sole reason that the most recent editor of the file is pretending to be the 2.8 release manager and doesn't care that much about 2.9 development releases :) + +Following these howtos is important for getting consistent and complete release tarballs. + +Important: making a release is a process, not an instantaneous event. + +* plan ahead +* announce planned releases a few weeks in advance to the gnome-i18n list to get translations updated +* make changes before you do the release +** for example, update the NEWS +** prepare a local branch for the website changes +** familiarize yourself with the tools + + +== Microsoft Windows release == + +'''Current release maintainers''': Ender (stable) and Drawoc (nightly). + +=== Procedure === + +The stable release procedure uses some scripts available [http://eternallybored.org/misc/gimp/ there] and some files in `build/windows/` in GIMP repository. +But the exact procedure and how to use these scripts seems to be unknown to all but Ender. + +There exists also a nightly build system maintained by Drawoc, using jhbuild and files in `build/windows/jhbuild/` in GIMP repository. + +=== NOTES === + +1) Two ''fontconfig'' configuration issues specific to the Windows build must be taken care of in the release: + +* The [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d path bug]: fixed either with a patch in the repo (`build/windows/jhbuild/patches/fontconfig-fix-config-dir.patch`) or by using fontconfig >= 2.11.0. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: still in discussion upstream, but if we feel this is the way, we should already apply the [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker]. + +2) Make sure the following Windows registry keys are set/updated to the right value: + + [HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP] + @=”Edit with GIMP” + + [HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP\command] + @=”\”C:\\Program Files\\GIMP 2\\bin\\gimp-2.10.exe\” \”%1\”” + +It seems to be a common problem that the "Open with GIMP" right click menu gets lost on some update. Let's make sure this is not the case (see [https://bugzilla.gnome.org/show_bug.cgi?id=752759 bug 752759]). + +3) There is a known GTK+ bug where shortcuts don't work on non-latin locales (Windows-only). This has been fixed for 2.24.32. Our official release should contain thi version of GTK+ or above (see [https://bugzilla.gnome.org/show_bug.cgi?id=769550 bug 769550]). + +=== TODO === + +* Sync the nightly and the stable release procedures. + +* Write down the exact procedure (both on this wiki and in the repo, for instance, it could be in `build/windows/README.release`), so that anyone could be able to build one's own non-official release (whether for testing, development, or simply to pass down the information). + +* All the files necessary for the release should be available in the repo. There should not be files available spread out on third-party servers. + +== OSX Release == + +'''Current release maintainers''': ? + +There are at least four people working on an OS X release: Clayton Walker, Simone Karin Lehmann, Partha Bagchi and David Evans (Macports), not to mention the (still active?) maintainer of the outdated Fink build. + +=== Procedure === + +''TODO'' + +=== Notes === + +Clayton Walker proposed to update the ''fontconfig'' cache directory for the OSX build, but it has been [https://bugs.freedesktop.org/show_bug.cgi?id=71715 rejected upstream]. + +Well maybe all the OSX package maintainers and developers in our team could discuss this, and if they all agreed a change in fontconfig cache was in order for the OSX build, well you can configure it appropriately. Even though a change upstream is nicer, that's still only a configuration change, so we should do it. + +=== TODO === + +* All maintainers struggle alone with the special build issues of GIMP on OS X, its dependencies and the API incompatibilities between the various OS X versions. +Can you guys and girls please find a way to work together? +Ideally there would be only one GIMP release. Nevertheless if API/dependency incompatibilities were to force us to make several OSX releases, we should still have a common procedure to facilitate the work. + +* If we manage to sync all the OSX releases, the chosen procedure should be written down (both on this wiki and in the repo, for instance, it could be in `build/osx/README.release`). + +* All release scripts and other necessary files should be added to the repository at `build/osx/`. diff --git a/wiki/Release:General_Information-20210617180851-edit.txt b/wiki/Release:General_Information-20210617180851-edit.txt new file mode 100644 index 0000000..4a5c259 --- /dev/null +++ b/wiki/Release:General_Information-20210617180851-edit.txt @@ -0,0 +1,87 @@ +This is the page dedicated to release maintainers and testers. + +== Source Releases == + +There are release howtos in both the gimp-2-8 and the master branch: + +* https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=gimp-2-8 +* https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=master + +They are currently different, for the sole reason that the most recent editor of the file is pretending to be the 2.8 release manager and doesn't care that much about 2.9 development releases :) + +Following these howtos is important for getting consistent and complete release tarballs. + +Important: making a release is a process, not an instantaneous event. + +* plan ahead +* announce planned releases a few weeks in advance to the gnome-i18n list to get translations updated +* make changes before you do the release +** for example, update the NEWS +** prepare a local branch for the website changes +** familiarize yourself with the tools + + +== Microsoft Windows release == + +'''Current release maintainers''': Ender (stable) and Drawoc (nightly). + +=== Procedure === + +The stable release procedure uses some scripts available [http://eternallybored.org/misc/gimp/ there] and some files in `build/windows/` in GIMP repository. +But the exact procedure and how to use these scripts seems to be unknown to all but Ender. + +There exists also a nightly build system maintained by Drawoc, using jhbuild and files in `build/windows/jhbuild/` in GIMP repository. + +=== NOTES === + +1) Two ''fontconfig'' configuration issues specific to the Windows build must be taken care of in the release: + +* The [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d path bug]: fixed either with a patch in the repo (`build/windows/jhbuild/patches/fontconfig-fix-config-dir.patch`) or by using fontconfig >= 2.11.0. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: still in discussion upstream, but if we feel this is the way, we should already apply the [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker]. + +2) Make sure the following Windows registry keys are set/updated to the right value: + + [HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP] + @=”Edit with GIMP” + + [HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP\command] + @=”\”C:\\Program Files\\GIMP 2\\bin\\gimp-2.10.exe\” \”%1\”” + +It seems to be a common problem that the "Open with GIMP" right click menu gets lost on some update. Let's make sure this is not the case (see [https://bugzilla.gnome.org/show_bug.cgi?id=752759 bug 752759]). + +3) There is a known GTK+ bug where shortcuts don't work on non-latin locales (Windows-only). This has been fixed for 2.24.32. Our official release should contain thi version of GTK+ or above (see [https://bugzilla.gnome.org/show_bug.cgi?id=769550 bug 769550]). + +=== TODO === + +* Sync the nightly and the stable release procedures. + +* Write down the exact procedure (both on this wiki and in the repo, for instance, it could be in `build/windows/README.release`), so that anyone could be able to build one's own non-official release (whether for testing, development, or simply to pass down the information). + +* All the files necessary for the release should be available in the repo. There should not be files available spread out on third-party servers. + +== OSX Release == + +'''Current release maintainers''': ? + +There are at least four people working on an OS X release: Clayton Walker, Simone Karin Lehmann, Partha Bagchi and David Evans (Macports), not to mention the (still active?) maintainer of the outdated Fink build. + +=== Procedure === + +''TODO'' + +=== Notes === + +Clayton Walker proposed to update the ''fontconfig'' cache directory for the OSX build, but it has been [https://bugs.freedesktop.org/show_bug.cgi?id=71715 rejected upstream]. + +Well maybe all the OSX package maintainers and developers in our team could discuss this, and if they all agreed a change in fontconfig cache was in order for the OSX build, well you can configure it appropriately. Even though a change upstream is nicer, that's still only a configuration change, so we should do it. + +=== TODO === + +* All maintainers struggle alone with the special build issues of GIMP on OS X, its dependencies and the API incompatibilities between the various OS X versions. +Can you guys and girls please find a way to work together? +Ideally there would be only one GIMP release. Nevertheless if API/dependency incompatibilities were to force us to make several OSX releases, we should still have a common procedure to facilitate the work. + +* If we manage to sync all the OSX releases, the chosen procedure should be written down (both on this wiki and in the repo, for instance, it could be in `build/osx/README.release`). + +* All release scripts and other necessary files should be added to the repository at `build/osx/`. diff --git a/wiki/Release:General_Information-20220210134902-show.txt b/wiki/Release:General_Information-20220210134902-show.txt new file mode 100644 index 0000000..ebbff3b --- /dev/null +++ b/wiki/Release:General_Information-20220210134902-show.txt @@ -0,0 +1,112 @@ + + +This is the page dedicated to release maintainers and testers. + + +__TOC__ + +==Source Releases== + +There are release howtos in both the gimp-2-8 and the master branch: + + +* [https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=gimp-2-8 https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=gimp-2-8] +* [https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=master https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=master] + +They are currently different, for the sole reason that the most recent editor of the file is pretending to be the 2.8 release manager and doesn't care that much about 2.9 development releases :) + +Following these howtos is important for getting consistent and complete release tarballs. + +Important: making a release is a process, not an instantaneous event. + + +* plan ahead +* announce planned releases a few weeks in advance to the gnome-i18n list to get translations updated +* make changes before you do the release +** for example, update the NEWS +** prepare a local branch for the website changes +** familiarize yourself with the tools +** for example, update the NEWS +** prepare a local branch for the website changes +** familiarize yourself with the tools +* for example, update the NEWS +* prepare a local branch for the website changes +* familiarize yourself with the tools + + + + +==Microsoft Windows release== + +'''Current release maintainers''': Ender (stable) and Drawoc (nightly). + + +===Procedure=== + +The stable release procedure uses some scripts available [http://eternallybored.org/misc/gimp/ there] and some files in `build/windows/` in GIMP repository. +But the exact procedure and how to use these scripts seems to be unknown to all but Ender. + +There exists also a nightly build system maintained by Drawoc, using jhbuild and files in `build/windows/jhbuild/` in GIMP repository. + + +===NOTES=== + +1) Two ''fontconfig'' configuration issues specific to the Windows build must be taken care of in the release: + + +* The [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d path bug]: fixed either with a patch in the repo (`build/windows/jhbuild/patches/fontconfig-fix-config-dir.patch`) or by using fontconfig >= 2.11.0. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: still in discussion upstream, but if we feel this is the way, we should already apply the [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker]. + +2) Make sure the following Windows registry keys are set/updated to the right value: + +
    [HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP]
    +@=”Edit with GIMP”
    +
    +[HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP\command]
    +@=”\”C:\\Program Files\\GIMP 2\\bin\\gimp-2.10.exe\” \”%1\””
    +
    + +It seems to be a common problem that the "Open with GIMP" right click menu gets lost on some update. Let's make sure this is not the case (see [https://bugzilla.gnome.org/show_bug.cgi?id=752759 bug 752759]). + +3) There is a known GTK+ bug where shortcuts don't work on non-latin locales (Windows-only). This has been fixed for 2.24.32. Our official release should contain thi version of GTK+ or above (see [https://bugzilla.gnome.org/show_bug.cgi?id=769550 bug 769550]). + + +===TODO=== + +* Sync the nightly and the stable release procedures. + +* Write down the exact procedure (both on this wiki and in the repo, for instance, it could be in `build/windows/README.release`), so that anyone could be able to build one's own non-official release (whether for testing, development, or simply to pass down the information). + +* All the files necessary for the release should be available in the repo. There should not be files available spread out on third-party servers. + +==OSX Release== + +'''Current release maintainers''': ? + +There are at least four people working on an OS X release: Clayton Walker, Simone Karin Lehmann, Partha Bagchi and David Evans (Macports), not to mention the (still active?) maintainer of the outdated Fink build. + + +===Procedure=== + +''TODO'' + + +===Notes=== + +Clayton Walker proposed to update the ''fontconfig'' cache directory for the OSX build, but it has been [https://bugs.freedesktop.org/show_bug.cgi?id=71715 rejected upstream]. + +Well maybe all the OSX package maintainers and developers in our team could discuss this, and if they all agreed a change in fontconfig cache was in order for the OSX build, well you can configure it appropriately. Even though a change upstream is nicer, that's still only a configuration change, so we should do it. + + +===TODO=== + +* All maintainers struggle alone with the special build issues of GIMP on OS X, its dependencies and the API incompatibilities between the various OS X versions. + +Can you guys and girls please find a way to work together? +Ideally there would be only one GIMP release. Nevertheless if API/dependency incompatibilities were to force us to make several OSX releases, we should still have a common procedure to facilitate the work. + + +* If we manage to sync all the OSX releases, the chosen procedure should be written down (both on this wiki and in the repo, for instance, it could be in `build/osx/README.release`). + +* All release scripts and other necessary files should be added to the repository at `build/osx/`. diff --git a/wiki/Release:General_Information-20220210141436-show.txt b/wiki/Release:General_Information-20220210141436-show.txt new file mode 100644 index 0000000..ebbff3b --- /dev/null +++ b/wiki/Release:General_Information-20220210141436-show.txt @@ -0,0 +1,112 @@ + + +This is the page dedicated to release maintainers and testers. + + +__TOC__ + +==Source Releases== + +There are release howtos in both the gimp-2-8 and the master branch: + + +* [https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=gimp-2-8 https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=gimp-2-8] +* [https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=master https://git.gnome.org/browse/gimp/tree/devel-docs/release-howto.txt?h=master] + +They are currently different, for the sole reason that the most recent editor of the file is pretending to be the 2.8 release manager and doesn't care that much about 2.9 development releases :) + +Following these howtos is important for getting consistent and complete release tarballs. + +Important: making a release is a process, not an instantaneous event. + + +* plan ahead +* announce planned releases a few weeks in advance to the gnome-i18n list to get translations updated +* make changes before you do the release +** for example, update the NEWS +** prepare a local branch for the website changes +** familiarize yourself with the tools +** for example, update the NEWS +** prepare a local branch for the website changes +** familiarize yourself with the tools +* for example, update the NEWS +* prepare a local branch for the website changes +* familiarize yourself with the tools + + + + +==Microsoft Windows release== + +'''Current release maintainers''': Ender (stable) and Drawoc (nightly). + + +===Procedure=== + +The stable release procedure uses some scripts available [http://eternallybored.org/misc/gimp/ there] and some files in `build/windows/` in GIMP repository. +But the exact procedure and how to use these scripts seems to be unknown to all but Ender. + +There exists also a nightly build system maintained by Drawoc, using jhbuild and files in `build/windows/jhbuild/` in GIMP repository. + + +===NOTES=== + +1) Two ''fontconfig'' configuration issues specific to the Windows build must be taken care of in the release: + + +* The [https://bugzilla.gnome.org/show_bug.cgi?id=708110 conf.d path bug]: fixed either with a patch in the repo (`build/windows/jhbuild/patches/fontconfig-fix-config-dir.patch`) or by using fontconfig >= 2.11.0. + +* [https://bugzilla.gnome.org/show_bug.cgi?id=703331 Better fontconfig cache directory]: still in discussion upstream, but if we feel this is the way, we should already apply the [https://bugs.freedesktop.org/show_bug.cgi?id=71691 patch available on Freedesktop bug tracker]. + +2) Make sure the following Windows registry keys are set/updated to the right value: + +
    [HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP]
    +@=”Edit with GIMP”
    +
    +[HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Edit with GIMP\command]
    +@=”\”C:\\Program Files\\GIMP 2\\bin\\gimp-2.10.exe\” \”%1\””
    +
    + +It seems to be a common problem that the "Open with GIMP" right click menu gets lost on some update. Let's make sure this is not the case (see [https://bugzilla.gnome.org/show_bug.cgi?id=752759 bug 752759]). + +3) There is a known GTK+ bug where shortcuts don't work on non-latin locales (Windows-only). This has been fixed for 2.24.32. Our official release should contain thi version of GTK+ or above (see [https://bugzilla.gnome.org/show_bug.cgi?id=769550 bug 769550]). + + +===TODO=== + +* Sync the nightly and the stable release procedures. + +* Write down the exact procedure (both on this wiki and in the repo, for instance, it could be in `build/windows/README.release`), so that anyone could be able to build one's own non-official release (whether for testing, development, or simply to pass down the information). + +* All the files necessary for the release should be available in the repo. There should not be files available spread out on third-party servers. + +==OSX Release== + +'''Current release maintainers''': ? + +There are at least four people working on an OS X release: Clayton Walker, Simone Karin Lehmann, Partha Bagchi and David Evans (Macports), not to mention the (still active?) maintainer of the outdated Fink build. + + +===Procedure=== + +''TODO'' + + +===Notes=== + +Clayton Walker proposed to update the ''fontconfig'' cache directory for the OSX build, but it has been [https://bugs.freedesktop.org/show_bug.cgi?id=71715 rejected upstream]. + +Well maybe all the OSX package maintainers and developers in our team could discuss this, and if they all agreed a change in fontconfig cache was in order for the OSX build, well you can configure it appropriately. Even though a change upstream is nicer, that's still only a configuration change, so we should do it. + + +===TODO=== + +* All maintainers struggle alone with the special build issues of GIMP on OS X, its dependencies and the API incompatibilities between the various OS X versions. + +Can you guys and girls please find a way to work together? +Ideally there would be only one GIMP release. Nevertheless if API/dependency incompatibilities were to force us to make several OSX releases, we should still have a common procedure to facilitate the work. + + +* If we manage to sync all the OSX releases, the chosen procedure should be written down (both on this wiki and in the repo, for instance, it could be in `build/osx/README.release`). + +* All release scripts and other necessary files should be added to the repository at `build/osx/`. diff --git a/wiki/Release:Misc-20161024010210-edit.txt b/wiki/Release:Misc-20161024010210-edit.txt new file mode 100644 index 0000000..eb7bc3b --- /dev/null +++ b/wiki/Release:Misc-20161024010210-edit.txt @@ -0,0 +1,769 @@ +This page is a collection of several release related articles that don't belong anywhere else. + +__TOC__ + +=Release history= +To find out release dates and notes of each version you can look into the following table.
    +Use your browser's search function to quickly jump to a particular version.
    +Even minor version numbers mark stable releases, odd minor numbers mark development releases. + +==History== + +{| class="wikitable sortable mw-collapsible" align="center" border="1" +! scope="col" | Version +! scope="col" | Date +! scope="col" | Release notes +! class="unsortable"class="unsortable" | +|- +| {{hsk|GIMP_002_008_010}} 2.8.10 +| {{hsk|2013-11-28}} 28.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_10 Release notes] +|- +| {{hsk|GIMP_002_008_008}} 2.8.8 +| {{hsk|2013-11-03}} 03.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_8 Release notes] +|- +| {{hsk|GIMP_002_008_006}} 2.8.6 +| {{hsk|2013-06-22}} 22.06.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_6 Release notes] +|- +| {{hsk|GIMP_002_008_004}} 2.8.4 +| {{hsk|2013-02-05}} 05.02.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_4 Release notes] +|- +| {{hsk|GIMP_002_008_002}} 2.8.2 +| {{hsk|2012-08-23}} 23.08.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_2 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_008_000}} 2.8.0 +| {{hsk|2012-05-02}} 02.05.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_0 Release notes] +|- +| {{hsk|GIMP_002_007_005}} 2.7.5 +| {{hsk|2012-03-13}} 13.03.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_5 Release notes] +|- +| {{hsk|GIMP_002_006_012}} 2.6.12 +| {{hsk|2012-01-31}} 31.01.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_12 Release notes] +|- +| {{hsk|GIMP_002_007_004}} 2.7.4 +| {{hsk|2011-12-11}} 11.12.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_4 Release notes] +|- +| {{hsk|GIMP_002_007_003}} 2.7.3 +| {{hsk|2011-08-21}} 21.08.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_3 Release notes] +|- +| {{hsk|GIMP_002_007_002}} 2.7.2 +| {{hsk|2011-04-14}} 14.04.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_2 Release notes] +|- +| {{hsk|GIMP_002_006_011}} 2.6.11 +| {{hsk|2010-10-03}} 03.10.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_11 Release notes] +|- +| {{hsk|GIMP_002_006_010}} 2.6.10 +| {{hsk|2010-07-07}} 07.07.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_10 Release notes] +|- +| {{hsk|GIMP_002_007_001}} 2.7.1 +| {{hsk|2010-06-29}} 29.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_1 Release notes] +|- +| {{hsk|GIMP_002_006_009}} 2.6.9 +| {{hsk|2010-06-22}} 22.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_9 Release notes] +|- +| {{hsk|GIMP_002_006_008}} 2.6.8 +| {{hsk|2009-12-10}} 10.12.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_8 Release notes] +|- +| {{hsk|GIMP_002_007_000}} 2.7.0 +| {{hsk|2009-08-15}} 15.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_0 Release notes] +|- +| {{hsk|GIMP_002_006_007}} 2.6.7 +| {{hsk|2009-08-13}} 13.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_7 Release notes] +|- +| {{hsk|GIMP_002_006_006}} 2.6.6 +| {{hsk|2009-03-16}} 16.03.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_6 Release notes] +|- +| {{hsk|GIMP_002_006_005}} 2.6.5 +| {{hsk|2009-02-15}} 15.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_5 Release notes] +|- +| {{hsk|GIMP_002_006_004}} 2.6.4 +| {{hsk|2009-02-14}} 14.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_4 Release notes] +|- +| {{hsk|GIMP_002_006_003}} 2.6.3 +| {{hsk|2008-11-21}} 21.11.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_3 Release notes] +|- +| {{hsk|GIMP_002_006_002}} 2.6.2 +| {{hsk|2008-10-30}} 30.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_2 Release notes] +|- +| {{hsk|GIMP_002_006_001}} 2.6.1 +| {{hsk|2008-10-08}} 08.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_006_000}} 2.6.0 +| {{hsk|2008-09-30}} 30.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_0 Release notes] +|- +| {{hsk|GIMP_002_005_004}} 2.5.4 +| {{hsk|2008-09-16}} 16.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_4 Release notes] +|- +| {{hsk|GIMP_002_005_003}} 2.5.3 +| {{hsk|2008-08-21}} 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_3 Release notes] +|- +| {{hsk|GIMP_002_004_007}} 2.4.7 +| {{hsk|2008-08-21}} 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_7 Release notes] +|- +| {{hsk|GIMP_002_005_002}} 2.5.2 +| {{hsk|2008-07-16}} 16.07.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_2 Release notes] +|- +| {{hsk|GIMP_002_005_001}} 2.5.1 +| {{hsk|2008-06-15}} 15.06.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_1 Release notes] +|- +| {{hsk|GIMP_002_004_006}} 2.4.6 +| {{hsk|2008-05-29}} 29.05.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_6 Release notes] +|- +| {{hsk|GIMP_002_005_000}} 2.5.0 +| {{hsk|2008-04-09}} 09.04.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_0 Release notes] +|- +| {{hsk|GIMP_002_004_005}} 2.4.5 +| {{hsk|2008-02-29}} 29.02.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_5 Release notes] +|- +| {{hsk|GIMP_002_004_004}} 2.4.4 +| {{hsk|2008-01-30}} 30.01.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_4 Release notes] +|- +| {{hsk|GIMP_002_004_003}} 2.4.3 +| {{hsk|2007-12-16}} 16.12.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_3 Release notes] +|- +| {{hsk|GIMP_002_004_002}} 2.4.2 +| {{hsk|2007-11-20}} 20.11.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_2 Release notes] +|- +| {{hsk|GIMP_002_004_001}} 2.4.1 +| {{hsk|2007-10-31}} 31.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_004_000}} 2.4.0 +| {{hsk|2007-10-23}} 23.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_0 Release notes] +|- +| {{hsk|GIMP_002_003_019}} 2.3.19 +| {{hsk|2007-07-24}} 24.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_19 Release notes] +|- +| {{hsk|GIMP_002_002_017}} 2.2.17 +| {{hsk|2007-07-13}} 13.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_17 Release notes] +|- +| {{hsk|GIMP_002_002_016}} 2.2.16 +| {{hsk|2007-07-06}} 06.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_16 Release notes] +|- +| {{hsk|GIMP_002_003_018}} 2.3.18 +| {{hsk|2007-06-11}} 11.06.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_18 Release notes] +|- +| {{hsk|GIMP_002_003_017}} 2.3.17 +| {{hsk|2007-05-27}} 27.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_17 Release notes] +|- +| {{hsk|GIMP_002_002_015}} 2.2.15 +| {{hsk|2007-05-26}} 26.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_15 Release notes] +|- +| {{hsk|GIMP_002_003_016}} 2.3.16 +| {{hsk|2007-04-24}} 24.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_16 Release notes] +|- +| {{hsk|GIMP_002_002_014}} 2.2.14 +| {{hsk|2007-04-17}} 17.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_14 Release notes] +|- +| {{hsk|GIMP_002_003_015}} 2.3.15 +| {{hsk|2007-03-09}} 09.03.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_15 Release notes] +|- +| {{hsk|GIMP_002_003_014}} 2.3.14 +| {{hsk|2007-01-23}} 23.01.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_14 Release notes] +|- +| {{hsk|GIMP_002_003_013}} 2.3.13 +| {{hsk|2006-11-23}} 23.11.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_13 Release notes] +|- +| {{hsk|GIMP_002_003_012}} 2.3.12 +| {{hsk|2006-10-11}} 11.10.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_12 Release notes] +|- +| {{hsk|GIMP_002_003_011}} 2.3.11 +| {{hsk|2006-09-07}} 07.09.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_11 Release notes] +|- +| {{hsk|GIMP_002_002_013}} 2.2.13 +| {{hsk|2006-08-24}} 24.08.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_13 Release notes] +|- +| {{hsk|GIMP_002_002_012}} 2.2.12 +| {{hsk|2006-07-06}} 06.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_12 Release notes] +|- +| {{hsk|GIMP_002_003_010}} 2.3.10 +| {{hsk|2006-07-05}} 05.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_10 Release notes] +|- +| {{hsk|GIMP_002_003_009}} 2.3.9 +| {{hsk|2006-06-05}} 05.06.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_9 Release notes] +|- +| {{hsk|GIMP_002_002_011}} 2.2.11 +| {{hsk|2006-04-13}} 13.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_11 Release notes] +|- +| {{hsk|GIMP_002_003_008}} 2.3.8 +| {{hsk|2006-04-12}} 12.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_8 Release notes] +|- +| {{hsk|GIMP_002_003_007}} 2.3.7 +| {{hsk|2006-02-08}} 08.02.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_7 Release notes] +|- +| {{hsk|GIMP_002_003_006}} 2.3.6 +| {{hsk|2005-12-28}} 28.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_6 Release notes] +|- +| {{hsk|GIMP_002_002_010}} 2.2.10 +| {{hsk|2005-12-27}} 27.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_10 Release notes] +|- +| {{hsk|GIMP_002_003_005}} 2.3.5 +| {{hsk|2005-11-04}} 04.11.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_5 Release notes] +|- +| {{hsk|GIMP_002_002_009}} 2.2.9 +| {{hsk|2005-10-27}} 27.10.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_9 Release notes] +|- +| {{hsk|GIMP_002_003_004}} 2.3.4 +| {{hsk|2005-09-26}} 26.09.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_4 Release notes] +|- +| {{hsk|GIMP_002_003_003}} 2.3.3 +| {{hsk|2005-08-10}} 10.08.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_3 Release notes] +|- +| {{hsk|GIMP_002_003_002}} 2.3.2 +| {{hsk|2005-07-01}} 01.07.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_2 Release notes] +|- +| {{hsk|GIMP_002_002_008}} 2.2.8 +| {{hsk|2005-06-26}} 26.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_8 Release notes] +|- +| {{hsk|GIMP_002_003_001}} 2.3.1 +| {{hsk|2005-06-09}} 09.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_1 Release notes] +|- +| {{hsk|GIMP_002_003_000}} 2.3.0 +| {{hsk|2005-05-14}} 14.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_0 Release notes] +|- +| {{hsk|GIMP_002_002_007}} 2.2.7 +| {{hsk|2005-05-08}} 08.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_7 Release notes] +|- +| {{hsk|GIMP_002_002_006}} 2.2.6 +| {{hsk|2005-04-10}} 10.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_6 Release notes] +|- +| {{hsk|GIMP_002_002_005}} 2.2.5 +| {{hsk|2005-04-09}} 09.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_5 Release notes] +|- +| {{hsk|GIMP_002_002_004}} 2.2.4 +| {{hsk|2005-02-22}} 22.02.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_4 Release notes] +|- +| {{hsk|GIMP_002_002_003}} 2.2.3 +| {{hsk|2005-01-22}} 22.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_3 Release notes] +|- +| {{hsk|GIMP_002_002_002}} 2.2.2 +| {{hsk|2005-01-09}} 09.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_2 Release notes] +|- +| {{hsk|GIMP_002_002_001}} 2.2.1 +| {{hsk|2004-12-28}} 28.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_002_000}} 2.2.0 +| {{hsk|2004-12-19}} 19.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_0 Release notes] +|- +| {{hsk|GIMP_002_000_006}} 2.0.6 +| {{hsk|2004-11-02}} 02.11.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_6 Release notes] +|- +| {{hsk|GIMP_002_001_007}} 2.1.7 +| {{hsk|2004-10-14}} 14.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_7 Release notes] +|- +| {{hsk|GIMP_002_001_006}} 2.1.6 +| {{hsk|2004-10-05}} 05.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_6 Release notes] +|- +| {{hsk|GIMP_002_000_005}} 2.0.5 +| {{hsk|2004-09-25}} 25.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_5 Release notes] +|- +| {{hsk|GIMP_002_001_005}} 2.1.5 +| {{hsk|2004-09-19}} 19.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_5 Release notes] +|- +| {{hsk|GIMP_002_001_004}} 2.1.4 +| {{hsk|2004-09-05}} 05.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_4 Release notes] +|- +| {{hsk|GIMP_002_001_003}} 2.1.3 +| {{hsk|2004-08-06}} 06.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_3 Release notes] +|- +| {{hsk|GIMP_002_000_004}} 2.0.4 +| {{hsk|2004-08-05}} 05.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_4 Release notes] +|- +| {{hsk|GIMP_002_001_002}} 2.1.2 +| {{hsk|2004-07-20}} 20.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_2 Release notes] +|- +| {{hsk|GIMP_002_000_003}} 2.0.3 +| {{hsk|2004-07-17}} 17.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_3 Release notes] +|- +| {{hsk|GIMP_002_001_001}} 2.1.1 +| {{hsk|2004-06-24}} 24.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_1 Release notes] +|- +| {{hsk|GIMP_002_000_002}} 2.0.2 +| {{hsk|2004-06-15}} 15.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_2 Release notes] +|- +| {{hsk|GIMP_002_001_000}} 2.1.0 +| {{hsk|2004-06-02}} 02.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_0 Release notes] +|- +| {{hsk|GIMP_002_000_001}} 2.0.1 +| {{hsk|2004-04-13}} 13.04.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_000_000}} 2.0.0 +| {{hsk|2004-03-23}} 23.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_0 Release notes] +|- +| {{hsk|GIMP_001_003_027}} 1.3.27 +| {{hsk|2004-03-04}} 04.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_27 Release notes] +|- +| {{hsk|GIMP_001_003_026}} 1.3.26 +| {{hsk|2004-02-04}} 04.02.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_26 Release notes] +|- +| {{hsk|GIMP_001_003_025}} 1.3.25 +| {{hsk|2004-01-19}} 19.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_25 Release notes] +|- +| {{hsk|GIMP_001_003_024}} 1.3.24 +| {{hsk|2004-01-07}} 07.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_24 Release notes] +|- +| {{hsk|GIMP_001_003_023}} 1.3.23 +| {{hsk|2003-11-24}} 24.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_23 Release notes] +|- +| {{hsk|GIMP_001_003_022}} 1.3.22 +| {{hsk|2003-11-03}} 03.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_22 Release notes] +|- +| {{hsk|GIMP_001_003_021}} 1.3.21 +| {{hsk|2003-10-05}} 05.10.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_21 Release notes] +|- +| {{hsk|GIMP_001_003_020}} 1.3.20 +| {{hsk|2003-09-07}} 07.09.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_20 Release notes] +|- +| {{hsk|GIMP_001_003_019}} 1.3.19 +| {{hsk|2003-08-27}} 27.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_19 Release notes] +|- +| {{hsk|GIMP_001_003_018}} 1.3.18 +| {{hsk|2003-08-11}} 11.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_18 Release notes] +|- +| {{hsk|GIMP_001_003_017}} 1.3.17 +| {{hsk|2003-07-25}} 25.07.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_17 Release notes] +|- +| {{hsk|GIMP_001_003_016}} 1.3.16 +| {{hsk|2003-06-27}} 27.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_16 Release notes] +|- +| {{hsk|GIMP_001_002_005}} 1.2.5 +| {{hsk|2003-06-14}} 14.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_5 Release notes] +|- +| {{hsk|GIMP_001_003_015}} 1.3.15 +| {{hsk|2003-06-09}} 09.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_15 Release notes] +|- +| {{hsk|GIMP_001_002_004}} 1.2.4 +| {{hsk|2003-05-20}} 20.05.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_4 Release notes] +|- +| {{hsk|GIMP_001_003_014}} 1.3.14 +| {{hsk|2003-04-14}} 14.04.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_14 Release notes] +|- +| {{hsk|GIMP_001_003_013}} 1.3.13 +| {{hsk|2003-03-23}} 23.03.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_13 Release notes] +|- +| {{hsk|GIMP_001_003_012}} 1.3.12 +| {{hsk|2003-02-18}} 18.02.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_12 Release notes] +|- +| {{hsk|GIMP_001_003_011}} 1.3.11 +| {{hsk|2002-12-30}} 30.12.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_11 Release notes] +|- +| {{hsk|GIMP_001_003_010}} 1.3.10 +| {{hsk|2002-11-07}} 07.11.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_10 Release notes] +|- +| {{hsk|GIMP_001_003_009}} 1.3.9 +| {{hsk|2002-10-11}} 11.10.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_9 Release notes] +|- +| {{hsk|GIMP_001_003_008}} 1.3.8 +| {{hsk|2002-08-20}} 20.08.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_8 Release notes] +|- +| {{hsk|GIMP_001_003_007}} 1.3.7 +| {{hsk|2002-05-30}} 30.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_7 Release notes] +|- +| {{hsk|GIMP_001_003_006}} 1.3.6 +| {{hsk|2002-05-29}} 29.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_6 Release notes] +|- +| {{hsk|GIMP_001_003_005}} 1.3.5 +| {{hsk|2002-03-28}} 28.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_5 Release notes] +|- +| {{hsk|GIMP_001_003_004}} 1.3.4 +| {{hsk|2002-03-09}} 09.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_4 Release notes] +|- +| {{hsk|GIMP_001_003_003}} 1.3.3 +| {{hsk|2002-02-10}} 10.02.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_3 Release notes] +|- +| {{hsk|GIMP_001_003_002}} 1.3.2 +| {{hsk|2001-12-29}} 29.12.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_2 Release notes] +|- +| {{hsk|GIMP_001_003_001}} 1.3.1 +| {{hsk|2001-11-25}} 25.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_1 Release notes] +|- +| {{hsk|GIMP_001_003_000}} 1.3.0 +| {{hsk|2001-11-13}} 13.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_0 Release notes] +|- +| {{hsk|GIMP_001_002_002}} 1.2.2 +| {{hsk|2001-07-26}} 26.07.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_2 Release notes] +|- +| {{hsk|GIMP_001_002_001}} 1.2.1 +| {{hsk|2001-01-22}} 22.01.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_001_002_000}} 1.2.0 +| {{hsk|2000-12-25}} 25.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_0 Release notes] +|- +| {{hsk|GIMP_001_001_032}} 1.1.32 +| {{hsk|2000-12-21}} 21.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_32 Release notes] +|- +| {{hsk|GIMP_001_001_031}} 1.1.31 +| {{hsk|2000-12-19}} 19.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_31 Release notes] +|- +| {{hsk|GIMP_001_001_030}} 1.1.30 +| {{hsk|2000-12-10}} 10.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_30 Release notes] +|- +| {{hsk|GIMP_001_001_029}} 1.1.29 +| {{hsk|2000-10-31}} 31.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_29 Release notes] +|- +| {{hsk|GIMP_001_001_028}} 1.1.28 +| {{hsk|2000-10-16}} 16.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_28 Release notes] +|- +| {{hsk|GIMP_001_001_027}} 1.1.27 +| {{hsk|2000-10-04}} 04.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_27 Release notes] +|- +| {{hsk|GIMP_001_001_026}} 1.1.26 +| {{hsk|2000-09-23}} 23.09.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_26 Release notes] +|- +| {{hsk|GIMP_001_001_025}} 1.1.25 +| {{hsk|2000-08-21}} 21.08.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_25 Release notes] +|- +| {{hsk|GIMP_001_001_024}} 1.1.24 +| {{hsk|2000-06-22}} 22.06.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_24 Release notes] +|- +| {{hsk|GIMP_001_001_023}} 1.1.23 +| {{hsk|2000-05-28}} 28.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_23 Release notes] +|- +| {{hsk|GIMP_001_001_022}} 1.1.22 +| {{hsk|2000-05-16}} 16.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_22 Release notes] +|- +| {{hsk|GIMP_001_001_021}} 1.1.21 +| {{hsk|2000-05-01}} 01.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_21 Release notes] +|- +| {{hsk|GIMP_001_001_020}} 1.1.20 +| {{hsk|2000-04-22}} 22.04.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_20 Release notes] +|- +| {{hsk|GIMP_001_001_019}} 1.1.19 +| {{hsk|2000-03-30}} 30.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_19 Release notes] +|- +| {{hsk|GIMP_001_001_018}} 1.1.18 +| {{hsk|2000-03-04}} 04.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_18 Release notes] +|- +| {{hsk|GIMP_001_001_017}} 1.1.17 +| {{hsk|2000-02-12}} 12.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_17 Release notes] +|- +| {{hsk|GIMP_001_001_016}} 1.1.16 +| {{hsk|2000-02-02}} 02.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_16 Release notes] +|- +| {{hsk|GIMP_001_001_015}} 1.1.15 +| {{hsk|2000-01-14}} 14.01.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_15 Release notes] +|- +| {{hsk|GIMP_001_001_014}} 1.1.14 +| {{hsk|1999-12-16}} 16.12.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_14 Release notes] +|- +| {{hsk|GIMP_001_001_013}} 1.1.13 +| {{hsk|1999-11-25}} 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_13 Release notes] +|- +| {{hsk|GIMP_001_001_012}} 1.1.12 +| {{hsk|1999-11-25}} 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_12 Release notes] +|- +| {{hsk|GIMP_001_001_011}} 1.1.11 +| {{hsk|1999-11-01}} 01.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_11 Release notes] +|- +| {{hsk|GIMP_001_001_010}} 1.1.10 +| {{hsk|1999-10-06}} 06.10.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_10 Release notes] +|- +| {{hsk|GIMP_001_001_009}} 1.1.9 +| {{hsk|1999-09-10}} 10.09.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_9 Release notes] +|- +| {{hsk|GIMP_001_001_008}} 1.1.8 +| {{hsk|1999-08-02}} 02.08.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_8 Release notes] +|- +| {{hsk|GIMP_001_001_007}} 1.1.7 +| {{hsk|1999-07-17}} 17.07.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_7 Release notes] +|- +| {{hsk|GIMP_001_001_006}} 1.1.6 +| {{hsk|1999-06-06}} 06.06.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_6 Release notes] +|- +| {{hsk|GIMP_001_001_005}} 1.1.5 +| {{hsk|1999-05-03}} 03.05.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_5 Release notes] +|- +| {{hsk|GIMP_001_000_004}} 1.0.4 +| {{hsk|1999-04-04}} 04.04.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_4 Release notes] +|- +| {{hsk|GIMP_001_001_004}} 1.1.4 +| {{hsk|1999-03-30}} 30.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_4 Release notes] +|- +| {{hsk|GIMP_001_000_003}} 1.0.3 +| {{hsk|1999-03-29}} 29.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_3 Release notes] +|- +| {{hsk|GIMP_001_001_003}} 1.1.3 +| {{hsk|1999-03-09}} 09.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_3 Release notes] +|- +| {{hsk|GIMP_001_001_002}} 1.1.2 +| {{hsk|1999-02-04}} 04.02.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_2 Release notes] +|- +| {{hsk|GIMP_001_001_001}} 1.1.1 +| {{hsk|1999-01-21}} 21.01.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_1 Release notes] +|- +| {{hsk|GIMP_001_001_000}} 1.1.0 +| {{hsk|1998-12-24}} 24.12.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_0 Release notes] +|- +| {{hsk|GIMP_001_000_002}} 1.0.2 +| {{hsk|1998-10-15}} 15.10.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_2 Release notes] +|- +| {{hsk|GIMP_001_000_001}} 1.0.1 +| {{hsk|1998-09-27}} 27.09.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_001_000_000}} 1.0.0 +| {{hsk|1998-06-05}} 05.06.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_0 Release notes] +|- +| {{hsk|GIMP_000_099_029}} 0.99.29 +| {{hsk|1998-05-05}} 05.05.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_29 Release notes] +|- +| {{hsk|GIMP_000_099_028}} 0.99.28 +| {{hsk|1998-04-26}} 26.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_28 Release notes] +|- +| {{hsk|GIMP_000_099_027}} 0.99.27 +| {{hsk|1998-04-18}} 18.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_27 Release notes] +|- +| {{hsk|GIMP_000_099_025}} 0.99.25 +| {{hsk|1998-04-11}} 11.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_25 Release notes] +|- +| {{hsk|GIMP_000_099_024}} 0.99.24 +| {{hsk|1998-04-08}} 08.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_24 Release notes] +|- +| {{hsk|GIMP_000_099_023}} 0.99.23 +| {{hsk|1998-03-27}} 27.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_23 Release notes] +|- +| {{hsk|GIMP_000_099_022}} 0.99.22 +| {{hsk|1998-03-20}} 20.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_22 Release notes] +|- +| {{hsk|GIMP_000_099_021}} 0.99.21 +| {{hsk|1998-03-15}} 15.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_21 Release notes] +|- +| {{hsk|GIMP_000_099_020}} 0.99.20 +| {{hsk|1998-03-12}} 12.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_20 Release notes] +|- +| {{hsk|GIMP_000_099_019}} 0.99.19 +| {{hsk|1998-03-02}} 02.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_19 Release notes] +|- +| {{hsk|GIMP_000_099_018}} 0.99.18 +| {{hsk|1998-01-26}} 26.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_18 Release notes] +|- +| {{hsk|GIMP_000_099_017}} 0.99.17 +| {{hsk|1998-01-04}} 04.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_17 Release notes] +|- +| {{hsk|GIMP_000_099_016}} 0.99.16 +| {{hsk|1997-12-15}} 15.12.1997 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_16 Release notes] +|} + +==How to update the history== +To update the history you can use the following script under Linux: +
    +#! /bin/bash
    +# Purpose: Update the release history in the developer wiki
    +# Author:  Sven Claussner
    +# License: GNU General Public License 3
    +#          See http://www.gnu.org/copyleft/gpl.html for full text.
    +
    +echo "==History=="
    +echo ""
    +echo "{| class=\"wikitable sortable mw-collapsible\" align=\"center\" border=\"1\""
    +echo "! scope=\"col\" | Version"
    +echo "! scope=\"col\" | Date"
    +echo "! scope=\"col\" | Release notes"
    +echo "! class=\"unsortable\"class=\"unsortable\"  |"
    +git for-each-ref --format="%(refname) %(taggerdate:short) %(refname)" --sort=-taggerdate refs/tags | \
    +grep /GIMP_[0-9]_[0-9_]*$ | \
    +awk '{
    +          gsub("refs/tags/","");
    +          if ( $3 ~ /[02468]_0$/ )
    +              print "|- bgcolor=\"Silver\"";
    +          else
    +              print "|-";
    +
    +          split($1,version,"_");
    +          major_v=sprintf("%.3d",version[2]);
    +          minor_v=sprintf("%.3d",version[3]);
    +          micro_v=sprintf("%.3d",version[4]);
    +          version_key=version[1] "_" major_v "_" minor_v "_" micro_v;
    +          version_display=version[2] "." version[3] "." version[4];
    +
    +          split($2,tag_date,"-");
    +          year=tag_date[1];
    +          month=sprintf("%.2d",tag_date[2]);
    +          day=sprintf("%.2d",tag_date[3]);
    +          date_key= year "-" month "-" day;
    +          date_display= day "." month "." year;
    +
    +          print "| {{hsk|" version_key "}} " version_display;
    +          print "| {{hsk|" date_key "}} " date_display;
    +          if ( $3 !~ /GIMP_0/ )
    +              print "| [https://git.gnome.org/browse/gimp/tree/NEWS?id=" $3 " Release notes]";
    +          else
    +              print "| [https://git.gnome.org/browse/gimp/tree/README?id=" $3 " Release notes]";
    +         }'
    +echo "|}"
    +
    +This will regenerate the whole history. + +Then open the chapter "History" here and insert the output. diff --git a/wiki/Release:Misc-20180812150607-show.txt b/wiki/Release:Misc-20180812150607-show.txt new file mode 100644 index 0000000..203822e --- /dev/null +++ b/wiki/Release:Misc-20180812150607-show.txt @@ -0,0 +1,782 @@ + + +This page is a collection of several release related articles that don't belong anywhere else. + + +__TOC__ + +=Release history= + +To find out release dates and notes of each version you can look into the following table. + +Use your browser's search function to quickly jump to a particular version. + +Even minor version numbers mark stable releases, odd minor numbers mark development releases. + + +==History== + +{| class="wikitable" +|- +! Version +! Date +! Release notes +! +|- +| GIMP_002_008_010 2.8.10 +| 2013-11-28 28.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_10 Release notes] +|- +| GIMP_002_008_008 2.8.8 +| 2013-11-03 03.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_8 Release notes] +|- +| GIMP_002_008_006 2.8.6 +| 2013-06-22 22.06.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_6 Release notes] +|- +| GIMP_002_008_004 2.8.4 +| 2013-02-05 05.02.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_4 Release notes] +|- +| GIMP_002_008_002 2.8.2 +| 2012-08-23 23.08.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_2 Release notes] +|- +| GIMP_002_008_000 2.8.0 +| 2012-05-02 02.05.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_0 Release notes] +|- +| GIMP_002_007_005 2.7.5 +| 2012-03-13 13.03.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_5 Release notes] +|- +| GIMP_002_006_012 2.6.12 +| 2012-01-31 31.01.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_12 Release notes] +|- +| GIMP_002_007_004 2.7.4 +| 2011-12-11 11.12.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_4 Release notes] +|- +| GIMP_002_007_003 2.7.3 +| 2011-08-21 21.08.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_3 Release notes] +|- +| GIMP_002_007_002 2.7.2 +| 2011-04-14 14.04.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_2 Release notes] +|- +| GIMP_002_006_011 2.6.11 +| 2010-10-03 03.10.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_11 Release notes] +|- +| GIMP_002_006_010 2.6.10 +| 2010-07-07 07.07.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_10 Release notes] +|- +| GIMP_002_007_001 2.7.1 +| 2010-06-29 29.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_1 Release notes] +|- +| GIMP_002_006_009 2.6.9 +| 2010-06-22 22.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_9 Release notes] +|- +| GIMP_002_006_008 2.6.8 +| 2009-12-10 10.12.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_8 Release notes] +|- +| GIMP_002_007_000 2.7.0 +| 2009-08-15 15.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_0 Release notes] +|- +| GIMP_002_006_007 2.6.7 +| 2009-08-13 13.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_7 Release notes] +|- +| GIMP_002_006_006 2.6.6 +| 2009-03-16 16.03.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_6 Release notes] +|- +| GIMP_002_006_005 2.6.5 +| 2009-02-15 15.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_5 Release notes] +|- +| GIMP_002_006_004 2.6.4 +| 2009-02-14 14.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_4 Release notes] +|- +| GIMP_002_006_003 2.6.3 +| 2008-11-21 21.11.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_3 Release notes] +|- +| GIMP_002_006_002 2.6.2 +| 2008-10-30 30.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_2 Release notes] +|- +| GIMP_002_006_001 2.6.1 +| 2008-10-08 08.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_1 Release notes] +|- +| GIMP_002_006_000 2.6.0 +| 2008-09-30 30.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_0 Release notes] +|- +| GIMP_002_005_004 2.5.4 +| 2008-09-16 16.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_4 Release notes] +|- +| GIMP_002_005_003 2.5.3 +| 2008-08-21 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_3 Release notes] +|- +| GIMP_002_004_007 2.4.7 +| 2008-08-21 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_7 Release notes] +|- +| GIMP_002_005_002 2.5.2 +| 2008-07-16 16.07.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_2 Release notes] +|- +| GIMP_002_005_001 2.5.1 +| 2008-06-15 15.06.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_1 Release notes] +|- +| GIMP_002_004_006 2.4.6 +| 2008-05-29 29.05.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_6 Release notes] +|- +| GIMP_002_005_000 2.5.0 +| 2008-04-09 09.04.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_0 Release notes] +|- +| GIMP_002_004_005 2.4.5 +| 2008-02-29 29.02.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_5 Release notes] +|- +| GIMP_002_004_004 2.4.4 +| 2008-01-30 30.01.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_4 Release notes] +|- +| GIMP_002_004_003 2.4.3 +| 2007-12-16 16.12.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_3 Release notes] +|- +| GIMP_002_004_002 2.4.2 +| 2007-11-20 20.11.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_2 Release notes] +|- +| GIMP_002_004_001 2.4.1 +| 2007-10-31 31.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_1 Release notes] +|- +| GIMP_002_004_000 2.4.0 +| 2007-10-23 23.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_0 Release notes] +|- +| GIMP_002_003_019 2.3.19 +| 2007-07-24 24.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_19 Release notes] +|- +| GIMP_002_002_017 2.2.17 +| 2007-07-13 13.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_17 Release notes] +|- +| GIMP_002_002_016 2.2.16 +| 2007-07-06 06.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_16 Release notes] +|- +| GIMP_002_003_018 2.3.18 +| 2007-06-11 11.06.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_18 Release notes] +|- +| GIMP_002_003_017 2.3.17 +| 2007-05-27 27.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_17 Release notes] +|- +| GIMP_002_002_015 2.2.15 +| 2007-05-26 26.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_15 Release notes] +|- +| GIMP_002_003_016 2.3.16 +| 2007-04-24 24.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_16 Release notes] +|- +| GIMP_002_002_014 2.2.14 +| 2007-04-17 17.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_14 Release notes] +|- +| GIMP_002_003_015 2.3.15 +| 2007-03-09 09.03.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_15 Release notes] +|- +| GIMP_002_003_014 2.3.14 +| 2007-01-23 23.01.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_14 Release notes] +|- +| GIMP_002_003_013 2.3.13 +| 2006-11-23 23.11.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_13 Release notes] +|- +| GIMP_002_003_012 2.3.12 +| 2006-10-11 11.10.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_12 Release notes] +|- +| GIMP_002_003_011 2.3.11 +| 2006-09-07 07.09.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_11 Release notes] +|- +| GIMP_002_002_013 2.2.13 +| 2006-08-24 24.08.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_13 Release notes] +|- +| GIMP_002_002_012 2.2.12 +| 2006-07-06 06.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_12 Release notes] +|- +| GIMP_002_003_010 2.3.10 +| 2006-07-05 05.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_10 Release notes] +|- +| GIMP_002_003_009 2.3.9 +| 2006-06-05 05.06.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_9 Release notes] +|- +| GIMP_002_002_011 2.2.11 +| 2006-04-13 13.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_11 Release notes] +|- +| GIMP_002_003_008 2.3.8 +| 2006-04-12 12.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_8 Release notes] +|- +| GIMP_002_003_007 2.3.7 +| 2006-02-08 08.02.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_7 Release notes] +|- +| GIMP_002_003_006 2.3.6 +| 2005-12-28 28.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_6 Release notes] +|- +| GIMP_002_002_010 2.2.10 +| 2005-12-27 27.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_10 Release notes] +|- +| GIMP_002_003_005 2.3.5 +| 2005-11-04 04.11.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_5 Release notes] +|- +| GIMP_002_002_009 2.2.9 +| 2005-10-27 27.10.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_9 Release notes] +|- +| GIMP_002_003_004 2.3.4 +| 2005-09-26 26.09.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_4 Release notes] +|- +| GIMP_002_003_003 2.3.3 +| 2005-08-10 10.08.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_3 Release notes] +|- +| GIMP_002_003_002 2.3.2 +| 2005-07-01 01.07.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_2 Release notes] +|- +| GIMP_002_002_008 2.2.8 +| 2005-06-26 26.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_8 Release notes] +|- +| GIMP_002_003_001 2.3.1 +| 2005-06-09 09.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_1 Release notes] +|- +| GIMP_002_003_000 2.3.0 +| 2005-05-14 14.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_0 Release notes] +|- +| GIMP_002_002_007 2.2.7 +| 2005-05-08 08.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_7 Release notes] +|- +| GIMP_002_002_006 2.2.6 +| 2005-04-10 10.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_6 Release notes] +|- +| GIMP_002_002_005 2.2.5 +| 2005-04-09 09.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_5 Release notes] +|- +| GIMP_002_002_004 2.2.4 +| 2005-02-22 22.02.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_4 Release notes] +|- +| GIMP_002_002_003 2.2.3 +| 2005-01-22 22.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_3 Release notes] +|- +| GIMP_002_002_002 2.2.2 +| 2005-01-09 09.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_2 Release notes] +|- +| GIMP_002_002_001 2.2.1 +| 2004-12-28 28.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_1 Release notes] +|- +| GIMP_002_002_000 2.2.0 +| 2004-12-19 19.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_0 Release notes] +|- +| GIMP_002_000_006 2.0.6 +| 2004-11-02 02.11.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_6 Release notes] +|- +| GIMP_002_001_007 2.1.7 +| 2004-10-14 14.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_7 Release notes] +|- +| GIMP_002_001_006 2.1.6 +| 2004-10-05 05.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_6 Release notes] +|- +| GIMP_002_000_005 2.0.5 +| 2004-09-25 25.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_5 Release notes] +|- +| GIMP_002_001_005 2.1.5 +| 2004-09-19 19.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_5 Release notes] +|- +| GIMP_002_001_004 2.1.4 +| 2004-09-05 05.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_4 Release notes] +|- +| GIMP_002_001_003 2.1.3 +| 2004-08-06 06.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_3 Release notes] +|- +| GIMP_002_000_004 2.0.4 +| 2004-08-05 05.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_4 Release notes] +|- +| GIMP_002_001_002 2.1.2 +| 2004-07-20 20.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_2 Release notes] +|- +| GIMP_002_000_003 2.0.3 +| 2004-07-17 17.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_3 Release notes] +|- +| GIMP_002_001_001 2.1.1 +| 2004-06-24 24.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_1 Release notes] +|- +| GIMP_002_000_002 2.0.2 +| 2004-06-15 15.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_2 Release notes] +|- +| GIMP_002_001_000 2.1.0 +| 2004-06-02 02.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_0 Release notes] +|- +| GIMP_002_000_001 2.0.1 +| 2004-04-13 13.04.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_1 Release notes] +|- +| GIMP_002_000_000 2.0.0 +| 2004-03-23 23.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_0 Release notes] +|- +| GIMP_001_003_027 1.3.27 +| 2004-03-04 04.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_27 Release notes] +|- +| GIMP_001_003_026 1.3.26 +| 2004-02-04 04.02.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_26 Release notes] +|- +| GIMP_001_003_025 1.3.25 +| 2004-01-19 19.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_25 Release notes] +|- +| GIMP_001_003_024 1.3.24 +| 2004-01-07 07.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_24 Release notes] +|- +| GIMP_001_003_023 1.3.23 +| 2003-11-24 24.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_23 Release notes] +|- +| GIMP_001_003_022 1.3.22 +| 2003-11-03 03.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_22 Release notes] +|- +| GIMP_001_003_021 1.3.21 +| 2003-10-05 05.10.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_21 Release notes] +|- +| GIMP_001_003_020 1.3.20 +| 2003-09-07 07.09.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_20 Release notes] +|- +| GIMP_001_003_019 1.3.19 +| 2003-08-27 27.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_19 Release notes] +|- +| GIMP_001_003_018 1.3.18 +| 2003-08-11 11.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_18 Release notes] +|- +| GIMP_001_003_017 1.3.17 +| 2003-07-25 25.07.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_17 Release notes] +|- +| GIMP_001_003_016 1.3.16 +| 2003-06-27 27.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_16 Release notes] +|- +| GIMP_001_002_005 1.2.5 +| 2003-06-14 14.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_5 Release notes] +|- +| GIMP_001_003_015 1.3.15 +| 2003-06-09 09.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_15 Release notes] +|- +| GIMP_001_002_004 1.2.4 +| 2003-05-20 20.05.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_4 Release notes] +|- +| GIMP_001_003_014 1.3.14 +| 2003-04-14 14.04.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_14 Release notes] +|- +| GIMP_001_003_013 1.3.13 +| 2003-03-23 23.03.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_13 Release notes] +|- +| GIMP_001_003_012 1.3.12 +| 2003-02-18 18.02.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_12 Release notes] +|- +| GIMP_001_003_011 1.3.11 +| 2002-12-30 30.12.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_11 Release notes] +|- +| GIMP_001_003_010 1.3.10 +| 2002-11-07 07.11.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_10 Release notes] +|- +| GIMP_001_003_009 1.3.9 +| 2002-10-11 11.10.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_9 Release notes] +|- +| GIMP_001_003_008 1.3.8 +| 2002-08-20 20.08.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_8 Release notes] +|- +| GIMP_001_003_007 1.3.7 +| 2002-05-30 30.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_7 Release notes] +|- +| GIMP_001_003_006 1.3.6 +| 2002-05-29 29.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_6 Release notes] +|- +| GIMP_001_003_005 1.3.5 +| 2002-03-28 28.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_5 Release notes] +|- +| GIMP_001_003_004 1.3.4 +| 2002-03-09 09.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_4 Release notes] +|- +| GIMP_001_003_003 1.3.3 +| 2002-02-10 10.02.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_3 Release notes] +|- +| GIMP_001_003_002 1.3.2 +| 2001-12-29 29.12.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_2 Release notes] +|- +| GIMP_001_003_001 1.3.1 +| 2001-11-25 25.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_1 Release notes] +|- +| GIMP_001_003_000 1.3.0 +| 2001-11-13 13.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_0 Release notes] +|- +| GIMP_001_002_002 1.2.2 +| 2001-07-26 26.07.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_2 Release notes] +|- +| GIMP_001_002_001 1.2.1 +| 2001-01-22 22.01.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_1 Release notes] +|- +| GIMP_001_002_000 1.2.0 +| 2000-12-25 25.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_0 Release notes] +|- +| GIMP_001_001_032 1.1.32 +| 2000-12-21 21.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_32 Release notes] +|- +| GIMP_001_001_031 1.1.31 +| 2000-12-19 19.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_31 Release notes] +|- +| GIMP_001_001_030 1.1.30 +| 2000-12-10 10.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_30 Release notes] +|- +| GIMP_001_001_029 1.1.29 +| 2000-10-31 31.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_29 Release notes] +|- +| GIMP_001_001_028 1.1.28 +| 2000-10-16 16.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_28 Release notes] +|- +| GIMP_001_001_027 1.1.27 +| 2000-10-04 04.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_27 Release notes] +|- +| GIMP_001_001_026 1.1.26 +| 2000-09-23 23.09.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_26 Release notes] +|- +| GIMP_001_001_025 1.1.25 +| 2000-08-21 21.08.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_25 Release notes] +|- +| GIMP_001_001_024 1.1.24 +| 2000-06-22 22.06.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_24 Release notes] +|- +| GIMP_001_001_023 1.1.23 +| 2000-05-28 28.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_23 Release notes] +|- +| GIMP_001_001_022 1.1.22 +| 2000-05-16 16.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_22 Release notes] +|- +| GIMP_001_001_021 1.1.21 +| 2000-05-01 01.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_21 Release notes] +|- +| GIMP_001_001_020 1.1.20 +| 2000-04-22 22.04.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_20 Release notes] +|- +| GIMP_001_001_019 1.1.19 +| 2000-03-30 30.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_19 Release notes] +|- +| GIMP_001_001_018 1.1.18 +| 2000-03-04 04.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_18 Release notes] +|- +| GIMP_001_001_017 1.1.17 +| 2000-02-12 12.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_17 Release notes] +|- +| GIMP_001_001_016 1.1.16 +| 2000-02-02 02.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_16 Release notes] +|- +| GIMP_001_001_015 1.1.15 +| 2000-01-14 14.01.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_15 Release notes] +|- +| GIMP_001_001_014 1.1.14 +| 1999-12-16 16.12.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_14 Release notes] +|- +| GIMP_001_001_013 1.1.13 +| 1999-11-25 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_13 Release notes] +|- +| GIMP_001_001_012 1.1.12 +| 1999-11-25 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_12 Release notes] +|- +| GIMP_001_001_011 1.1.11 +| 1999-11-01 01.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_11 Release notes] +|- +| GIMP_001_001_010 1.1.10 +| 1999-10-06 06.10.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_10 Release notes] +|- +| GIMP_001_001_009 1.1.9 +| 1999-09-10 10.09.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_9 Release notes] +|- +| GIMP_001_001_008 1.1.8 +| 1999-08-02 02.08.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_8 Release notes] +|- +| GIMP_001_001_007 1.1.7 +| 1999-07-17 17.07.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_7 Release notes] +|- +| GIMP_001_001_006 1.1.6 +| 1999-06-06 06.06.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_6 Release notes] +|- +| GIMP_001_001_005 1.1.5 +| 1999-05-03 03.05.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_5 Release notes] +|- +| GIMP_001_000_004 1.0.4 +| 1999-04-04 04.04.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_4 Release notes] +|- +| GIMP_001_001_004 1.1.4 +| 1999-03-30 30.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_4 Release notes] +|- +| GIMP_001_000_003 1.0.3 +| 1999-03-29 29.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_3 Release notes] +|- +| GIMP_001_001_003 1.1.3 +| 1999-03-09 09.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_3 Release notes] +|- +| GIMP_001_001_002 1.1.2 +| 1999-02-04 04.02.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_2 Release notes] +|- +| GIMP_001_001_001 1.1.1 +| 1999-01-21 21.01.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_1 Release notes] +|- +| GIMP_001_001_000 1.1.0 +| 1998-12-24 24.12.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_0 Release notes] +|- +| GIMP_001_000_002 1.0.2 +| 1998-10-15 15.10.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_2 Release notes] +|- +| GIMP_001_000_001 1.0.1 +| 1998-09-27 27.09.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_1 Release notes] +|- +| GIMP_001_000_000 1.0.0 +| 1998-06-05 05.06.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_0 Release notes] +|- +| GIMP_000_099_029 0.99.29 +| 1998-05-05 05.05.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_29 Release notes] +|- +| GIMP_000_099_028 0.99.28 +| 1998-04-26 26.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_28 Release notes] +|- +| GIMP_000_099_027 0.99.27 +| 1998-04-18 18.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_27 Release notes] +|- +| GIMP_000_099_025 0.99.25 +| 1998-04-11 11.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_25 Release notes] +|- +| GIMP_000_099_024 0.99.24 +| 1998-04-08 08.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_24 Release notes] +|- +| GIMP_000_099_023 0.99.23 +| 1998-03-27 27.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_23 Release notes] +|- +| GIMP_000_099_022 0.99.22 +| 1998-03-20 20.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_22 Release notes] +|- +| GIMP_000_099_021 0.99.21 +| 1998-03-15 15.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_21 Release notes] +|- +| GIMP_000_099_020 0.99.20 +| 1998-03-12 12.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_20 Release notes] +|- +| GIMP_000_099_019 0.99.19 +| 1998-03-02 02.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_19 Release notes] +|- +| GIMP_000_099_018 0.99.18 +| 1998-01-26 26.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_18 Release notes] +|- +| GIMP_000_099_017 0.99.17 +| 1998-01-04 04.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_17 Release notes] +|- +| GIMP_000_099_016 0.99.16 +| 1997-12-15 15.12.1997 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_16 Release notes] +|} + +==How to update the history== + +To update the history you can use the following script under Linux: + +
    +#! /bin/bash
    +# Purpose: Update the release history in the developer wiki
    +# Author:  Sven Claussner
    +# License: GNU General Public License 3
    +#          See http://www.gnu.org/copyleft/gpl.html for full text.
    +
    +echo "==History=="
    +echo ""
    +echo "{| class=\"wikitable sortable mw-collapsible\" align=\"center\" border=\"1\""
    +echo "! scope=\"col\" | Version"
    +echo "! scope=\"col\" | Date"
    +echo "! scope=\"col\" | Release notes"
    +echo "! class=\"unsortable\"class=\"unsortable\"  |"
    +git for-each-ref --format="%(refname) %(taggerdate:short) %(refname)" --sort=-taggerdate refs/tags | \
    +grep /GIMP_[0-9]_[0-9_]*$ | \
    +awk '{
    +          gsub("refs/tags/","");
    +          if ( $3 ~ /[02468]_0$/ )
    +              print "|- bgcolor=\"Silver\"";
    +          else
    +              print "|-";
    +
    +          split($1,version,"_");
    +          major_v=sprintf("%.3d",version[2]);
    +          minor_v=sprintf("%.3d",version[3]);
    +          micro_v=sprintf("%.3d",version[4]);
    +          version_key=version[1] "_" major_v "_" minor_v "_" micro_v;
    +          version_display=version[2] "." version[3] "." version[4];
    +
    +          split($2,tag_date,"-");
    +          year=tag_date[1];
    +          month=sprintf("%.2d",tag_date[2]);
    +          day=sprintf("%.2d",tag_date[3]);
    +          date_key= year "-" month "-" day;
    +          date_display= day "." month "." year;
    +
    +          print "| {{hsk|" version_key "}} " version_display;
    +          print "| {{hsk|" date_key "}} " date_display;
    +          if ( $3 !~ /GIMP_0/ )
    +              print "| [https://git.gnome.org/browse/gimp/tree/NEWS?id=" $3 " Release notes]";
    +          else
    +              print "| [https://git.gnome.org/browse/gimp/tree/README?id=" $3 " Release notes]";
    +         }'
    +echo "|}"
    +
    + +This will regenerate the whole history. + +Then open the chapter "History" here and insert the output. + + \ No newline at end of file diff --git a/wiki/Release:Misc-20201028003120-edit.txt b/wiki/Release:Misc-20201028003120-edit.txt new file mode 100644 index 0000000..eb7bc3b --- /dev/null +++ b/wiki/Release:Misc-20201028003120-edit.txt @@ -0,0 +1,769 @@ +This page is a collection of several release related articles that don't belong anywhere else. + +__TOC__ + +=Release history= +To find out release dates and notes of each version you can look into the following table.
    +Use your browser's search function to quickly jump to a particular version.
    +Even minor version numbers mark stable releases, odd minor numbers mark development releases. + +==History== + +{| class="wikitable sortable mw-collapsible" align="center" border="1" +! scope="col" | Version +! scope="col" | Date +! scope="col" | Release notes +! class="unsortable"class="unsortable" | +|- +| {{hsk|GIMP_002_008_010}} 2.8.10 +| {{hsk|2013-11-28}} 28.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_10 Release notes] +|- +| {{hsk|GIMP_002_008_008}} 2.8.8 +| {{hsk|2013-11-03}} 03.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_8 Release notes] +|- +| {{hsk|GIMP_002_008_006}} 2.8.6 +| {{hsk|2013-06-22}} 22.06.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_6 Release notes] +|- +| {{hsk|GIMP_002_008_004}} 2.8.4 +| {{hsk|2013-02-05}} 05.02.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_4 Release notes] +|- +| {{hsk|GIMP_002_008_002}} 2.8.2 +| {{hsk|2012-08-23}} 23.08.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_2 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_008_000}} 2.8.0 +| {{hsk|2012-05-02}} 02.05.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_0 Release notes] +|- +| {{hsk|GIMP_002_007_005}} 2.7.5 +| {{hsk|2012-03-13}} 13.03.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_5 Release notes] +|- +| {{hsk|GIMP_002_006_012}} 2.6.12 +| {{hsk|2012-01-31}} 31.01.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_12 Release notes] +|- +| {{hsk|GIMP_002_007_004}} 2.7.4 +| {{hsk|2011-12-11}} 11.12.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_4 Release notes] +|- +| {{hsk|GIMP_002_007_003}} 2.7.3 +| {{hsk|2011-08-21}} 21.08.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_3 Release notes] +|- +| {{hsk|GIMP_002_007_002}} 2.7.2 +| {{hsk|2011-04-14}} 14.04.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_2 Release notes] +|- +| {{hsk|GIMP_002_006_011}} 2.6.11 +| {{hsk|2010-10-03}} 03.10.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_11 Release notes] +|- +| {{hsk|GIMP_002_006_010}} 2.6.10 +| {{hsk|2010-07-07}} 07.07.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_10 Release notes] +|- +| {{hsk|GIMP_002_007_001}} 2.7.1 +| {{hsk|2010-06-29}} 29.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_1 Release notes] +|- +| {{hsk|GIMP_002_006_009}} 2.6.9 +| {{hsk|2010-06-22}} 22.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_9 Release notes] +|- +| {{hsk|GIMP_002_006_008}} 2.6.8 +| {{hsk|2009-12-10}} 10.12.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_8 Release notes] +|- +| {{hsk|GIMP_002_007_000}} 2.7.0 +| {{hsk|2009-08-15}} 15.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_0 Release notes] +|- +| {{hsk|GIMP_002_006_007}} 2.6.7 +| {{hsk|2009-08-13}} 13.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_7 Release notes] +|- +| {{hsk|GIMP_002_006_006}} 2.6.6 +| {{hsk|2009-03-16}} 16.03.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_6 Release notes] +|- +| {{hsk|GIMP_002_006_005}} 2.6.5 +| {{hsk|2009-02-15}} 15.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_5 Release notes] +|- +| {{hsk|GIMP_002_006_004}} 2.6.4 +| {{hsk|2009-02-14}} 14.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_4 Release notes] +|- +| {{hsk|GIMP_002_006_003}} 2.6.3 +| {{hsk|2008-11-21}} 21.11.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_3 Release notes] +|- +| {{hsk|GIMP_002_006_002}} 2.6.2 +| {{hsk|2008-10-30}} 30.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_2 Release notes] +|- +| {{hsk|GIMP_002_006_001}} 2.6.1 +| {{hsk|2008-10-08}} 08.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_006_000}} 2.6.0 +| {{hsk|2008-09-30}} 30.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_0 Release notes] +|- +| {{hsk|GIMP_002_005_004}} 2.5.4 +| {{hsk|2008-09-16}} 16.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_4 Release notes] +|- +| {{hsk|GIMP_002_005_003}} 2.5.3 +| {{hsk|2008-08-21}} 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_3 Release notes] +|- +| {{hsk|GIMP_002_004_007}} 2.4.7 +| {{hsk|2008-08-21}} 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_7 Release notes] +|- +| {{hsk|GIMP_002_005_002}} 2.5.2 +| {{hsk|2008-07-16}} 16.07.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_2 Release notes] +|- +| {{hsk|GIMP_002_005_001}} 2.5.1 +| {{hsk|2008-06-15}} 15.06.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_1 Release notes] +|- +| {{hsk|GIMP_002_004_006}} 2.4.6 +| {{hsk|2008-05-29}} 29.05.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_6 Release notes] +|- +| {{hsk|GIMP_002_005_000}} 2.5.0 +| {{hsk|2008-04-09}} 09.04.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_0 Release notes] +|- +| {{hsk|GIMP_002_004_005}} 2.4.5 +| {{hsk|2008-02-29}} 29.02.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_5 Release notes] +|- +| {{hsk|GIMP_002_004_004}} 2.4.4 +| {{hsk|2008-01-30}} 30.01.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_4 Release notes] +|- +| {{hsk|GIMP_002_004_003}} 2.4.3 +| {{hsk|2007-12-16}} 16.12.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_3 Release notes] +|- +| {{hsk|GIMP_002_004_002}} 2.4.2 +| {{hsk|2007-11-20}} 20.11.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_2 Release notes] +|- +| {{hsk|GIMP_002_004_001}} 2.4.1 +| {{hsk|2007-10-31}} 31.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_004_000}} 2.4.0 +| {{hsk|2007-10-23}} 23.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_0 Release notes] +|- +| {{hsk|GIMP_002_003_019}} 2.3.19 +| {{hsk|2007-07-24}} 24.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_19 Release notes] +|- +| {{hsk|GIMP_002_002_017}} 2.2.17 +| {{hsk|2007-07-13}} 13.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_17 Release notes] +|- +| {{hsk|GIMP_002_002_016}} 2.2.16 +| {{hsk|2007-07-06}} 06.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_16 Release notes] +|- +| {{hsk|GIMP_002_003_018}} 2.3.18 +| {{hsk|2007-06-11}} 11.06.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_18 Release notes] +|- +| {{hsk|GIMP_002_003_017}} 2.3.17 +| {{hsk|2007-05-27}} 27.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_17 Release notes] +|- +| {{hsk|GIMP_002_002_015}} 2.2.15 +| {{hsk|2007-05-26}} 26.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_15 Release notes] +|- +| {{hsk|GIMP_002_003_016}} 2.3.16 +| {{hsk|2007-04-24}} 24.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_16 Release notes] +|- +| {{hsk|GIMP_002_002_014}} 2.2.14 +| {{hsk|2007-04-17}} 17.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_14 Release notes] +|- +| {{hsk|GIMP_002_003_015}} 2.3.15 +| {{hsk|2007-03-09}} 09.03.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_15 Release notes] +|- +| {{hsk|GIMP_002_003_014}} 2.3.14 +| {{hsk|2007-01-23}} 23.01.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_14 Release notes] +|- +| {{hsk|GIMP_002_003_013}} 2.3.13 +| {{hsk|2006-11-23}} 23.11.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_13 Release notes] +|- +| {{hsk|GIMP_002_003_012}} 2.3.12 +| {{hsk|2006-10-11}} 11.10.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_12 Release notes] +|- +| {{hsk|GIMP_002_003_011}} 2.3.11 +| {{hsk|2006-09-07}} 07.09.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_11 Release notes] +|- +| {{hsk|GIMP_002_002_013}} 2.2.13 +| {{hsk|2006-08-24}} 24.08.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_13 Release notes] +|- +| {{hsk|GIMP_002_002_012}} 2.2.12 +| {{hsk|2006-07-06}} 06.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_12 Release notes] +|- +| {{hsk|GIMP_002_003_010}} 2.3.10 +| {{hsk|2006-07-05}} 05.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_10 Release notes] +|- +| {{hsk|GIMP_002_003_009}} 2.3.9 +| {{hsk|2006-06-05}} 05.06.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_9 Release notes] +|- +| {{hsk|GIMP_002_002_011}} 2.2.11 +| {{hsk|2006-04-13}} 13.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_11 Release notes] +|- +| {{hsk|GIMP_002_003_008}} 2.3.8 +| {{hsk|2006-04-12}} 12.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_8 Release notes] +|- +| {{hsk|GIMP_002_003_007}} 2.3.7 +| {{hsk|2006-02-08}} 08.02.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_7 Release notes] +|- +| {{hsk|GIMP_002_003_006}} 2.3.6 +| {{hsk|2005-12-28}} 28.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_6 Release notes] +|- +| {{hsk|GIMP_002_002_010}} 2.2.10 +| {{hsk|2005-12-27}} 27.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_10 Release notes] +|- +| {{hsk|GIMP_002_003_005}} 2.3.5 +| {{hsk|2005-11-04}} 04.11.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_5 Release notes] +|- +| {{hsk|GIMP_002_002_009}} 2.2.9 +| {{hsk|2005-10-27}} 27.10.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_9 Release notes] +|- +| {{hsk|GIMP_002_003_004}} 2.3.4 +| {{hsk|2005-09-26}} 26.09.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_4 Release notes] +|- +| {{hsk|GIMP_002_003_003}} 2.3.3 +| {{hsk|2005-08-10}} 10.08.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_3 Release notes] +|- +| {{hsk|GIMP_002_003_002}} 2.3.2 +| {{hsk|2005-07-01}} 01.07.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_2 Release notes] +|- +| {{hsk|GIMP_002_002_008}} 2.2.8 +| {{hsk|2005-06-26}} 26.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_8 Release notes] +|- +| {{hsk|GIMP_002_003_001}} 2.3.1 +| {{hsk|2005-06-09}} 09.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_1 Release notes] +|- +| {{hsk|GIMP_002_003_000}} 2.3.0 +| {{hsk|2005-05-14}} 14.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_0 Release notes] +|- +| {{hsk|GIMP_002_002_007}} 2.2.7 +| {{hsk|2005-05-08}} 08.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_7 Release notes] +|- +| {{hsk|GIMP_002_002_006}} 2.2.6 +| {{hsk|2005-04-10}} 10.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_6 Release notes] +|- +| {{hsk|GIMP_002_002_005}} 2.2.5 +| {{hsk|2005-04-09}} 09.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_5 Release notes] +|- +| {{hsk|GIMP_002_002_004}} 2.2.4 +| {{hsk|2005-02-22}} 22.02.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_4 Release notes] +|- +| {{hsk|GIMP_002_002_003}} 2.2.3 +| {{hsk|2005-01-22}} 22.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_3 Release notes] +|- +| {{hsk|GIMP_002_002_002}} 2.2.2 +| {{hsk|2005-01-09}} 09.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_2 Release notes] +|- +| {{hsk|GIMP_002_002_001}} 2.2.1 +| {{hsk|2004-12-28}} 28.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_002_000}} 2.2.0 +| {{hsk|2004-12-19}} 19.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_0 Release notes] +|- +| {{hsk|GIMP_002_000_006}} 2.0.6 +| {{hsk|2004-11-02}} 02.11.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_6 Release notes] +|- +| {{hsk|GIMP_002_001_007}} 2.1.7 +| {{hsk|2004-10-14}} 14.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_7 Release notes] +|- +| {{hsk|GIMP_002_001_006}} 2.1.6 +| {{hsk|2004-10-05}} 05.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_6 Release notes] +|- +| {{hsk|GIMP_002_000_005}} 2.0.5 +| {{hsk|2004-09-25}} 25.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_5 Release notes] +|- +| {{hsk|GIMP_002_001_005}} 2.1.5 +| {{hsk|2004-09-19}} 19.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_5 Release notes] +|- +| {{hsk|GIMP_002_001_004}} 2.1.4 +| {{hsk|2004-09-05}} 05.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_4 Release notes] +|- +| {{hsk|GIMP_002_001_003}} 2.1.3 +| {{hsk|2004-08-06}} 06.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_3 Release notes] +|- +| {{hsk|GIMP_002_000_004}} 2.0.4 +| {{hsk|2004-08-05}} 05.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_4 Release notes] +|- +| {{hsk|GIMP_002_001_002}} 2.1.2 +| {{hsk|2004-07-20}} 20.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_2 Release notes] +|- +| {{hsk|GIMP_002_000_003}} 2.0.3 +| {{hsk|2004-07-17}} 17.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_3 Release notes] +|- +| {{hsk|GIMP_002_001_001}} 2.1.1 +| {{hsk|2004-06-24}} 24.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_1 Release notes] +|- +| {{hsk|GIMP_002_000_002}} 2.0.2 +| {{hsk|2004-06-15}} 15.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_2 Release notes] +|- +| {{hsk|GIMP_002_001_000}} 2.1.0 +| {{hsk|2004-06-02}} 02.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_0 Release notes] +|- +| {{hsk|GIMP_002_000_001}} 2.0.1 +| {{hsk|2004-04-13}} 13.04.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_000_000}} 2.0.0 +| {{hsk|2004-03-23}} 23.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_0 Release notes] +|- +| {{hsk|GIMP_001_003_027}} 1.3.27 +| {{hsk|2004-03-04}} 04.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_27 Release notes] +|- +| {{hsk|GIMP_001_003_026}} 1.3.26 +| {{hsk|2004-02-04}} 04.02.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_26 Release notes] +|- +| {{hsk|GIMP_001_003_025}} 1.3.25 +| {{hsk|2004-01-19}} 19.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_25 Release notes] +|- +| {{hsk|GIMP_001_003_024}} 1.3.24 +| {{hsk|2004-01-07}} 07.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_24 Release notes] +|- +| {{hsk|GIMP_001_003_023}} 1.3.23 +| {{hsk|2003-11-24}} 24.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_23 Release notes] +|- +| {{hsk|GIMP_001_003_022}} 1.3.22 +| {{hsk|2003-11-03}} 03.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_22 Release notes] +|- +| {{hsk|GIMP_001_003_021}} 1.3.21 +| {{hsk|2003-10-05}} 05.10.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_21 Release notes] +|- +| {{hsk|GIMP_001_003_020}} 1.3.20 +| {{hsk|2003-09-07}} 07.09.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_20 Release notes] +|- +| {{hsk|GIMP_001_003_019}} 1.3.19 +| {{hsk|2003-08-27}} 27.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_19 Release notes] +|- +| {{hsk|GIMP_001_003_018}} 1.3.18 +| {{hsk|2003-08-11}} 11.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_18 Release notes] +|- +| {{hsk|GIMP_001_003_017}} 1.3.17 +| {{hsk|2003-07-25}} 25.07.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_17 Release notes] +|- +| {{hsk|GIMP_001_003_016}} 1.3.16 +| {{hsk|2003-06-27}} 27.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_16 Release notes] +|- +| {{hsk|GIMP_001_002_005}} 1.2.5 +| {{hsk|2003-06-14}} 14.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_5 Release notes] +|- +| {{hsk|GIMP_001_003_015}} 1.3.15 +| {{hsk|2003-06-09}} 09.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_15 Release notes] +|- +| {{hsk|GIMP_001_002_004}} 1.2.4 +| {{hsk|2003-05-20}} 20.05.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_4 Release notes] +|- +| {{hsk|GIMP_001_003_014}} 1.3.14 +| {{hsk|2003-04-14}} 14.04.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_14 Release notes] +|- +| {{hsk|GIMP_001_003_013}} 1.3.13 +| {{hsk|2003-03-23}} 23.03.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_13 Release notes] +|- +| {{hsk|GIMP_001_003_012}} 1.3.12 +| {{hsk|2003-02-18}} 18.02.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_12 Release notes] +|- +| {{hsk|GIMP_001_003_011}} 1.3.11 +| {{hsk|2002-12-30}} 30.12.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_11 Release notes] +|- +| {{hsk|GIMP_001_003_010}} 1.3.10 +| {{hsk|2002-11-07}} 07.11.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_10 Release notes] +|- +| {{hsk|GIMP_001_003_009}} 1.3.9 +| {{hsk|2002-10-11}} 11.10.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_9 Release notes] +|- +| {{hsk|GIMP_001_003_008}} 1.3.8 +| {{hsk|2002-08-20}} 20.08.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_8 Release notes] +|- +| {{hsk|GIMP_001_003_007}} 1.3.7 +| {{hsk|2002-05-30}} 30.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_7 Release notes] +|- +| {{hsk|GIMP_001_003_006}} 1.3.6 +| {{hsk|2002-05-29}} 29.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_6 Release notes] +|- +| {{hsk|GIMP_001_003_005}} 1.3.5 +| {{hsk|2002-03-28}} 28.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_5 Release notes] +|- +| {{hsk|GIMP_001_003_004}} 1.3.4 +| {{hsk|2002-03-09}} 09.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_4 Release notes] +|- +| {{hsk|GIMP_001_003_003}} 1.3.3 +| {{hsk|2002-02-10}} 10.02.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_3 Release notes] +|- +| {{hsk|GIMP_001_003_002}} 1.3.2 +| {{hsk|2001-12-29}} 29.12.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_2 Release notes] +|- +| {{hsk|GIMP_001_003_001}} 1.3.1 +| {{hsk|2001-11-25}} 25.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_1 Release notes] +|- +| {{hsk|GIMP_001_003_000}} 1.3.0 +| {{hsk|2001-11-13}} 13.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_0 Release notes] +|- +| {{hsk|GIMP_001_002_002}} 1.2.2 +| {{hsk|2001-07-26}} 26.07.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_2 Release notes] +|- +| {{hsk|GIMP_001_002_001}} 1.2.1 +| {{hsk|2001-01-22}} 22.01.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_001_002_000}} 1.2.0 +| {{hsk|2000-12-25}} 25.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_0 Release notes] +|- +| {{hsk|GIMP_001_001_032}} 1.1.32 +| {{hsk|2000-12-21}} 21.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_32 Release notes] +|- +| {{hsk|GIMP_001_001_031}} 1.1.31 +| {{hsk|2000-12-19}} 19.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_31 Release notes] +|- +| {{hsk|GIMP_001_001_030}} 1.1.30 +| {{hsk|2000-12-10}} 10.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_30 Release notes] +|- +| {{hsk|GIMP_001_001_029}} 1.1.29 +| {{hsk|2000-10-31}} 31.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_29 Release notes] +|- +| {{hsk|GIMP_001_001_028}} 1.1.28 +| {{hsk|2000-10-16}} 16.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_28 Release notes] +|- +| {{hsk|GIMP_001_001_027}} 1.1.27 +| {{hsk|2000-10-04}} 04.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_27 Release notes] +|- +| {{hsk|GIMP_001_001_026}} 1.1.26 +| {{hsk|2000-09-23}} 23.09.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_26 Release notes] +|- +| {{hsk|GIMP_001_001_025}} 1.1.25 +| {{hsk|2000-08-21}} 21.08.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_25 Release notes] +|- +| {{hsk|GIMP_001_001_024}} 1.1.24 +| {{hsk|2000-06-22}} 22.06.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_24 Release notes] +|- +| {{hsk|GIMP_001_001_023}} 1.1.23 +| {{hsk|2000-05-28}} 28.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_23 Release notes] +|- +| {{hsk|GIMP_001_001_022}} 1.1.22 +| {{hsk|2000-05-16}} 16.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_22 Release notes] +|- +| {{hsk|GIMP_001_001_021}} 1.1.21 +| {{hsk|2000-05-01}} 01.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_21 Release notes] +|- +| {{hsk|GIMP_001_001_020}} 1.1.20 +| {{hsk|2000-04-22}} 22.04.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_20 Release notes] +|- +| {{hsk|GIMP_001_001_019}} 1.1.19 +| {{hsk|2000-03-30}} 30.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_19 Release notes] +|- +| {{hsk|GIMP_001_001_018}} 1.1.18 +| {{hsk|2000-03-04}} 04.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_18 Release notes] +|- +| {{hsk|GIMP_001_001_017}} 1.1.17 +| {{hsk|2000-02-12}} 12.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_17 Release notes] +|- +| {{hsk|GIMP_001_001_016}} 1.1.16 +| {{hsk|2000-02-02}} 02.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_16 Release notes] +|- +| {{hsk|GIMP_001_001_015}} 1.1.15 +| {{hsk|2000-01-14}} 14.01.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_15 Release notes] +|- +| {{hsk|GIMP_001_001_014}} 1.1.14 +| {{hsk|1999-12-16}} 16.12.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_14 Release notes] +|- +| {{hsk|GIMP_001_001_013}} 1.1.13 +| {{hsk|1999-11-25}} 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_13 Release notes] +|- +| {{hsk|GIMP_001_001_012}} 1.1.12 +| {{hsk|1999-11-25}} 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_12 Release notes] +|- +| {{hsk|GIMP_001_001_011}} 1.1.11 +| {{hsk|1999-11-01}} 01.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_11 Release notes] +|- +| {{hsk|GIMP_001_001_010}} 1.1.10 +| {{hsk|1999-10-06}} 06.10.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_10 Release notes] +|- +| {{hsk|GIMP_001_001_009}} 1.1.9 +| {{hsk|1999-09-10}} 10.09.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_9 Release notes] +|- +| {{hsk|GIMP_001_001_008}} 1.1.8 +| {{hsk|1999-08-02}} 02.08.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_8 Release notes] +|- +| {{hsk|GIMP_001_001_007}} 1.1.7 +| {{hsk|1999-07-17}} 17.07.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_7 Release notes] +|- +| {{hsk|GIMP_001_001_006}} 1.1.6 +| {{hsk|1999-06-06}} 06.06.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_6 Release notes] +|- +| {{hsk|GIMP_001_001_005}} 1.1.5 +| {{hsk|1999-05-03}} 03.05.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_5 Release notes] +|- +| {{hsk|GIMP_001_000_004}} 1.0.4 +| {{hsk|1999-04-04}} 04.04.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_4 Release notes] +|- +| {{hsk|GIMP_001_001_004}} 1.1.4 +| {{hsk|1999-03-30}} 30.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_4 Release notes] +|- +| {{hsk|GIMP_001_000_003}} 1.0.3 +| {{hsk|1999-03-29}} 29.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_3 Release notes] +|- +| {{hsk|GIMP_001_001_003}} 1.1.3 +| {{hsk|1999-03-09}} 09.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_3 Release notes] +|- +| {{hsk|GIMP_001_001_002}} 1.1.2 +| {{hsk|1999-02-04}} 04.02.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_2 Release notes] +|- +| {{hsk|GIMP_001_001_001}} 1.1.1 +| {{hsk|1999-01-21}} 21.01.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_1 Release notes] +|- +| {{hsk|GIMP_001_001_000}} 1.1.0 +| {{hsk|1998-12-24}} 24.12.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_0 Release notes] +|- +| {{hsk|GIMP_001_000_002}} 1.0.2 +| {{hsk|1998-10-15}} 15.10.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_2 Release notes] +|- +| {{hsk|GIMP_001_000_001}} 1.0.1 +| {{hsk|1998-09-27}} 27.09.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_001_000_000}} 1.0.0 +| {{hsk|1998-06-05}} 05.06.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_0 Release notes] +|- +| {{hsk|GIMP_000_099_029}} 0.99.29 +| {{hsk|1998-05-05}} 05.05.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_29 Release notes] +|- +| {{hsk|GIMP_000_099_028}} 0.99.28 +| {{hsk|1998-04-26}} 26.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_28 Release notes] +|- +| {{hsk|GIMP_000_099_027}} 0.99.27 +| {{hsk|1998-04-18}} 18.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_27 Release notes] +|- +| {{hsk|GIMP_000_099_025}} 0.99.25 +| {{hsk|1998-04-11}} 11.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_25 Release notes] +|- +| {{hsk|GIMP_000_099_024}} 0.99.24 +| {{hsk|1998-04-08}} 08.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_24 Release notes] +|- +| {{hsk|GIMP_000_099_023}} 0.99.23 +| {{hsk|1998-03-27}} 27.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_23 Release notes] +|- +| {{hsk|GIMP_000_099_022}} 0.99.22 +| {{hsk|1998-03-20}} 20.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_22 Release notes] +|- +| {{hsk|GIMP_000_099_021}} 0.99.21 +| {{hsk|1998-03-15}} 15.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_21 Release notes] +|- +| {{hsk|GIMP_000_099_020}} 0.99.20 +| {{hsk|1998-03-12}} 12.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_20 Release notes] +|- +| {{hsk|GIMP_000_099_019}} 0.99.19 +| {{hsk|1998-03-02}} 02.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_19 Release notes] +|- +| {{hsk|GIMP_000_099_018}} 0.99.18 +| {{hsk|1998-01-26}} 26.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_18 Release notes] +|- +| {{hsk|GIMP_000_099_017}} 0.99.17 +| {{hsk|1998-01-04}} 04.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_17 Release notes] +|- +| {{hsk|GIMP_000_099_016}} 0.99.16 +| {{hsk|1997-12-15}} 15.12.1997 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_16 Release notes] +|} + +==How to update the history== +To update the history you can use the following script under Linux: +
    +#! /bin/bash
    +# Purpose: Update the release history in the developer wiki
    +# Author:  Sven Claussner
    +# License: GNU General Public License 3
    +#          See http://www.gnu.org/copyleft/gpl.html for full text.
    +
    +echo "==History=="
    +echo ""
    +echo "{| class=\"wikitable sortable mw-collapsible\" align=\"center\" border=\"1\""
    +echo "! scope=\"col\" | Version"
    +echo "! scope=\"col\" | Date"
    +echo "! scope=\"col\" | Release notes"
    +echo "! class=\"unsortable\"class=\"unsortable\"  |"
    +git for-each-ref --format="%(refname) %(taggerdate:short) %(refname)" --sort=-taggerdate refs/tags | \
    +grep /GIMP_[0-9]_[0-9_]*$ | \
    +awk '{
    +          gsub("refs/tags/","");
    +          if ( $3 ~ /[02468]_0$/ )
    +              print "|- bgcolor=\"Silver\"";
    +          else
    +              print "|-";
    +
    +          split($1,version,"_");
    +          major_v=sprintf("%.3d",version[2]);
    +          minor_v=sprintf("%.3d",version[3]);
    +          micro_v=sprintf("%.3d",version[4]);
    +          version_key=version[1] "_" major_v "_" minor_v "_" micro_v;
    +          version_display=version[2] "." version[3] "." version[4];
    +
    +          split($2,tag_date,"-");
    +          year=tag_date[1];
    +          month=sprintf("%.2d",tag_date[2]);
    +          day=sprintf("%.2d",tag_date[3]);
    +          date_key= year "-" month "-" day;
    +          date_display= day "." month "." year;
    +
    +          print "| {{hsk|" version_key "}} " version_display;
    +          print "| {{hsk|" date_key "}} " date_display;
    +          if ( $3 !~ /GIMP_0/ )
    +              print "| [https://git.gnome.org/browse/gimp/tree/NEWS?id=" $3 " Release notes]";
    +          else
    +              print "| [https://git.gnome.org/browse/gimp/tree/README?id=" $3 " Release notes]";
    +         }'
    +echo "|}"
    +
    +This will regenerate the whole history. + +Then open the chapter "History" here and insert the output. diff --git a/wiki/Release:Misc-20210518052115-edit.txt b/wiki/Release:Misc-20210518052115-edit.txt new file mode 100644 index 0000000..eb7bc3b --- /dev/null +++ b/wiki/Release:Misc-20210518052115-edit.txt @@ -0,0 +1,769 @@ +This page is a collection of several release related articles that don't belong anywhere else. + +__TOC__ + +=Release history= +To find out release dates and notes of each version you can look into the following table.
    +Use your browser's search function to quickly jump to a particular version.
    +Even minor version numbers mark stable releases, odd minor numbers mark development releases. + +==History== + +{| class="wikitable sortable mw-collapsible" align="center" border="1" +! scope="col" | Version +! scope="col" | Date +! scope="col" | Release notes +! class="unsortable"class="unsortable" | +|- +| {{hsk|GIMP_002_008_010}} 2.8.10 +| {{hsk|2013-11-28}} 28.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_10 Release notes] +|- +| {{hsk|GIMP_002_008_008}} 2.8.8 +| {{hsk|2013-11-03}} 03.11.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_8 Release notes] +|- +| {{hsk|GIMP_002_008_006}} 2.8.6 +| {{hsk|2013-06-22}} 22.06.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_6 Release notes] +|- +| {{hsk|GIMP_002_008_004}} 2.8.4 +| {{hsk|2013-02-05}} 05.02.2013 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_4 Release notes] +|- +| {{hsk|GIMP_002_008_002}} 2.8.2 +| {{hsk|2012-08-23}} 23.08.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_2 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_008_000}} 2.8.0 +| {{hsk|2012-05-02}} 02.05.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_8_0 Release notes] +|- +| {{hsk|GIMP_002_007_005}} 2.7.5 +| {{hsk|2012-03-13}} 13.03.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_5 Release notes] +|- +| {{hsk|GIMP_002_006_012}} 2.6.12 +| {{hsk|2012-01-31}} 31.01.2012 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_12 Release notes] +|- +| {{hsk|GIMP_002_007_004}} 2.7.4 +| {{hsk|2011-12-11}} 11.12.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_4 Release notes] +|- +| {{hsk|GIMP_002_007_003}} 2.7.3 +| {{hsk|2011-08-21}} 21.08.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_3 Release notes] +|- +| {{hsk|GIMP_002_007_002}} 2.7.2 +| {{hsk|2011-04-14}} 14.04.2011 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_2 Release notes] +|- +| {{hsk|GIMP_002_006_011}} 2.6.11 +| {{hsk|2010-10-03}} 03.10.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_11 Release notes] +|- +| {{hsk|GIMP_002_006_010}} 2.6.10 +| {{hsk|2010-07-07}} 07.07.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_10 Release notes] +|- +| {{hsk|GIMP_002_007_001}} 2.7.1 +| {{hsk|2010-06-29}} 29.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_1 Release notes] +|- +| {{hsk|GIMP_002_006_009}} 2.6.9 +| {{hsk|2010-06-22}} 22.06.2010 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_9 Release notes] +|- +| {{hsk|GIMP_002_006_008}} 2.6.8 +| {{hsk|2009-12-10}} 10.12.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_8 Release notes] +|- +| {{hsk|GIMP_002_007_000}} 2.7.0 +| {{hsk|2009-08-15}} 15.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_7_0 Release notes] +|- +| {{hsk|GIMP_002_006_007}} 2.6.7 +| {{hsk|2009-08-13}} 13.08.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_7 Release notes] +|- +| {{hsk|GIMP_002_006_006}} 2.6.6 +| {{hsk|2009-03-16}} 16.03.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_6 Release notes] +|- +| {{hsk|GIMP_002_006_005}} 2.6.5 +| {{hsk|2009-02-15}} 15.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_5 Release notes] +|- +| {{hsk|GIMP_002_006_004}} 2.6.4 +| {{hsk|2009-02-14}} 14.02.2009 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_4 Release notes] +|- +| {{hsk|GIMP_002_006_003}} 2.6.3 +| {{hsk|2008-11-21}} 21.11.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_3 Release notes] +|- +| {{hsk|GIMP_002_006_002}} 2.6.2 +| {{hsk|2008-10-30}} 30.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_2 Release notes] +|- +| {{hsk|GIMP_002_006_001}} 2.6.1 +| {{hsk|2008-10-08}} 08.10.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_006_000}} 2.6.0 +| {{hsk|2008-09-30}} 30.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_6_0 Release notes] +|- +| {{hsk|GIMP_002_005_004}} 2.5.4 +| {{hsk|2008-09-16}} 16.09.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_4 Release notes] +|- +| {{hsk|GIMP_002_005_003}} 2.5.3 +| {{hsk|2008-08-21}} 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_3 Release notes] +|- +| {{hsk|GIMP_002_004_007}} 2.4.7 +| {{hsk|2008-08-21}} 21.08.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_7 Release notes] +|- +| {{hsk|GIMP_002_005_002}} 2.5.2 +| {{hsk|2008-07-16}} 16.07.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_2 Release notes] +|- +| {{hsk|GIMP_002_005_001}} 2.5.1 +| {{hsk|2008-06-15}} 15.06.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_1 Release notes] +|- +| {{hsk|GIMP_002_004_006}} 2.4.6 +| {{hsk|2008-05-29}} 29.05.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_6 Release notes] +|- +| {{hsk|GIMP_002_005_000}} 2.5.0 +| {{hsk|2008-04-09}} 09.04.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_5_0 Release notes] +|- +| {{hsk|GIMP_002_004_005}} 2.4.5 +| {{hsk|2008-02-29}} 29.02.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_5 Release notes] +|- +| {{hsk|GIMP_002_004_004}} 2.4.4 +| {{hsk|2008-01-30}} 30.01.2008 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_4 Release notes] +|- +| {{hsk|GIMP_002_004_003}} 2.4.3 +| {{hsk|2007-12-16}} 16.12.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_3 Release notes] +|- +| {{hsk|GIMP_002_004_002}} 2.4.2 +| {{hsk|2007-11-20}} 20.11.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_2 Release notes] +|- +| {{hsk|GIMP_002_004_001}} 2.4.1 +| {{hsk|2007-10-31}} 31.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_004_000}} 2.4.0 +| {{hsk|2007-10-23}} 23.10.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_4_0 Release notes] +|- +| {{hsk|GIMP_002_003_019}} 2.3.19 +| {{hsk|2007-07-24}} 24.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_19 Release notes] +|- +| {{hsk|GIMP_002_002_017}} 2.2.17 +| {{hsk|2007-07-13}} 13.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_17 Release notes] +|- +| {{hsk|GIMP_002_002_016}} 2.2.16 +| {{hsk|2007-07-06}} 06.07.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_16 Release notes] +|- +| {{hsk|GIMP_002_003_018}} 2.3.18 +| {{hsk|2007-06-11}} 11.06.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_18 Release notes] +|- +| {{hsk|GIMP_002_003_017}} 2.3.17 +| {{hsk|2007-05-27}} 27.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_17 Release notes] +|- +| {{hsk|GIMP_002_002_015}} 2.2.15 +| {{hsk|2007-05-26}} 26.05.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_15 Release notes] +|- +| {{hsk|GIMP_002_003_016}} 2.3.16 +| {{hsk|2007-04-24}} 24.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_16 Release notes] +|- +| {{hsk|GIMP_002_002_014}} 2.2.14 +| {{hsk|2007-04-17}} 17.04.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_14 Release notes] +|- +| {{hsk|GIMP_002_003_015}} 2.3.15 +| {{hsk|2007-03-09}} 09.03.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_15 Release notes] +|- +| {{hsk|GIMP_002_003_014}} 2.3.14 +| {{hsk|2007-01-23}} 23.01.2007 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_14 Release notes] +|- +| {{hsk|GIMP_002_003_013}} 2.3.13 +| {{hsk|2006-11-23}} 23.11.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_13 Release notes] +|- +| {{hsk|GIMP_002_003_012}} 2.3.12 +| {{hsk|2006-10-11}} 11.10.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_12 Release notes] +|- +| {{hsk|GIMP_002_003_011}} 2.3.11 +| {{hsk|2006-09-07}} 07.09.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_11 Release notes] +|- +| {{hsk|GIMP_002_002_013}} 2.2.13 +| {{hsk|2006-08-24}} 24.08.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_13 Release notes] +|- +| {{hsk|GIMP_002_002_012}} 2.2.12 +| {{hsk|2006-07-06}} 06.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_12 Release notes] +|- +| {{hsk|GIMP_002_003_010}} 2.3.10 +| {{hsk|2006-07-05}} 05.07.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_10 Release notes] +|- +| {{hsk|GIMP_002_003_009}} 2.3.9 +| {{hsk|2006-06-05}} 05.06.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_9 Release notes] +|- +| {{hsk|GIMP_002_002_011}} 2.2.11 +| {{hsk|2006-04-13}} 13.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_11 Release notes] +|- +| {{hsk|GIMP_002_003_008}} 2.3.8 +| {{hsk|2006-04-12}} 12.04.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_8 Release notes] +|- +| {{hsk|GIMP_002_003_007}} 2.3.7 +| {{hsk|2006-02-08}} 08.02.2006 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_7 Release notes] +|- +| {{hsk|GIMP_002_003_006}} 2.3.6 +| {{hsk|2005-12-28}} 28.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_6 Release notes] +|- +| {{hsk|GIMP_002_002_010}} 2.2.10 +| {{hsk|2005-12-27}} 27.12.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_10 Release notes] +|- +| {{hsk|GIMP_002_003_005}} 2.3.5 +| {{hsk|2005-11-04}} 04.11.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_5 Release notes] +|- +| {{hsk|GIMP_002_002_009}} 2.2.9 +| {{hsk|2005-10-27}} 27.10.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_9 Release notes] +|- +| {{hsk|GIMP_002_003_004}} 2.3.4 +| {{hsk|2005-09-26}} 26.09.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_4 Release notes] +|- +| {{hsk|GIMP_002_003_003}} 2.3.3 +| {{hsk|2005-08-10}} 10.08.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_3 Release notes] +|- +| {{hsk|GIMP_002_003_002}} 2.3.2 +| {{hsk|2005-07-01}} 01.07.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_2 Release notes] +|- +| {{hsk|GIMP_002_002_008}} 2.2.8 +| {{hsk|2005-06-26}} 26.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_8 Release notes] +|- +| {{hsk|GIMP_002_003_001}} 2.3.1 +| {{hsk|2005-06-09}} 09.06.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_1 Release notes] +|- +| {{hsk|GIMP_002_003_000}} 2.3.0 +| {{hsk|2005-05-14}} 14.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_3_0 Release notes] +|- +| {{hsk|GIMP_002_002_007}} 2.2.7 +| {{hsk|2005-05-08}} 08.05.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_7 Release notes] +|- +| {{hsk|GIMP_002_002_006}} 2.2.6 +| {{hsk|2005-04-10}} 10.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_6 Release notes] +|- +| {{hsk|GIMP_002_002_005}} 2.2.5 +| {{hsk|2005-04-09}} 09.04.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_5 Release notes] +|- +| {{hsk|GIMP_002_002_004}} 2.2.4 +| {{hsk|2005-02-22}} 22.02.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_4 Release notes] +|- +| {{hsk|GIMP_002_002_003}} 2.2.3 +| {{hsk|2005-01-22}} 22.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_3 Release notes] +|- +| {{hsk|GIMP_002_002_002}} 2.2.2 +| {{hsk|2005-01-09}} 09.01.2005 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_2 Release notes] +|- +| {{hsk|GIMP_002_002_001}} 2.2.1 +| {{hsk|2004-12-28}} 28.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_002_000}} 2.2.0 +| {{hsk|2004-12-19}} 19.12.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_2_0 Release notes] +|- +| {{hsk|GIMP_002_000_006}} 2.0.6 +| {{hsk|2004-11-02}} 02.11.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_6 Release notes] +|- +| {{hsk|GIMP_002_001_007}} 2.1.7 +| {{hsk|2004-10-14}} 14.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_7 Release notes] +|- +| {{hsk|GIMP_002_001_006}} 2.1.6 +| {{hsk|2004-10-05}} 05.10.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_6 Release notes] +|- +| {{hsk|GIMP_002_000_005}} 2.0.5 +| {{hsk|2004-09-25}} 25.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_5 Release notes] +|- +| {{hsk|GIMP_002_001_005}} 2.1.5 +| {{hsk|2004-09-19}} 19.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_5 Release notes] +|- +| {{hsk|GIMP_002_001_004}} 2.1.4 +| {{hsk|2004-09-05}} 05.09.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_4 Release notes] +|- +| {{hsk|GIMP_002_001_003}} 2.1.3 +| {{hsk|2004-08-06}} 06.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_3 Release notes] +|- +| {{hsk|GIMP_002_000_004}} 2.0.4 +| {{hsk|2004-08-05}} 05.08.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_4 Release notes] +|- +| {{hsk|GIMP_002_001_002}} 2.1.2 +| {{hsk|2004-07-20}} 20.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_2 Release notes] +|- +| {{hsk|GIMP_002_000_003}} 2.0.3 +| {{hsk|2004-07-17}} 17.07.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_3 Release notes] +|- +| {{hsk|GIMP_002_001_001}} 2.1.1 +| {{hsk|2004-06-24}} 24.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_1 Release notes] +|- +| {{hsk|GIMP_002_000_002}} 2.0.2 +| {{hsk|2004-06-15}} 15.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_2 Release notes] +|- +| {{hsk|GIMP_002_001_000}} 2.1.0 +| {{hsk|2004-06-02}} 02.06.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_1_0 Release notes] +|- +| {{hsk|GIMP_002_000_001}} 2.0.1 +| {{hsk|2004-04-13}} 13.04.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_002_000_000}} 2.0.0 +| {{hsk|2004-03-23}} 23.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_2_0_0 Release notes] +|- +| {{hsk|GIMP_001_003_027}} 1.3.27 +| {{hsk|2004-03-04}} 04.03.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_27 Release notes] +|- +| {{hsk|GIMP_001_003_026}} 1.3.26 +| {{hsk|2004-02-04}} 04.02.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_26 Release notes] +|- +| {{hsk|GIMP_001_003_025}} 1.3.25 +| {{hsk|2004-01-19}} 19.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_25 Release notes] +|- +| {{hsk|GIMP_001_003_024}} 1.3.24 +| {{hsk|2004-01-07}} 07.01.2004 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_24 Release notes] +|- +| {{hsk|GIMP_001_003_023}} 1.3.23 +| {{hsk|2003-11-24}} 24.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_23 Release notes] +|- +| {{hsk|GIMP_001_003_022}} 1.3.22 +| {{hsk|2003-11-03}} 03.11.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_22 Release notes] +|- +| {{hsk|GIMP_001_003_021}} 1.3.21 +| {{hsk|2003-10-05}} 05.10.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_21 Release notes] +|- +| {{hsk|GIMP_001_003_020}} 1.3.20 +| {{hsk|2003-09-07}} 07.09.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_20 Release notes] +|- +| {{hsk|GIMP_001_003_019}} 1.3.19 +| {{hsk|2003-08-27}} 27.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_19 Release notes] +|- +| {{hsk|GIMP_001_003_018}} 1.3.18 +| {{hsk|2003-08-11}} 11.08.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_18 Release notes] +|- +| {{hsk|GIMP_001_003_017}} 1.3.17 +| {{hsk|2003-07-25}} 25.07.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_17 Release notes] +|- +| {{hsk|GIMP_001_003_016}} 1.3.16 +| {{hsk|2003-06-27}} 27.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_16 Release notes] +|- +| {{hsk|GIMP_001_002_005}} 1.2.5 +| {{hsk|2003-06-14}} 14.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_5 Release notes] +|- +| {{hsk|GIMP_001_003_015}} 1.3.15 +| {{hsk|2003-06-09}} 09.06.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_15 Release notes] +|- +| {{hsk|GIMP_001_002_004}} 1.2.4 +| {{hsk|2003-05-20}} 20.05.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_4 Release notes] +|- +| {{hsk|GIMP_001_003_014}} 1.3.14 +| {{hsk|2003-04-14}} 14.04.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_14 Release notes] +|- +| {{hsk|GIMP_001_003_013}} 1.3.13 +| {{hsk|2003-03-23}} 23.03.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_13 Release notes] +|- +| {{hsk|GIMP_001_003_012}} 1.3.12 +| {{hsk|2003-02-18}} 18.02.2003 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_12 Release notes] +|- +| {{hsk|GIMP_001_003_011}} 1.3.11 +| {{hsk|2002-12-30}} 30.12.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_11 Release notes] +|- +| {{hsk|GIMP_001_003_010}} 1.3.10 +| {{hsk|2002-11-07}} 07.11.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_10 Release notes] +|- +| {{hsk|GIMP_001_003_009}} 1.3.9 +| {{hsk|2002-10-11}} 11.10.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_9 Release notes] +|- +| {{hsk|GIMP_001_003_008}} 1.3.8 +| {{hsk|2002-08-20}} 20.08.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_8 Release notes] +|- +| {{hsk|GIMP_001_003_007}} 1.3.7 +| {{hsk|2002-05-30}} 30.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_7 Release notes] +|- +| {{hsk|GIMP_001_003_006}} 1.3.6 +| {{hsk|2002-05-29}} 29.05.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_6 Release notes] +|- +| {{hsk|GIMP_001_003_005}} 1.3.5 +| {{hsk|2002-03-28}} 28.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_5 Release notes] +|- +| {{hsk|GIMP_001_003_004}} 1.3.4 +| {{hsk|2002-03-09}} 09.03.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_4 Release notes] +|- +| {{hsk|GIMP_001_003_003}} 1.3.3 +| {{hsk|2002-02-10}} 10.02.2002 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_3 Release notes] +|- +| {{hsk|GIMP_001_003_002}} 1.3.2 +| {{hsk|2001-12-29}} 29.12.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_2 Release notes] +|- +| {{hsk|GIMP_001_003_001}} 1.3.1 +| {{hsk|2001-11-25}} 25.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_1 Release notes] +|- +| {{hsk|GIMP_001_003_000}} 1.3.0 +| {{hsk|2001-11-13}} 13.11.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_3_0 Release notes] +|- +| {{hsk|GIMP_001_002_002}} 1.2.2 +| {{hsk|2001-07-26}} 26.07.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_2 Release notes] +|- +| {{hsk|GIMP_001_002_001}} 1.2.1 +| {{hsk|2001-01-22}} 22.01.2001 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_001_002_000}} 1.2.0 +| {{hsk|2000-12-25}} 25.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_2_0 Release notes] +|- +| {{hsk|GIMP_001_001_032}} 1.1.32 +| {{hsk|2000-12-21}} 21.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_32 Release notes] +|- +| {{hsk|GIMP_001_001_031}} 1.1.31 +| {{hsk|2000-12-19}} 19.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_31 Release notes] +|- +| {{hsk|GIMP_001_001_030}} 1.1.30 +| {{hsk|2000-12-10}} 10.12.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_30 Release notes] +|- +| {{hsk|GIMP_001_001_029}} 1.1.29 +| {{hsk|2000-10-31}} 31.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_29 Release notes] +|- +| {{hsk|GIMP_001_001_028}} 1.1.28 +| {{hsk|2000-10-16}} 16.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_28 Release notes] +|- +| {{hsk|GIMP_001_001_027}} 1.1.27 +| {{hsk|2000-10-04}} 04.10.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_27 Release notes] +|- +| {{hsk|GIMP_001_001_026}} 1.1.26 +| {{hsk|2000-09-23}} 23.09.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_26 Release notes] +|- +| {{hsk|GIMP_001_001_025}} 1.1.25 +| {{hsk|2000-08-21}} 21.08.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_25 Release notes] +|- +| {{hsk|GIMP_001_001_024}} 1.1.24 +| {{hsk|2000-06-22}} 22.06.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_24 Release notes] +|- +| {{hsk|GIMP_001_001_023}} 1.1.23 +| {{hsk|2000-05-28}} 28.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_23 Release notes] +|- +| {{hsk|GIMP_001_001_022}} 1.1.22 +| {{hsk|2000-05-16}} 16.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_22 Release notes] +|- +| {{hsk|GIMP_001_001_021}} 1.1.21 +| {{hsk|2000-05-01}} 01.05.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_21 Release notes] +|- +| {{hsk|GIMP_001_001_020}} 1.1.20 +| {{hsk|2000-04-22}} 22.04.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_20 Release notes] +|- +| {{hsk|GIMP_001_001_019}} 1.1.19 +| {{hsk|2000-03-30}} 30.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_19 Release notes] +|- +| {{hsk|GIMP_001_001_018}} 1.1.18 +| {{hsk|2000-03-04}} 04.03.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_18 Release notes] +|- +| {{hsk|GIMP_001_001_017}} 1.1.17 +| {{hsk|2000-02-12}} 12.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_17 Release notes] +|- +| {{hsk|GIMP_001_001_016}} 1.1.16 +| {{hsk|2000-02-02}} 02.02.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_16 Release notes] +|- +| {{hsk|GIMP_001_001_015}} 1.1.15 +| {{hsk|2000-01-14}} 14.01.2000 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_15 Release notes] +|- +| {{hsk|GIMP_001_001_014}} 1.1.14 +| {{hsk|1999-12-16}} 16.12.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_14 Release notes] +|- +| {{hsk|GIMP_001_001_013}} 1.1.13 +| {{hsk|1999-11-25}} 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_13 Release notes] +|- +| {{hsk|GIMP_001_001_012}} 1.1.12 +| {{hsk|1999-11-25}} 25.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_12 Release notes] +|- +| {{hsk|GIMP_001_001_011}} 1.1.11 +| {{hsk|1999-11-01}} 01.11.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_11 Release notes] +|- +| {{hsk|GIMP_001_001_010}} 1.1.10 +| {{hsk|1999-10-06}} 06.10.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_10 Release notes] +|- +| {{hsk|GIMP_001_001_009}} 1.1.9 +| {{hsk|1999-09-10}} 10.09.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_9 Release notes] +|- +| {{hsk|GIMP_001_001_008}} 1.1.8 +| {{hsk|1999-08-02}} 02.08.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_8 Release notes] +|- +| {{hsk|GIMP_001_001_007}} 1.1.7 +| {{hsk|1999-07-17}} 17.07.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_7 Release notes] +|- +| {{hsk|GIMP_001_001_006}} 1.1.6 +| {{hsk|1999-06-06}} 06.06.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_6 Release notes] +|- +| {{hsk|GIMP_001_001_005}} 1.1.5 +| {{hsk|1999-05-03}} 03.05.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_5 Release notes] +|- +| {{hsk|GIMP_001_000_004}} 1.0.4 +| {{hsk|1999-04-04}} 04.04.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_4 Release notes] +|- +| {{hsk|GIMP_001_001_004}} 1.1.4 +| {{hsk|1999-03-30}} 30.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_4 Release notes] +|- +| {{hsk|GIMP_001_000_003}} 1.0.3 +| {{hsk|1999-03-29}} 29.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_3 Release notes] +|- +| {{hsk|GIMP_001_001_003}} 1.1.3 +| {{hsk|1999-03-09}} 09.03.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_3 Release notes] +|- +| {{hsk|GIMP_001_001_002}} 1.1.2 +| {{hsk|1999-02-04}} 04.02.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_2 Release notes] +|- +| {{hsk|GIMP_001_001_001}} 1.1.1 +| {{hsk|1999-01-21}} 21.01.1999 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_1 Release notes] +|- +| {{hsk|GIMP_001_001_000}} 1.1.0 +| {{hsk|1998-12-24}} 24.12.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_1_0 Release notes] +|- +| {{hsk|GIMP_001_000_002}} 1.0.2 +| {{hsk|1998-10-15}} 15.10.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_2 Release notes] +|- +| {{hsk|GIMP_001_000_001}} 1.0.1 +| {{hsk|1998-09-27}} 27.09.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_1 Release notes] +|- bgcolor="Silver" +| {{hsk|GIMP_001_000_000}} 1.0.0 +| {{hsk|1998-06-05}} 05.06.1998 +| [https://git.gnome.org/browse/gimp/tree/NEWS?id=GIMP_1_0_0 Release notes] +|- +| {{hsk|GIMP_000_099_029}} 0.99.29 +| {{hsk|1998-05-05}} 05.05.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_29 Release notes] +|- +| {{hsk|GIMP_000_099_028}} 0.99.28 +| {{hsk|1998-04-26}} 26.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_28 Release notes] +|- +| {{hsk|GIMP_000_099_027}} 0.99.27 +| {{hsk|1998-04-18}} 18.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_27 Release notes] +|- +| {{hsk|GIMP_000_099_025}} 0.99.25 +| {{hsk|1998-04-11}} 11.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_25 Release notes] +|- +| {{hsk|GIMP_000_099_024}} 0.99.24 +| {{hsk|1998-04-08}} 08.04.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_24 Release notes] +|- +| {{hsk|GIMP_000_099_023}} 0.99.23 +| {{hsk|1998-03-27}} 27.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_23 Release notes] +|- +| {{hsk|GIMP_000_099_022}} 0.99.22 +| {{hsk|1998-03-20}} 20.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_22 Release notes] +|- +| {{hsk|GIMP_000_099_021}} 0.99.21 +| {{hsk|1998-03-15}} 15.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_21 Release notes] +|- +| {{hsk|GIMP_000_099_020}} 0.99.20 +| {{hsk|1998-03-12}} 12.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_20 Release notes] +|- +| {{hsk|GIMP_000_099_019}} 0.99.19 +| {{hsk|1998-03-02}} 02.03.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_19 Release notes] +|- +| {{hsk|GIMP_000_099_018}} 0.99.18 +| {{hsk|1998-01-26}} 26.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_18 Release notes] +|- +| {{hsk|GIMP_000_099_017}} 0.99.17 +| {{hsk|1998-01-04}} 04.01.1998 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_17 Release notes] +|- +| {{hsk|GIMP_000_099_016}} 0.99.16 +| {{hsk|1997-12-15}} 15.12.1997 +| [https://git.gnome.org/browse/gimp/tree/README?id=GIMP_0_99_16 Release notes] +|} + +==How to update the history== +To update the history you can use the following script under Linux: +
    +#! /bin/bash
    +# Purpose: Update the release history in the developer wiki
    +# Author:  Sven Claussner
    +# License: GNU General Public License 3
    +#          See http://www.gnu.org/copyleft/gpl.html for full text.
    +
    +echo "==History=="
    +echo ""
    +echo "{| class=\"wikitable sortable mw-collapsible\" align=\"center\" border=\"1\""
    +echo "! scope=\"col\" | Version"
    +echo "! scope=\"col\" | Date"
    +echo "! scope=\"col\" | Release notes"
    +echo "! class=\"unsortable\"class=\"unsortable\"  |"
    +git for-each-ref --format="%(refname) %(taggerdate:short) %(refname)" --sort=-taggerdate refs/tags | \
    +grep /GIMP_[0-9]_[0-9_]*$ | \
    +awk '{
    +          gsub("refs/tags/","");
    +          if ( $3 ~ /[02468]_0$/ )
    +              print "|- bgcolor=\"Silver\"";
    +          else
    +              print "|-";
    +
    +          split($1,version,"_");
    +          major_v=sprintf("%.3d",version[2]);
    +          minor_v=sprintf("%.3d",version[3]);
    +          micro_v=sprintf("%.3d",version[4]);
    +          version_key=version[1] "_" major_v "_" minor_v "_" micro_v;
    +          version_display=version[2] "." version[3] "." version[4];
    +
    +          split($2,tag_date,"-");
    +          year=tag_date[1];
    +          month=sprintf("%.2d",tag_date[2]);
    +          day=sprintf("%.2d",tag_date[3]);
    +          date_key= year "-" month "-" day;
    +          date_display= day "." month "." year;
    +
    +          print "| {{hsk|" version_key "}} " version_display;
    +          print "| {{hsk|" date_key "}} " date_display;
    +          if ( $3 !~ /GIMP_0/ )
    +              print "| [https://git.gnome.org/browse/gimp/tree/NEWS?id=" $3 " Release notes]";
    +          else
    +              print "| [https://git.gnome.org/browse/gimp/tree/README?id=" $3 " Release notes]";
    +         }'
    +echo "|}"
    +
    +This will regenerate the whole history. + +Then open the chapter "History" here and insert the output. diff --git a/wiki/Release:Packaging_Guide-20200920040235-edit.txt b/wiki/Release:Packaging_Guide-20200920040235-edit.txt new file mode 100644 index 0000000..9718ce4 --- /dev/null +++ b/wiki/Release:Packaging_Guide-20200920040235-edit.txt @@ -0,0 +1,74 @@ +== Coverage == + +This guide aims to establish better communication between GIMP developers and 3rd party packagers and provide the latter with our understanding what we consider a good packaging practice. + +For simplicity's sake we refer to the GIMP project, although realistically the guide covers both GIMP, GEGL, and babl projects. + +== Background == + +GIMP is free software, and it's within your right to modify it as long as you publish your changes along with builds you provide, under the same license. As much as we'd like to see people contributing to the upstream project rather maintaining forks, we respect your freedom to act within what GPL allows. + +Moreover, we'd rather see a community where maintainers of forks (created for whatever reason) sticked around. This is because better communication between the upstream and the downstream helps providing great user experience at all ends of the spectrum. + +As the upstream team, we have a history of looking at forks and creating cleaner, better designed implementations of modifications found in forks. We think it would be a much better use of time and human resources, if the upstream and the downstream worked off the same code base, exchanged bug reports, and provided user support. + +== Staying in the Loop with the Upstream Team == + +We recommend the following steps to keep up with the upstream team: + +* Subscribe to bugs reported to [https://gitlab.gnome.org/GNOME/gimp/issues GNOME's gitlab] for the 'GIMP' product. +* Show up in the #gimp IRC channel at irc.gimp.net. +* Follow suggestions listed below (matching the kind of 3rd party packages you provide). + +== Packaging == + +=== General Recommendations === + +'''Be Safe and Secure''' + +Browsers are getting picky about how users access information online - especially if they download software. Users are getting aware of security risks as well, with some people simply refusing to download anything over an insecure HTTP connection. + +Make sure your site meets currently expected transport security and MitM protection standard. Running your download site against the Mozilla Observatory is a good approach to get the basics of security: https://observatory.mozilla.org/ + + +'''Stay current!''' If you provide builds, chances are that you maybe become a known source for builds for a specific platform or distro. We recommend to keep your builds as current as is feasible on the platform you are building for (at a certain point, the availability of dependencies will limit what can reasonably be provided; GIMP tends to be rather conservative especially in its stable versions, though). + +Providing old releases is OK, trailing behind a branch in active development for a few days or maybe a week is OK as well. Trailing behind an actively developed branch for months is NOT RECOMMENDED - in this case, please indicate that your builds are outdated, or pull them altogether. + +'''Make it obvious what version you are providing!''' This is all about labeling the packages you provide. If you label them "2.8.18", a user (and the GIMP developers) will expect to find exactly 2.8.18 inside. + +* Bad: gimp.exe, gimp-2.8.exe +* Good: gimp-2.8.18-x86_64.exe + +If you are building something that doesn't have a fixed version number - i.e. anything between two actual GIMP releases - please include the abbreviated commit Id as well. When a user installs new unstable builds continuously, it helps us understanding the range of changes (time-wise), when a particular bug could have been introduced. + +* Bad: gimp-2.9.5.exe +* Good: gimp-2.9.5-0fcf4ca-x86_64.exe + +=== Packaging As-Is === + +* '''Provide as many stock features as possible.''' While you can build GIMP without certain features and keep the list of dependencies low, we ask packagers to provide as complete builds as possible. This is to make sure that users get all the features they see advertised in the user manual and various tutorials online. + +* '''Make unstable builds available alongside stable builds.''' If you provide unstable (Git master) builds of GIMP, it should be possible to install it alongside with a stable GIMP release. This is because we make unstable releases for people who are eager to try new features and provide sensible bug reports, while using the stable release for actual daily work. + +* '''Provide Level 1 and 2 support.''' Users should be able to contact you and report bugs. If you receive reports that are not related to specifics of the packaging, your should report those bugs to the upstream GIMP project. This requires having an account at [https://bugzilla.gnome.org/ GNOME's Bugzilla]. + +=== Packaging with Source Code Changes === + +The general idea is that people who publish modified builds of GIMP have responsibilities they should honor. The upstream project will fix bugs discovered in modified 3rd party builds, but only if those bugs are not caused by 3rd party modifications. + +* '''Document and publish your changes for end-users.''' Some packagers are known to build GIMP with tweaks that change the behavior of GIMP or add/remove features. Users should be able to know what exactly they are getting. Therefore, we ask packagers to provide a list of changes for users, in plain language. + +* '''Release patches that you applied to GIMP.''' Publishing changes to source code is a GPL requirement. We ask you to honor it. + +We recommend creating a page that would list changes (e.g. in an itemized list) and link to source code patches available as diff files on per-feature basis. + +* '''Provide Level 1 and 2 support.''' Users should be able to contact you and report bugs. If you receive reports for bugs that are not caused by either your patches or packaging, please reports those bugs to the upstream GIMP project. This requires having an account at [https://bugzilla.gnome.org/ GNOME's Bugzilla]. + +=== Packaging with 3rd Party Extensions === + +Much like with source code changes, packagers who add extra features into the bundle have responsibilities. The upstream team cannot be held responsible for bugs in 3rd party code. + +* '''List the 3rd party plugins and scripts that you bundled with GIMP.''' We are interested to understand what kind of existing plugins that are not part of GIMP are in a high demand by users. We cannot realistically check every 3rd party build out there, so we would appreciate a list of 3rd party extensions and plugins that you ship with your build. This helps us providing better out-of-box user experience. It also helps users understand who they should contact regarding bugs in scripts and plug-ins. + +* '''Provide Level 1 and 2 support.''' Users should be able to contact you and report bugs. If you receive reports for bugs that are not caused by your patches, please reports those bugs to the upstream GIMP project. This requires having an account at [https://gitlab.gnome.org/ GNOME's Gitlab instance]. diff --git a/wiki/Roadmap-20141226014631-show.txt b/wiki/Roadmap-20141226014631-show.txt new file mode 100644 index 0000000..1075f1e --- /dev/null +++ b/wiki/Roadmap-20141226014631-show.txt @@ -0,0 +1,149 @@ + + +== Feature prioritization == + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| High bit depths | work in progress | Up to 64bit per color channel, will be available in 2.10 +|- +| Preview filters on canvas | Yes | Will be available in 2.10 (partially done in Git master) +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|- +| Auto-anchoring of floating selection | No | +|- +| Turn the IWarp plug-in into an on-canvas tool | work in progress | Will be part of 2.10 (available in Git master) +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Merge basic transformation tools | work in progress | [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] will be part of v2.10 (available in Git master) +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499] +|- +| Brushpack support | No | +|- +| Switch to SwatchBooker file format for palettes and gradients | No | +|- +| Support the XDG Base Directory Specification | Yes | +|- +| Canvas rotation | Yes | Will be part of v2.10 (available in Git master) +|- +| High-end CMYK support | No | Low priority, needs complete GEGL port first, then a dedicated developer and a spec from usability team +|- +| Support for more brush engines | work in progress | MyPaint (branch mypaint-brush), various real media simulations. Low priority +|} + +== Expected availability of developed features and solved bugs == + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + +Last updated: 25.05.2013 + + +* '''GIMP 2.10''' +** High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +** Support layer masks on layer groups +** Cleanup libgimp, deprecate all ancient pixel fiddling API +** [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +** [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +** Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +** Unified configuration path across platforms (using XDG when relevant) [done] +** Auto-anchoring of floating selection - or better, get rid of floating selections! +** Better support for image metadata (work in progress, master branch) +** High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +** Support layer masks on layer groups +** Cleanup libgimp, deprecate all ancient pixel fiddling API +** [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +** [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +** Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +** Unified configuration path across platforms (using XDG when relevant) [done] +** Auto-anchoring of floating selection - or better, get rid of floating selections! +** Better support for image metadata (work in progress, master branch) +* High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +* Support layer masks on layer groups +* Cleanup libgimp, deprecate all ancient pixel fiddling API +* [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +* [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +* Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +* Unified configuration path across platforms (using XDG when relevant) [done] +* Auto-anchoring of floating selection - or better, get rid of floating selections! +* Better support for image metadata (work in progress, master branch) +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10] +* TODO list: [[Hacking:TODO]] + +* '''GIMP 3.0''' +** Port to GTK3 [work in progress, branch gtk3-port] +** Port to GTK3 [work in progress, branch gtk3-port] +* Port to GTK3 [work in progress, branch gtk3-port] +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + +* '''"Future"''' The features here are on the roadmap, but have no milestone yet +** [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +** Preview filter effects on canvas instead in preview window +** Automatic layer boundary management +** Filter layers +** Layer effects +** Non-destructive editing +** Script recording and playback +** "Smart objects" +** [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +** Preview filter effects on canvas instead in preview window +** Automatic layer boundary management +** Filter layers +** Layer effects +** Non-destructive editing +** Script recording and playback +** "Smart objects" +* [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +* Preview filter effects on canvas instead in preview window +* Automatic layer boundary management +* Filter layers +* Layer effects +* Non-destructive editing +* Script recording and playback +* "Smart objects" +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] diff --git a/wiki/Roadmap-20150905134653-show.txt b/wiki/Roadmap-20150905134653-show.txt new file mode 100644 index 0000000..662fc9f --- /dev/null +++ b/wiki/Roadmap-20150905134653-show.txt @@ -0,0 +1,149 @@ + + +==Feature prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| High bit depths | work in progress | Up to 64bit per color channel, will be available in 2.10 +|- +| Preview filters on canvas | Yes | Will be available in 2.10 (partially done in Git master) +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|- +| Auto-anchoring of floating selection | No | +|- +| Turn the IWarp plug-in into an on-canvas tool | work in progress | Will be part of 2.10 (available in Git master) +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Merge basic transformation tools | work in progress | [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] will be part of v2.10 (available in Git master) +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499] +|- +| Brushpack support | No | +|- +| Switch to SwatchBooker file format for palettes and gradients | No | +|- +| Support the XDG Base Directory Specification | Yes | +|- +| Canvas rotation | Yes | Will be part of v2.10 (available in Git master) +|- +| High-end CMYK support | No | Low priority, needs complete GEGL port first, then a dedicated developer and a spec from usability team +|- +| Support for more brush engines | work in progress | MyPaint (branch mypaint-brush), various real media simulations. Low priority +|} + +==Expected availability of developed features and solved bugs== + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + +Last updated: 25.05.2013 + + +* '''GIMP 2.10''' +** High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +** Support layer masks on layer groups +** Cleanup libgimp, deprecate all ancient pixel fiddling API +** [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +** [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +** Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +** Unified configuration path across platforms (using XDG when relevant) [done] +** Auto-anchoring of floating selection - or better, get rid of floating selections! +** Better support for image metadata (work in progress, master branch) +** High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +** Support layer masks on layer groups +** Cleanup libgimp, deprecate all ancient pixel fiddling API +** [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +** [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +** Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +** Unified configuration path across platforms (using XDG when relevant) [done] +** Auto-anchoring of floating selection - or better, get rid of floating selections! +** Better support for image metadata (work in progress, master branch) +* High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +* Support layer masks on layer groups +* Cleanup libgimp, deprecate all ancient pixel fiddling API +* [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +* [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +* Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +* Unified configuration path across platforms (using XDG when relevant) [done] +* Auto-anchoring of floating selection - or better, get rid of floating selections! +* Better support for image metadata (work in progress, master branch) +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10] +* TODO list: [[Hacking:TODO]] + +* '''GIMP 3.0''' +** Port to GTK3 [work in progress, branch gtk3-port] +** Port to GTK3 [work in progress, branch gtk3-port] +* Port to GTK3 [work in progress, branch gtk3-port] +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + +* '''"Future"''' The features here are on the roadmap, but have no milestone yet +** [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +** Preview filter effects on canvas instead in preview window +** Automatic layer boundary management +** Filter layers +** Layer effects +** Non-destructive editing +** Script recording and playback +** "Smart objects" +** [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +** Preview filter effects on canvas instead in preview window +** Automatic layer boundary management +** Filter layers +** Layer effects +** Non-destructive editing +** Script recording and playback +** "Smart objects" +* [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +* Preview filter effects on canvas instead in preview window +* Automatic layer boundary management +* Filter layers +* Layer effects +* Non-destructive editing +* Script recording and playback +* "Smart objects" +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] diff --git a/wiki/Roadmap-20151001010703-show.txt b/wiki/Roadmap-20151001010703-show.txt new file mode 100644 index 0000000..662fc9f --- /dev/null +++ b/wiki/Roadmap-20151001010703-show.txt @@ -0,0 +1,149 @@ + + +==Feature prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| High bit depths | work in progress | Up to 64bit per color channel, will be available in 2.10 +|- +| Preview filters on canvas | Yes | Will be available in 2.10 (partially done in Git master) +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|- +| Auto-anchoring of floating selection | No | +|- +| Turn the IWarp plug-in into an on-canvas tool | work in progress | Will be part of 2.10 (available in Git master) +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Merge basic transformation tools | work in progress | [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] will be part of v2.10 (available in Git master) +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499] +|- +| Brushpack support | No | +|- +| Switch to SwatchBooker file format for palettes and gradients | No | +|- +| Support the XDG Base Directory Specification | Yes | +|- +| Canvas rotation | Yes | Will be part of v2.10 (available in Git master) +|- +| High-end CMYK support | No | Low priority, needs complete GEGL port first, then a dedicated developer and a spec from usability team +|- +| Support for more brush engines | work in progress | MyPaint (branch mypaint-brush), various real media simulations. Low priority +|} + +==Expected availability of developed features and solved bugs== + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + +Last updated: 25.05.2013 + + +* '''GIMP 2.10''' +** High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +** Support layer masks on layer groups +** Cleanup libgimp, deprecate all ancient pixel fiddling API +** [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +** [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +** Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +** Unified configuration path across platforms (using XDG when relevant) [done] +** Auto-anchoring of floating selection - or better, get rid of floating selections! +** Better support for image metadata (work in progress, master branch) +** High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +** Support layer masks on layer groups +** Cleanup libgimp, deprecate all ancient pixel fiddling API +** [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +** [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +** [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +** Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +** Unified configuration path across platforms (using XDG when relevant) [done] +** Auto-anchoring of floating selection - or better, get rid of floating selections! +** Better support for image metadata (work in progress, master branch) +* High bit depths: [[Hacking:Porting_filters_to_GEGL| fully port to GEGL]] (work in progress) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/victor_matheus/8001 OpenCL in GEGL] (GSoC 2011 project, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +* Support layer masks on layer groups +* Cleanup libgimp, deprecate all ancient pixel fiddling API +* [http://gui.gimp.org/index.php/Warp_tool_specification Warp tool] (GSoC 2011 project) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/lightningismyname/6001 Seamless cloning] (GSoC 2011 project) +* [http://www.google-melange.com/gsoc/project/google/gsoc2011/enrico_schroeder/12001 GtkEntry-Widget instead of GimpSizeEntry] (GSoC 2011 project, parts already integrated in GIMP 2.8) +* [http://gui.gimp.org/index.php/Transformation_tool_specification Unified transform tool] (GSoC 2012 project, work in progress) +* Update foreground selection tool to use advanced matte operations from GEGL [https://bugzilla.gnome.org/show_bug.cgi?id=709875 Bug 709875], work in progress, stalled +* Unified configuration path across platforms (using XDG when relevant) [done] +* Auto-anchoring of floating selection - or better, get rid of floating selections! +* Better support for image metadata (work in progress, master branch) +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10] +* TODO list: [[Hacking:TODO]] + +* '''GIMP 3.0''' +** Port to GTK3 [work in progress, branch gtk3-port] +** Port to GTK3 [work in progress, branch gtk3-port] +* Port to GTK3 [work in progress, branch gtk3-port] +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + +* '''"Future"''' The features here are on the roadmap, but have no milestone yet +** [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +** Preview filter effects on canvas instead in preview window +** Automatic layer boundary management +** Filter layers +** Layer effects +** Non-destructive editing +** Script recording and playback +** "Smart objects" +** [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +** Preview filter effects on canvas instead in preview window +** Automatic layer boundary management +** Filter layers +** Layer effects +** Non-destructive editing +** Script recording and playback +** "Smart objects" +* [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +* Preview filter effects on canvas instead in preview window +* Automatic layer boundary management +* Filter layers +* Layer effects +* Non-destructive editing +* Script recording and playback +* "Smart objects" +: +* [https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] diff --git a/wiki/Roadmap-20151222122034-show.txt b/wiki/Roadmap-20151222122034-show.txt new file mode 100644 index 0000000..abb01a4 --- /dev/null +++ b/wiki/Roadmap-20151222122034-show.txt @@ -0,0 +1,126 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Mostly complete, released in 2.9.2 +|- +| Merge basic transformation tools | Yes | Released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| MyPaint Brush tool | work in progress | Released as experimental in 2.9.2 +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + + + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20160707051307-show.txt b/wiki/Roadmap-20160707051307-show.txt new file mode 100644 index 0000000..5a2d7fc --- /dev/null +++ b/wiki/Roadmap-20160707051307-show.txt @@ -0,0 +1,134 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Mostly complete, released in 2.9.2 +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as experimental in 2.9.2, to be released as stable in 2.9.4 +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Available in Git master, to be released in 2.9.4 +|- +| Color management fixes and improvements | work in progress | Work in progress, to be released in 2.9.4 (layer/image preview, color picking, view-level settings) +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | No | babl and GEGL need to be patched accordingly first +|- +| Support for gamma encodings other than the sRGB TRC | No | babl and GEGL need to be patched accordingly first +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20161012092025-show.txt b/wiki/Roadmap-20161012092025-show.txt new file mode 100644 index 0000000..ada8eb1 --- /dev/null +++ b/wiki/Roadmap-20161012092025-show.txt @@ -0,0 +1,138 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Mostly complete, released in 2.9.2 +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://bugzilla.gnome.org/show_bug.cgi?id=768772 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4 (layer/image preview, color picking, view-level settings) +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499], [https://bugzilla.gnome.org/show_bug.cgi?id=769112 Bug 769112] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| icon size minimal support | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=745835 Work in progress]. Still looking for the right implementation. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://bugzilla.gnome.org/show_bug.cgi?id=148930 [1]] +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | No | babl and GEGL need to be patched accordingly first +|- +| Support for gamma encodings other than the sRGB TRC | No | babl and GEGL need to be patched accordingly first +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20161027084101-show.txt b/wiki/Roadmap-20161027084101-show.txt new file mode 100644 index 0000000..ada8eb1 --- /dev/null +++ b/wiki/Roadmap-20161027084101-show.txt @@ -0,0 +1,138 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Mostly complete, released in 2.9.2 +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://bugzilla.gnome.org/show_bug.cgi?id=768772 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4 (layer/image preview, color picking, view-level settings) +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499], [https://bugzilla.gnome.org/show_bug.cgi?id=769112 Bug 769112] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| icon size minimal support | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=745835 Work in progress]. Still looking for the right implementation. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://bugzilla.gnome.org/show_bug.cgi?id=148930 [1]] +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | No | babl and GEGL need to be patched accordingly first +|- +| Support for gamma encodings other than the sRGB TRC | No | babl and GEGL need to be patched accordingly first +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20170128201102-show.txt b/wiki/Roadmap-20170128201102-show.txt new file mode 100644 index 0000000..bdfa24f --- /dev/null +++ b/wiki/Roadmap-20170128201102-show.txt @@ -0,0 +1,142 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Mostly complete, released in 2.9.2 +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://bugzilla.gnome.org/show_bug.cgi?id=768772 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4 (layer/image preview, color picking, view-level settings) +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499], [https://bugzilla.gnome.org/show_bug.cgi?id=769112 Bug 769112] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] +|- +| Cleanup libgimp | work in progress | (including major changes to plugin registration API) +|- +| icon size minimal support | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=745835 Work in progress]. Still looking for the right implementation. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|- +| Fix compositing part of blending modes | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=775653 Bug 775653] +|- +| Redesign wire protocol for scripts/plug-ins | No | D-Bus should be investigated as a cleaner choice +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://bugzilla.gnome.org/show_bug.cgi?id=148930 [1]] +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | No | babl and GEGL need to be patched accordingly first +|- +| Support for gamma encodings other than the sRGB TRC | No | babl and GEGL need to be patched accordingly first +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20170629120324-show.txt b/wiki/Roadmap-20170629120324-show.txt new file mode 100644 index 0000000..3f72d90 --- /dev/null +++ b/wiki/Roadmap-20170629120324-show.txt @@ -0,0 +1,151 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | work in progress | Reeased in 2.9.2. Missing: Make the tool faster (Simon Budig is on it) +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://bugzilla.gnome.org/show_bug.cgi?id=768772 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer moes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4. Missing: make it work for GEGL ops +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=704796 Bug 704796], [https://bugzilla.gnome.org/show_bug.cgi?id=61499 Bug 61499], [https://bugzilla.gnome.org/show_bug.cgi?id=769112 Bug 769112] +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] (the main issue here is undo support) +|- +| Cleanup libgimp | work in progress | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=770424 #770424] +|- +| Icon themes | work in progress | The icon themes are missing icons, we don't have guidelines for icons, symbolic icons fail to have discernible shapes, defeating the purpose of a symbolic theme +|- +| Icon size minimal support | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=745835 Work in progress]. Still looking for the right implementation. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|- +| Fix compositing part of blending modes | Yes | [https://bugzilla.gnome.org/show_bug.cgi?id=775653 Bug 775653] +|- +| Redesign wire protocol for scripts/plug-ins | No | D-Bus should be investigated as a cleaner choice +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://bugzilla.gnome.org/show_bug.cgi?id=148930 [1]] +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | No | babl and GEGL need to be patched accordingly first +|- +| Support for gamma encodings other than the sRGB TRC | No | babl and GEGL need to be patched accordingly first +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create N-side polygons, stars etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20171108145200-show.txt b/wiki/Roadmap-20171108145200-show.txt new file mode 100644 index 0000000..3169f07 --- /dev/null +++ b/wiki/Roadmap-20171108145200-show.txt @@ -0,0 +1,155 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10=== + +List of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://bugzilla.gnome.org/show_bug.cgi?id=768772 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4. Missing: make it work for GEGL ops +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=51112 Bug 51112] (the main issue here is undo support) +|- +| Cleanup libgimp | work in progress | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | work in progress | [https://bugzilla.gnome.org/show_bug.cgi?id=770424 #770424] +|- +| Icon themes | work in progress | The icon themes are missing icons, we don't have guidelines for icons, symbolic icons fail to have discernible shapes, defeating the purpose of a symbolic theme +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=2.10&product=GIMP List of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "gtk3-port" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry' +|- +| Fix compositing part of blending modes | Yes | [https://bugzilla.gnome.org/show_bug.cgi?id=775653 Bug 775653] +|- +| Redesign wire protocol for scripts/plug-ins | No | D-Bus should be investigated as a cleaner choice +|- +| Improve animation features | work in progress | Currently sits in the [https://git.gnome.org/browse/gimp/log/?h=wip/animation wip/animation] branch +|} + + +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=3.0&product=GIMP List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Automatic layer boundary management | No | [https://bugzilla.gnome.org/show_bug.cgi?id=93639 Bug 93639] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://bugzilla.gnome.org/show_bug.cgi?id=51937 Bug 51937], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://bugzilla.gnome.org/show_bug.cgi?id=148930 [1]] +|- +| Smart objects | No | [https://bugzilla.gnome.org/show_bug.cgi?id=694206 Bug 694206], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | work in progress | currently being worked on in babl +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://bugzilla.gnome.org/show_bug.cgi?id=102822 Bug 102822] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Simplified add-ons management | No | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://bugzilla.gnome.org/buglist.cgi?order=Importance&classification=Other&query_format=advanced&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=NEEDINFO⌖_milestone=Future&product=GIMP List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20180812150133-show.txt b/wiki/Roadmap-20180812150133-show.txt new file mode 100644 index 0000000..fd71338 --- /dev/null +++ b/wiki/Roadmap-20180812150133-show.txt @@ -0,0 +1,167 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4. Missing: make it work for GEGL ops +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Much better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDpi displays +* Wayland support on Linux + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry', needs revision +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Currently sits in the [https://gitlab.gnome.org/GNOME/gimp/tree/wip/animation wip/animation] branch +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Redesign wire protocol for scripts/plug-ins | No | D-Bus should be investigated as a cleaner choice +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | No | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | No | See [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | work in progress | currently being worked on in babl +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Simplified add-ons management | No | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20190418123119-show.txt b/wiki/Roadmap-20190418123119-show.txt new file mode 100644 index 0000000..1d97c01 --- /dev/null +++ b/wiki/Roadmap-20190418123119-show.txt @@ -0,0 +1,169 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Released in 2.9.4. Missing: make it work for GEGL ops +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Much better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDpi displays +* Wayland support on Linux + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master" +|- +| GtkEntry-Widget instead of GimpSizeEntry | work in progress | git branch 'soc-2011-gimpunitentry', needs revision +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Currently sits in the [https://gitlab.gnome.org/GNOME/gimp/tree/wip/animation wip/animation] branch +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminology currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Redesign wire protocol for scripts/plug-ins | No | D-Bus should be investigated as a cleaner choice +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | No | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is not front-end. +|- +| Simplified add-ons management | No | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20200126021133-show.txt b/wiki/Roadmap-20200126021133-show.txt new file mode 100644 index 0000000..1a8625a --- /dev/null +++ b/wiki/Roadmap-20200126021133-show.txt @@ -0,0 +1,170 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master" +|- +| Fix compositing part of blending modes | Yes | +|- +| Extensions management | work in progress | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20200706141314-show.txt b/wiki/Roadmap-20200706141314-show.txt new file mode 100644 index 0000000..1a8625a --- /dev/null +++ b/wiki/Roadmap-20200706141314-show.txt @@ -0,0 +1,170 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master" +|- +| Fix compositing part of blending modes | Yes | +|- +| Extensions management | work in progress | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20200915185522-show.txt b/wiki/Roadmap-20200915185522-show.txt new file mode 100644 index 0000000..1a8625a --- /dev/null +++ b/wiki/Roadmap-20200915185522-show.txt @@ -0,0 +1,170 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master" +|- +| Fix compositing part of blending modes | Yes | +|- +| Extensions management | work in progress | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20201002195946-show.txt b/wiki/Roadmap-20201002195946-show.txt new file mode 100644 index 0000000..1a8625a --- /dev/null +++ b/wiki/Roadmap-20201002195946-show.txt @@ -0,0 +1,170 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master" +|- +| Fix compositing part of blending modes | Yes | +|- +| Extensions management | work in progress | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20201016012344-show.txt b/wiki/Roadmap-20201016012344-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20201016012344-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20201111075926-show.txt b/wiki/Roadmap-20201111075926-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20201111075926-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20201124153015-edit.txt b/wiki/Roadmap-20201124153015-edit.txt new file mode 100644 index 0000000..413f24c --- /dev/null +++ b/wiki/Roadmap-20201124153015-edit.txt @@ -0,0 +1,162 @@ +== Feature Prioritization == + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + +== Roadmap == + +'''Legend''' + +Status Column: +{| +! scope="col" width="50px" | +|- +| {{no|}} || work hasn't started yet +|- +| {{wip| }} || work in progress +|- +| {{yes| }} || implementation finished +|} + +=== GIMP 2.10.x === + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|High bit depths || {{yes}} || Released in 2.9.2 +|- +|Preview filters on canvas || {{yes}} || Released in 2.9.2, [[Hacking:Porting filters to GEGL | porting status]] +|- +|OpenCL support || {{yes}} || Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting filters to GEGL |Porting Matrix]]) +|- +|Turn the IWarp plug-in into an on-canvas tool || {{yes}} || Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +|Merge basic transformation tools || {{yes}} || Unified Transform tool, released in 2.9.2 +|- +|Canvas rotation and flipping|| {{yes}} || Released in 2.9.2 +|- +|MyPaint Brush tool || {{yes}} || Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +|Support the XDG Base Directory Specification || {{yes}} || Released in 2.9.2 +|- +|Symmetry painting|| {{yes}} || Released in 2.9.4 +|- +|Layer modes rewrite || {{yes}} || We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +|Better support for image metadata || {{yes}} || Released in 2.9.6 +|- +|Support layer masks on layer groups || {{yes}} || Released in 2.10 +|- +|Cleanup libgimp || {{yes}} || we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +|UI themes || {{yes}} || Released in 2.9.6 +|- +|Icon themes || {{yes}} || Released in 2.9.6 +|- +|Icon size minimal support || {{yes}} || Released in 2.9.6 +|- +|Color management fixes and improvements || {{wip}} || Changes released in 2.10.x, more comeing in 3.x +|} + +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + +=== GIMP 3.0 === + +The focus of this version is to complete the GTK+3 port. + +Benefits: + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|Port to GTK3 || {{wip}} || git branch "master", GtkAction→GAction port is the big last thing +|- +|Redesign wire protocol for scripts/plug-ins || {{wip}} || GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +|Wayland support fixes || {{wip}} || git branch "master" +|- +|Space invasion || {{wip}} || various color management improvemnts +|- +|Multi-layer selection || {{wip}} || Most tools are multi-layer selection aware but only work on the first selected layer +|- +|Extensions management || {{wip}} || +|} + +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + +=== GIMP 3.2 === + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|Filter/Adjustment layers || {{no}} || Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +|Layer effects || {{no}} || bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +== Future == + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|Fix compositing part of blending modes || {{yes}} || +|- +|Improve animation features || {{wip}} || Animation plug-in is dropped, this is being rewritten as a core feature +|- +|Seamless Clone tool || {{wip}} || Released as experimental in 2.9.2, needs work +|- +|Automatic layer boundary management || {{wip}} || [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +|Auto-anchoring of floating selection || {{no}} || +|- +|Script recording and playback || {{no}} || [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +|Optionally save undo history in the XCF || {{no}} || [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +|Smart objects || {{no}} || [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +|Brushpack support || {{no}} || +|- +|Support SwatchBooker file format for palettes and gradients || {{no}} || +|- +|High-end CMYK support || {{wip}} || WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +|Support for RGB working spaces other than sRGB || {{wip}} || currently being worked on in babl +|- +|Support for gamma encodings other than the sRGB TRC || {{yes}} || +|- +|Better text handling || {{no}} || See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +|Shape tool || {{no}} || Easily create circles, rectangles, N-side polygons, stars etc. +|- +|Vector layers || {{no}} || Back-end exists, there is no front-end. +|- +|Simplified add-ons management || {{wip}} || easily install/deinstall plug-ins, filters, scripts etc. +|} + +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + +== Further Reading == + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20201125141741-show.txt b/wiki/Roadmap-20201125141741-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20201125141741-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210116183042-show.txt b/wiki/Roadmap-20210116183042-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210116183042-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210206025111-show.txt b/wiki/Roadmap-20210206025111-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210206025111-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210307135321-show.txt b/wiki/Roadmap-20210307135321-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210307135321-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210416201952-show.txt b/wiki/Roadmap-20210416201952-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210416201952-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210416232827-show.txt b/wiki/Roadmap-20210416232827-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210416232827-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210506225301-show.txt b/wiki/Roadmap-20210506225301-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210506225301-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210521221259-show.txt b/wiki/Roadmap-20210521221259-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210521221259-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210608113336-edit.txt b/wiki/Roadmap-20210608113336-edit.txt new file mode 100644 index 0000000..413f24c --- /dev/null +++ b/wiki/Roadmap-20210608113336-edit.txt @@ -0,0 +1,162 @@ +== Feature Prioritization == + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + +== Roadmap == + +'''Legend''' + +Status Column: +{| +! scope="col" width="50px" | +|- +| {{no|}} || work hasn't started yet +|- +| {{wip| }} || work in progress +|- +| {{yes| }} || implementation finished +|} + +=== GIMP 2.10.x === + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|High bit depths || {{yes}} || Released in 2.9.2 +|- +|Preview filters on canvas || {{yes}} || Released in 2.9.2, [[Hacking:Porting filters to GEGL | porting status]] +|- +|OpenCL support || {{yes}} || Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting filters to GEGL |Porting Matrix]]) +|- +|Turn the IWarp plug-in into an on-canvas tool || {{yes}} || Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +|Merge basic transformation tools || {{yes}} || Unified Transform tool, released in 2.9.2 +|- +|Canvas rotation and flipping|| {{yes}} || Released in 2.9.2 +|- +|MyPaint Brush tool || {{yes}} || Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +|Support the XDG Base Directory Specification || {{yes}} || Released in 2.9.2 +|- +|Symmetry painting|| {{yes}} || Released in 2.9.4 +|- +|Layer modes rewrite || {{yes}} || We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +|Better support for image metadata || {{yes}} || Released in 2.9.6 +|- +|Support layer masks on layer groups || {{yes}} || Released in 2.10 +|- +|Cleanup libgimp || {{yes}} || we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +|UI themes || {{yes}} || Released in 2.9.6 +|- +|Icon themes || {{yes}} || Released in 2.9.6 +|- +|Icon size minimal support || {{yes}} || Released in 2.9.6 +|- +|Color management fixes and improvements || {{wip}} || Changes released in 2.10.x, more comeing in 3.x +|} + +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + +=== GIMP 3.0 === + +The focus of this version is to complete the GTK+3 port. + +Benefits: + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|Port to GTK3 || {{wip}} || git branch "master", GtkAction→GAction port is the big last thing +|- +|Redesign wire protocol for scripts/plug-ins || {{wip}} || GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +|Wayland support fixes || {{wip}} || git branch "master" +|- +|Space invasion || {{wip}} || various color management improvemnts +|- +|Multi-layer selection || {{wip}} || Most tools are multi-layer selection aware but only work on the first selected layer +|- +|Extensions management || {{wip}} || +|} + +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + +=== GIMP 3.2 === + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|Filter/Adjustment layers || {{no}} || Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +|Layer effects || {{no}} || bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +== Future == + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + +{| class="wikitable sortable" style="text-align: left;" +!'''Feature''' || '''Status''' || '''Comments''' +|- +|Fix compositing part of blending modes || {{yes}} || +|- +|Improve animation features || {{wip}} || Animation plug-in is dropped, this is being rewritten as a core feature +|- +|Seamless Clone tool || {{wip}} || Released as experimental in 2.9.2, needs work +|- +|Automatic layer boundary management || {{wip}} || [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +|Auto-anchoring of floating selection || {{no}} || +|- +|Script recording and playback || {{no}} || [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +|Optionally save undo history in the XCF || {{no}} || [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +|Smart objects || {{no}} || [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +|Brushpack support || {{no}} || +|- +|Support SwatchBooker file format for palettes and gradients || {{no}} || +|- +|High-end CMYK support || {{wip}} || WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +|Support for RGB working spaces other than sRGB || {{wip}} || currently being worked on in babl +|- +|Support for gamma encodings other than the sRGB TRC || {{yes}} || +|- +|Better text handling || {{no}} || See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +|Shape tool || {{no}} || Easily create circles, rectangles, N-side polygons, stars etc. +|- +|Vector layers || {{no}} || Back-end exists, there is no front-end. +|- +|Simplified add-ons management || {{wip}} || easily install/deinstall plug-ins, filters, scripts etc. +|} + +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + +== Further Reading == + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210625164241-show.txt b/wiki/Roadmap-20210625164241-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210625164241-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210629023028-show.txt b/wiki/Roadmap-20210629023028-show.txt new file mode 100644 index 0000000..1041e54 --- /dev/null +++ b/wiki/Roadmap-20210629023028-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists, there is no front-end. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210813164343-show.txt b/wiki/Roadmap-20210813164343-show.txt new file mode 100644 index 0000000..47b3d29 --- /dev/null +++ b/wiki/Roadmap-20210813164343-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20210819095302-show.txt b/wiki/Roadmap-20210819095302-show.txt new file mode 100644 index 0000000..47b3d29 --- /dev/null +++ b/wiki/Roadmap-20210819095302-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20211122214656-show.txt b/wiki/Roadmap-20211122214656-show.txt new file mode 100644 index 0000000..47b3d29 --- /dev/null +++ b/wiki/Roadmap-20211122214656-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20220130162134-show.txt b/wiki/Roadmap-20220130162134-show.txt new file mode 100644 index 0000000..47b3d29 --- /dev/null +++ b/wiki/Roadmap-20220130162134-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20220202230045-show.txt b/wiki/Roadmap-20220202230045-show.txt new file mode 100644 index 0000000..47b3d29 --- /dev/null +++ b/wiki/Roadmap-20220202230045-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20220213173854-show.txt b/wiki/Roadmap-20220213173854-show.txt new file mode 100644 index 0000000..bc70a52 --- /dev/null +++ b/wiki/Roadmap-20220213173854-show.txt @@ -0,0 +1,176 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [https://www.wiki.gimp.org/wiki/Release:2.10_changelog Release:2.10 changelog]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [https://www.wiki.gimp.org/wiki/Hacking:Porting_filters_to_GEGL porting status] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [https://www.wiki.gimp.org/wiki/Hacking:Porting_filters_to_GEGL Porting Matrix]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Improve animation features | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Script recording and playback | No | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], needs complete GEGL port first +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Smart objects | No | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453], needs complete GEGL port first +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [https://www.wiki.gimp.org/wiki/Hacking:TODO Hacking:TODO] diff --git a/wiki/Roadmap-20220401093845-show.txt b/wiki/Roadmap-20220401093845-show.txt new file mode 100644 index 0000000..1721923 --- /dev/null +++ b/wiki/Roadmap-20220401093845-show.txt @@ -0,0 +1,182 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|- +| Paint Select tool | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|- +| Core animation | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Better window management | No | Rather than a SWM vs MWM, both able to do some things the other can't, we should have a single window mode which can do everything +|- +| Script recording and playback | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], this has somewhere started through the 3.0 API rewrite in 3.0 which will make macro support a stroll in the park +|- +| Smart objects | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453] +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Particle selection tool | No | See [https://gitlab.gnome.org/GNOME/gimp/-/issues/2912#note_431542 comment on issue 2912] The Foreground selection interaction should be reworked as a tool to select particles or object borders, +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Roadmap-20220418122258-show.txt b/wiki/Roadmap-20220418122258-show.txt new file mode 100644 index 0000000..1721923 --- /dev/null +++ b/wiki/Roadmap-20220418122258-show.txt @@ -0,0 +1,182 @@ + + +__TOC__ + +==Feature Prioritization== + +This is roughly how the core GIMP development team prioritizes feature development. Note that this does not mean we are not interested in contributions in other areas, or contributions of low prio features. Contributions of any kind are always welcomed. But at the end of the day, it is better to have one feature 100% complete than two features 50% complete, which is why features should be prioritized and then worked on in order. + +Starting with GIMP 2.10, features will be developed in isolation on feature branches and be merged to the main branch when they are ready. + +The list below shows when coming features are expected to be ready, but that might change. + + +==Roadmap== + +'''Legend''' +__Status Column:__ + +{| class="wikitable" +|- +! +|- +| | work hasn't started yet +|- +| | work in progress +|- +| | implementation finished +|} + +===GIMP 2.10.x=== + +The 2.10.x series coexists with the ongoing work to port GIMP to GTK+3 and cleanup/obsolete API. + +We try to backport fixes and new features to 2.10.x from the master branch when we can. + +More or less complete list of changes: [[Release:2.10 changelog]]. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| High bit depths | Yes | Released in 2.9.2 +|- +| Preview filters on canvas | Yes | Released in 2.9.2, [[Hacking:Porting_filters_to_GEGL| porting status]] +|- +| OpenCL support | Yes | Released in 2.9.2, more plugins need OpenCL version, see also the [[Hacking:Porting_filters_to_GEGL|Porting Matrix]]) +|- +| Turn the IWarp plug-in into an on-canvas tool | Yes | Initial version released in 2.9.2. Improved version to be released in 2.9.6. +|- +| Merge basic transformation tools | Yes | Unified Transform tool, released in 2.9.2 +|- +| Canvas rotation and flipping| Yes | Released in 2.9.2 +|- +| MyPaint Brush tool | Yes | Released as stable in 2.9.4. No dynamic support though ([https://gitlab.gnome.org/GNOME/gimp/issues/935 bug 768772]) +|- +| Support the XDG Base Directory Specification | Yes | Released in 2.9.2 +|- +| Symmetry painting| Yes | Released in 2.9.4 +|- +| Layer modes rewrite | Yes | We need to support both legacy, gamma-corrected, and linear modes, sensible UI is missing +|- +| Better support for image metadata | Yes | Released in 2.9.6 +|- +| Support layer masks on layer groups | Yes | Released in 2.10 +|- +| Cleanup libgimp | Yes | we need to go through the API with a fine comb and check to deprecate all functions which are not suitable for 3.0. +|- +| UI themes | Yes | Released in 2.9.6 +|- +| Icon themes | Yes | Released in 2.9.6 +|- +| Icon size minimal support | Yes | Released in 2.9.6 +|- +| Color management fixes and improvements | work in progress | Changes released in 2.10.x, more comeing in 3.x +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=2.10 Full list of open bugs with milestone 2.10]. + + +===GIMP 3.0=== + +The focus of this version is to complete the GTK+3 port. + +Benefits: + + +* Better maintained version of GTK+ +* Better Wacom support +* Better handling of HiDPI displays +* Wayland support on Linux +* Refactored code, easier to build new features upon + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Port to GTK3 | work in progress | git branch "master", GtkAction→GAction port is the big last thing +|- +| Redesign wire protocol for scripts/plug-ins | work in progress | GObject Intrpospection is being introduced into 3.0, along with refactoring for plug-ins, without wire protocol redesign though +|- +| Wayland support fixes | work in progress | git branch "master" +|- +| Space invasion | work in progress | various color management improvemnts +|- +| Multi-layer selection | work in progress | Most tools are multi-layer selection aware but only work on the first selected layer +|- +| Extensions management | work in progress | +|- +| Paint Select tool | work in progress | +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=3.0 List of open bugs with milestone 3.0] + + +===GIMP 3.2=== + +The focus of this release is going to be on non-destructive editing. Note that both adjustment layers and layer effects/styles are the terminologies currently used in requests by users. We haven't yet assessed, how exactly non-destructive editing is going to be implemented. + +More features e.g. from the 'Future' section can sneak in, but that will depend on the availability of developers. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Filter/Adjustment layers | No | Needs complete GEGL port first, API for stacking GEGL ops on a layer will be available in 2.10 +|- +| Layer effects | No | bevel/emboss, drop shadow etc., needs complete GEGL port first +|- +| Core animation | work in progress | Animation plug-in is dropped, this is being rewritten as a core feature +|- +| Better window management | No | Rather than a SWM vs MWM, both able to do some things the other can't, we should have a single window mode which can do everything +|- +| Script recording and playback | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/8 Bug #8], this has somewhere started through the 3.0 API rewrite in 3.0 which will make macro support a stroll in the park +|- +| Smart objects | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/453 Bug #453] +|} + +==Future== + +Many of these features can be implemented in a branch and merged into the main development branch as we go, especially since we aim to loosen up the "no new features in stable releases" policy. Please talk to us, if you want to work on any of those. + + +{| class="wikitable" +|- +! '''Feature''' ! '''Status''' ! '''Comments''' +|- +| Fix compositing part of blending modes | Yes | +|- +| Seamless Clone tool | work in progress | Released as experimental in 2.9.2, needs work +|- +| Particle selection tool | No | See [https://gitlab.gnome.org/GNOME/gimp/-/issues/2912#note_431542 comment on issue 2912] The Foreground selection interaction should be reworked as a tool to select particles or object borders, +|- +| Automatic layer boundary management | work in progress | [https://gitlab.gnome.org/GNOME/gimp/issues/32 Bug #32] +|- +| Auto-anchoring of floating selection | No | +|- +| Optionally save undo history in the XCF | No | [https://gitlab.gnome.org/GNOME/gimp/issues/89 Bug #89] +|- +| Brushpack support | No | +|- +| Support SwatchBooker file format for palettes and gradients | No | +|- +| High-end CMYK support | work in progress | WIP in babl and GEGL. Also see [http://www.gimp.org/docs/userfaq.html#i-do-a-lot-of-desktop-publishing-related-work-will-you-ever-support-cmyk FAQ] for details +|- +| Support for RGB working spaces other than sRGB | work in progress | currently being worked on in babl +|- +| Support for gamma encodings other than the sRGB TRC | Yes | +|- +| Better text handling | No | See [http://gui.gimp.org/index.php/Text-Handling_in_GIMP Improvements in the text handling], [https://gitlab.gnome.org/GNOME/gimp/issues/35 Bug #35] +|- +| Shape tool | No | Easily create circles, rectangles, N-side polygons, stars etc. +|- +| Vector layers | No | Back-end exists since 2006, UI is missing. +|- +| Simplified add-ons management | work in progress | easily install/deinstall plug-ins, filters, scripts etc. +|} +[https://gitlab.gnome.org/GNOME/gimp/issues?milestone_title=Future List of open bugs with milestone 'Future'] + + +==Further Reading== + +TODO list: [[Hacking:TODO]] diff --git a/wiki/Screenshots_of_the_development_version-20161024013249-edit.txt b/wiki/Screenshots_of_the_development_version-20161024013249-edit.txt new file mode 100644 index 0000000..63ec32f --- /dev/null +++ b/wiki/Screenshots_of_the_development_version-20161024013249-edit.txt @@ -0,0 +1,15 @@ +[[File:gimp-2.9.1-screenshot.png|320px|GIMP 2.9.1 with Warp Transform Tool]] + +This screenshot shows GIMP 2.9.1 with the Warp Transform Tool (as of January 2014). + + +=Archive= + +[[File:gimp-print.png|320px|Print plug-in]] + +The Print plug-in has been further improved for GIMP 2.5. + + +[[File:gimp-curves.png|320px|Changes to the Curves dialog for GIMP 2.6]] + +This screenshot illustrates changes to the Curves dialog for GIMP 2.6. diff --git a/wiki/Screenshots_of_the_development_version-20161109163724-show.txt b/wiki/Screenshots_of_the_development_version-20161109163724-show.txt new file mode 100644 index 0000000..898b0cb --- /dev/null +++ b/wiki/Screenshots_of_the_development_version-20161109163724-show.txt @@ -0,0 +1,22 @@ + +[[File:Gimp-2.9.1-screenshot.png|GIMP 2.9.1 with Warp Transform Tool]] + +This screenshot shows GIMP 2.9.1 with the Warp Transform Tool (as of January 2014). + + + + + +=Archive= + +[[File:Gimp-print.png|Print plug-in]] + +The Print plug-in has been further improved for GIMP 2.5. + + + +[[File:Gimp-curves.png|Changes to the Curves dialog for GIMP 2.6]] + +This screenshot illustrates changes to the Curves dialog for GIMP 2.6. + + \ No newline at end of file diff --git a/wiki/Screenshots_of_the_development_version-20180812150614-show.txt b/wiki/Screenshots_of_the_development_version-20180812150614-show.txt new file mode 100644 index 0000000..465110d --- /dev/null +++ b/wiki/Screenshots_of_the_development_version-20180812150614-show.txt @@ -0,0 +1,22 @@ + +[[File:Gimp-2.9.1-screenshot.png|GIMP 2.9.1 with Warp Transform Tool]] + +This screenshot shows GIMP 2.9.1 with the Warp Transform Tool (as of January 2014). + + + + + +=Archive= + +[[File:Gimp-print.png|Print plug-in]] + +The Print plug-in has been further improved for GIMP 2.5. + + + +[[File:Gimp-curves.png|Changes to the Curves dialog for GIMP 2.6]] + +This screenshot illustrates changes to the Curves dialog for GIMP 2.6. + + \ No newline at end of file diff --git a/wiki/Screenshots_of_the_development_version-20201001204335-edit.txt b/wiki/Screenshots_of_the_development_version-20201001204335-edit.txt new file mode 100644 index 0000000..63ec32f --- /dev/null +++ b/wiki/Screenshots_of_the_development_version-20201001204335-edit.txt @@ -0,0 +1,15 @@ +[[File:gimp-2.9.1-screenshot.png|320px|GIMP 2.9.1 with Warp Transform Tool]] + +This screenshot shows GIMP 2.9.1 with the Warp Transform Tool (as of January 2014). + + +=Archive= + +[[File:gimp-print.png|320px|Print plug-in]] + +The Print plug-in has been further improved for GIMP 2.5. + + +[[File:gimp-curves.png|320px|Changes to the Curves dialog for GIMP 2.6]] + +This screenshot illustrates changes to the Curves dialog for GIMP 2.6. diff --git a/wiki/Specs:Action_Search_Dialog-20160630074109-edit.txt b/wiki/Specs:Action_Search_Dialog-20160630074109-edit.txt new file mode 100644 index 0000000..97ade03 --- /dev/null +++ b/wiki/Specs:Action_Search_Dialog-20160630074109-edit.txt @@ -0,0 +1,210 @@ +== Text-based Intent driven Tool (TITo) == + +This is a first draft of specifications for an Action Search dialog box. The feature has been originally [https://bugzilla.gnome.org/show_bug.cgi?id=708174 contributed by Srihari] and improved from there. The current code is available in the branch "tito" on the GNOME git repository of GIMP. + +Unless bugs are found, the following specifications is implemented in this branch. + +Author of the Specs: Jehan +Testing, feedback, comments and suggestions: Alexandre Prokoudine and Téo Mazars (did I forget anyone?). + +=== Background === + +GIMP provides a huge list of individual commands (''actions'' in GTK+ terminology): generic actions (open/close/save an image...), pixel processing (GEGL operations), plugins, etc. +Currently you can run any of these actions either through scripts, shortcuts or the UI if a widget has been created to run it (usually a menu item). + +Advanced users want to work fast. Searching through menus can be painfully slow in many cases, in particular when you need to do it very often (users who use a lot of filters). Creating shortcuts is usually a good solution, but only for a limited set of actions, the ones you really use the most often, if not all the time. Indeed shortcuts are limited by the number of possibility in key associations, but also because you may forget the shortcuts if you don't use them often enough. By default, GIMP is provided with hundreds of actions, and you can create an infinity (some very spread plugins, the ones providing many additional filters in particular, would add dozens of them). + +On the other hand, if you may forget an association of meaningless keys, you won't usually forget natural language keywords, like parts of the name of the filter, the type of the filter, what it does, etc. This feature is proposing to be able to search any action at any time by such keywords. + +=== Overview === + +The "tito" feature would be named more generically: "Action Search". + +The correspondent action is named "dialogs-action-search". It would pop-up a dialog box, displaying a simple text entry widget where a user can type +keywords, thus automatically updating a list of proposed actions. The proposed actions can be browsed and activated either by mouse or keyboard. + +==== Similar Feature in other Software ==== + +Blender has a similar feature called the "[http://wiki.blender.org/index.php/Doc:2.6/Manual/Interface/Menus space-menu]" (its shortcut being "Space"). It can be run from everywhere through Blender's UI +and would provide a list of all available commands. + +This is a very practical feature in Blender. + +=== User Interaction === + +==== Activating ==== + +; Shortcut +: The default shortcut would be '/', common shortcut for quick-search in many software (text editors, web browsers, etc.), and not assigned yet in GIMP. '/' is a 1-letter shortcut which makes it indeed a very nice default for a "quick" search. +: '''Note''': 'ctrl-f' was also considered (being also a very common shortcut for a "search" feature in most software) but it was already used for "plug-in-repeat" (Repeat Last Filter). + +; Menu +: The "action-search" is also available as a menu item in "Help" > "Search and Run a Command". + +==== Quitting ==== + +The action-search dialog can be closed either by hitting ''Esc'', or by closing the dialog with any usual way provided by the user's windows +manager (usually hitting a window cross on top-right, with common ''Alt-F4'' shortcut, or any alternative which depends on the desktop and +is not controlled by GIMP). + +The dialog can be called back up again at any time by the previous methods (shortcut, menu...). + +==== Proposed Action List ==== + +===== List Content ===== + +* The proposed action list order is relevant. The top item is computed as being the most relevant action to the search, the second slightly less, and so on, until the last, which is still considered relevant, but less than all the others. See the section `Action Search Algorithm` for details on how relevance is computed. + +* By default, the proposed action list shows only the actions available in the current context (the actions which can actually be run at this time). For instance if no file is currently opened, the "view-close" action won't appear in the list of actions because there are no views to close. Nevertheless you can set up the action-search to also display the unavailable actions (see the "Preferences" section). But even by doing so, the unavailable actions will be listed, but will be grayed and not selectable. + +===== Single Action Item ===== + +Here is a list of values relevant to an action: + +* Action Name: the action name is the actual GTK+ naming, usually derived from the English language, though it should not be considered as "Natural Language", but as "Machine Language". This information is '''not''' displayed in the list. + +* Action Label: each action in the proposed action list shows a human-language label (localized to user's chosen locale). This information is the minimum available for '''all''' actions. + +For instance, the '''label''' for the action named ''view-close'' is: "Close View". +This label will likely be different if GIMP is localized in another language. + +* Action Stock Icon: if an action has an associated stock icon, it will be displayed in small version to the left of the label. +As a special exception, a toggle action (for instance "windows-use-single-window-mode") would display a OK/NO icon to characterize its current state. + +* Action Shortcut/Accelerator: if the action has a shortcut assigned, it is displayed to the right of the label, in a smaller font size, after a pipe sign. This allows a user to assimilate and learn shortcuts of actions commonly run. + +* Action Description/Tooltip: if the action has a longer description, it is displayed below the Action Name, in a smaller and lighter font style. + +'''Example''': our action ''view-close'' will display like this in the proposed action list: + + X Close View | Ctrl + W + Close the active image view + +===== Update ===== + +* The proposed action list would appear as soon as you type a sign in the text entry. It is automatically updated at each change of the entered text. +When the proposed action list is updated, the top item of the list (judged the most relevant, see below) is selected by default, making it easy to immediately run it with ''Enter''. + +* The proposed action list disappears when the text entry gets empty again (by hitting backspace repetively, or selection/delete, or any other mean). +When the proposed action list disappears, any previous selection is unselected, avoiding accidental and unintuitive action run when pressing Enter on an empty keyword. + +===== Keyboard Navigation ===== + +* When the text entry is empty, typing the "down arrow" would force-show the full list of all actions (this full list is different whether or not you set up to show unavailable actions) and focus and select the first item. The top items in the list are all the actions in history, sorted by most used first. + +* When the text entry has the focus, hitting the down arrow would focus and select the top proposition (most relevant one). When a proposition is highlighted, hitting the down arrow again, would highlight the next one, and so on, until the last proposition is highlighted, at which point hitting the down arrow again won't do anything. +'''Alternative Proposition''': since when the text entry has focus, the top proposition is already selected by default, it has been proposed by Téo Mazars that hitting the down key would select directly the second-to-the-top proposition. This may indeed be a better idea. Thoughts? + +* When the first action is highlighted, hitting the up arrow gives focus back to the text entry. + +* When an action is highlighted, other than the first one, hitting the up arrow highlights the immediately upper action. + +* When an action is highlighted, hitting Enter would run this action and close the action-search dialog. + +* When no action is highlighted, hitting Enter would do nothing. + +* At any time, hitting Esc would close the action-search dialog without any action being run. + +* Hitting any other key would give focus back to the text entry, with the pointer and text selection being the exact same as they were before the text entry lost focus. This means that you can always easily update your keywords without having to repetitively use the arrow keys, or the mouse. + +===== Mouse Navigation ===== + +* The proposed action list will show a scroll bar if the dialog is not big enough to show the whole list of proposed actions on screen. You can scroll through the whole list with your mouse with the usual usage of scroll bar interface. + +* Clicking an action in the list would select this action. + +* Double-clicking an action in the list would run this action and close the action-search dialog. + +=== Action History === + +The feature comes alongside a separate feature: action calls are logged. Only the relative frequency they have been run +is memorized. They are logged however the action is run, whether through menu, shortcut, script or action-search itself. + +Moreover only a limited number of actions are memorized. This default of "action history length" is 100 actions. +A value of 100 means that the 100 most used actions will be kept in memory (and not the last 100 run actions). + +Some actions are not logged: + +* "dialogs-action-search" itself to avoid circular calling; +* any action "*-menu" because they are run each time you open a menu, which is very informative; +* any action "*-popup"; +* any action "context-*" because they happen too often in normal usage (select a tool, etc.); +* "plug-in-repeat", "plug-in-reshow" and any action "plug-in-recent-*" because they are only redirection of actual actions. + +NOTE: the number associated to an action does not necessarily correspond to the number of time. I call it a "relative frequency". The algorithm is the following: + +* When an action is called, if it was not previously logged, its frequency is 1 and is listed at the top of the 1-actions. +* When an action is called, if it was already logged and if other actions are associated to the same frequency number, this action's frequency is incremented by 1 and at the top of the actions with the same new frequency. +* When an action is called, it it was already logged and if no other actions are associated to the same frequency number, but there is at least one action with the next frequency number, then this action's frequency is incremented by 1 and at the top of the actions with the same new frequency; and the last of the actions with the next frequency has its number decremented by 1. +* In any other cases, nothing is changed. + +This allows to always have actions with frequency 1, thus we would never end up in a blocking case where the history is full but there are no 1-actions (thus a new action could not be entered). It also prevents highly used actions from ending up with huge frequency and rendering results inadequate, since there would never be a number gap in the frequency list. + +=== Generic Dialog Widget === + +'''Note''': the dialog box has been quite modified from the original proposition, but it had several interesting concepts, like the proposition list automatically updated while typing (similarly to a web browser URL bar). So Mitch proposed that the finale version could be made a generic GIMP widget, which may be reused for other purpose in the future (other search tools?). +Below are additional features of this dialog widget. + +==== Position and Dimensions ==== + +If you often use the search-action dialog, you will likely appreciate not having to displace and resize it each time on the screen (for +instance if you want to see your image, or any other reason). +For this reason, the dialog remembers where it was positioned last, as well as the width of the text entry, and the height of the proposed action list. +This uses GIMP session management. + +==== Opacity ==== + +The search dialog may be used over other windows, that we may still want to see. Thus the dialog displays an opacity button (icon GIMP_STOCK_TRANSPARENCY), which shows/hide an opacity spin scale. The chosen opacity is also remembered from one run to another. + +'''Counter-Proposition''': the possibility to make the dialog transparent was in the original contribution by Srihari (it was set through a separate settings window, now removed). The developer who took over the integration (Jehan) thought the idea appealing, so made the current evolved Opacity button/spin UI, though is unsure if that is really that useful or even desirable. Téo Mazars also wonders if that would not be more interesting as a feature in other kind of dialogs, like in filter dialogs where you get a live feedback in the image window, but maybe not on this one. +Thus this opacity button/spin may be removed. Or maybe we could make them a separate widgets of their own, easy to add to other kind of dialogs. + +NOTE: the "opacity" feature has been removed from the finale version. It may reappear later as a generic widget that we may want to use on various windows. + +=== Preferences === + +The preferences propose 2 preferences in "Help System" tab, "Action Search" frame: + +* the "Maximum History Size" spin button (see "Action History" section), integer, default 100; +* the "Show Unavailable Actions" checkbox (see "Proposed Action List" section), default unchecked. + +It also proposes a button to "Clear Action History". + +=== Action Search Algorithm === + +'''Note 1''': in the following algorithm, all text (keyword, label, tooltip) is normalized prior to searching: case-insensitive, stripped of leading and trailing spaces, and all duplicated spaces crushed to 1 space, which means that searching "WoRd", "word" or " WORD " would get the same result. + +'''Note 2''': depending on the show-unavailable preference value, the meaning of "any action" differs. If show unavailable is unchecked, it actually means "''any action which is available''". + +'''Note 3''': the entry text is stripped out of any leading and trailing spaces before searching. + +(1) If the entry text has a content (a "keyword"), the algorithm shows first any action in the history, for which, in this order: + +# if and only if the entry text is exactly 2 letters, the first letter of the keyword is the first letter of the first word of the Action Label; and the second letter of the keyword is the first letter of the second word of the Action Label.
    Example: "gb" selects "Gaussian Blur". +# the searched keyword appears at the start of the Action Label;
    Example: "gauss" selects "Gaussian Blur". +# the searched keyword appears anywhere else in the Action Label;
    Example: "lur" selects "Gaussian Blur" +# if and only if the entry text is more than 2 letters, the search keyword appears anywhere in the Action Description.
    Example: "averag" displays "Gaussian Blur" (because its tooltip is: "Performs an averaging of neighboring pixels with the normal distribution as weighting"). +# if and only if the entry text is composed of several words (defined by separating spaces), each of the word appears somewhere in the label or description, whatever their order of occurrence.
    Example: "blur gaussian" selects "Gaussian Blur" even though the order of the words is reversed. + +Note: when several results from the history are in the same "section", their memorized number of calls is further used to weight the upper action. For instance the search "blur" would select both "Gaussian Blur", "Selective Gaussian Blur" and "Tileable Blur..." in the same section "the searched keyword appears anywhere else in the Action Name". Nevertheless if the history recorded that "Selective Gaussian Blur" had been run 20 times whereas "Tileable Blur" had been run only 10 times and "Gaussian Blur" 5 times, then "Selective Gaussian Blur" would be on top, followed by "Tileable Blur", and finally "Gaussian Blur". +Additionally if 2 actions have the exact same number of calls, the last one called is considered more relevant. + +(2) If the entry text has a content (a "keyword"), after any action from (1) has been shown, the algorithm shows any action *not* in the history, for which, in this order: + +# if and only if the entry text is exactly 2 letters, the first letter of the keyword is the first letter of the first word of the Action Name; and the second letter of the keyword is the first letter of the second word of the Action Label. +# the search keyword appears at the start of the Action Label; +# the searched keyword appears anywhere else in the Action Label; +# if and only if the entry text is more than 2 letters, the search keyword appears anywhere in the Action Description; +# if and only if the entry text is composed of several words (defined by separating spaces), each of the word appears somewhere in the label or description, whatever their order of occurrence. + +(3) If the entry text has a content (a "keyword"), after any action from (1) and (2) has been shown, the algorithm shows any action (in +history or not), for which: + +# individual letters in the search keywords appear in the same order, but with optional intermediate letters, in the Action Name. + +This is called fuzzy search. It allows powerful research when you search some action whose name is well known. +For instance if you were to convert your image to 16 bit floating point (gamma), you could search '1bfpg + Enter' which would return only this response, because you know exactly what you search, and is a much faster process. +Or searching "cdrgb" would return "Convert to Default RGB" as only response. + +But it may also display totally irrelevant responses on common searches. This is why its result are always at the end of the list. +For instance, when you are searching for color balance actions, you may begin to type "bala", and you certainly don't want to get "Set Brush Size to Default Value" being considered more relevant than "White Balance" or "Color Balance" actions. diff --git a/wiki/Specs:Action_Search_Dialog-20160630075555-show.txt b/wiki/Specs:Action_Search_Dialog-20160630075555-show.txt new file mode 100644 index 0000000..7e80708 --- /dev/null +++ b/wiki/Specs:Action_Search_Dialog-20160630075555-show.txt @@ -0,0 +1,247 @@ + + +__TOC__ + +==Text-based Intent driven Tool (TITo)== + +This is a first draft of specifications for an Action Search dialog box. The feature has been originally [https://bugzilla.gnome.org/show_bug.cgi?id=708174 contributed by Srihari] and improved from there. The current code is available in the branch "tito" on the GNOME git repository of GIMP. + +Unless bugs are found, the following specifications is implemented in this branch. + +Author of the Specs: Jehan +Testing, feedback, comments and suggestions: Alexandre Prokoudine and Téo Mazars (did I forget anyone?). + + +===Background=== + +GIMP provides a huge list of individual commands (''actions'' in GTK+ terminology): generic actions (open/close/save an image...), pixel processing (GEGL operations), plugins, etc. +Currently you can run any of these actions either through scripts, shortcuts or the UI if a widget has been created to run it (usually a menu item). + +Advanced users want to work fast. Searching through menus can be painfully slow in many cases, in particular when you need to do it very often (users who use a lot of filters). Creating shortcuts is usually a good solution, but only for a limited set of actions, the ones you really use the most often, if not all the time. Indeed shortcuts are limited by the number of possibility in key associations, but also because you may forget the shortcuts if you don't use them often enough. By default, GIMP is provided with hundreds of actions, and you can create an infinity (some very spread plugins, the ones providing many additional filters in particular, would add dozens of them). + +On the other hand, if you may forget an association of meaningless keys, you won't usually forget natural language keywords, like parts of the name of the filter, the type of the filter, what it does, etc. This feature is proposing to be able to search any action at any time by such keywords. + + +===Overview=== + +The "tito" feature would be named more generically: "Action Search". + +The correspondent action is named "dialogs-action-search". It would pop-up a dialog box, displaying a simple text entry widget where a user can type +keywords, thus automatically updating a list of proposed actions. The proposed actions can be browsed and activated either by mouse or keyboard. + + +====Similar Feature in other Software==== + +Blender has a similar feature called the "[http://wiki.blender.org/index.php/Doc:2.6/Manual/Interface/Menus space-menu]" (its shortcut being "Space"). It can be run from everywhere through Blender's UI +and would provide a list of all available commands. + +This is a very practical feature in Blender. + + +===User Interaction=== + +====Activating==== +: The default shortcut would be '/', common shortcut for quick-search in many software (text editors, web browsers, etc.), and not assigned yet in GIMP. '/' is a 1-letter shortcut which makes it indeed a very nice default for a "quick" search. + +: '''Note''': 'ctrl-f' was also considered (being also a very common shortcut for a "search" feature in most software) but it was already used for "plug-in-repeat" (Repeat Last Filter). + + +: The "action-search" is also available as a menu item in "Help" > "Search and Run a Command". + + + +====Quitting==== + +The action-search dialog can be closed either by hitting ''Esc'', or by closing the dialog with any usual way provided by the user's windows +manager (usually hitting a window cross on top-right, with common ''Alt-F4'' shortcut, or any alternative which depends on the desktop and +is not controlled by GIMP). + +The dialog can be called back up again at any time by the previous methods (shortcut, menu...). + + +====Proposed Action List==== + +=====List Content===== + +* The proposed action list order is relevant. The top item is computed as being the most relevant action to the search, the second slightly less, and so on, until the last, which is still considered relevant, but less than all the others. See the section `Action Search Algorithm` for details on how relevance is computed. + +* By default, the proposed action list shows only the actions available in the current context (the actions which can actually be run at this time). For instance if no file is currently opened, the "view-close" action won't appear in the list of actions because there are no views to close. Nevertheless you can set up the action-search to also display the unavailable actions (see the "Preferences" section). But even by doing so, the unavailable actions will be listed, but will be grayed and not selectable. + +=====Single Action Item===== + +Here is a list of values relevant to an action: + + +* Action Name: the action name is the actual GTK+ naming, usually derived from the English language, though it should not be considered as "Natural Language", but as "Machine Language". This information is '''not''' displayed in the list. + +* Action Label: each action in the proposed action list shows a human-language label (localized to user's chosen locale). This information is the minimum available for '''all''' actions. + +For instance, the '''label''' for the action named ''view-close'' is: "Close View". +This label will likely be different if GIMP is localized in another language. + + +* Action Stock Icon: if an action has an associated stock icon, it will be displayed in small version to the left of the label. + +As a special exception, a toggle action (for instance "windows-use-single-window-mode") would display a OK/NO icon to characterize its current state. + + +* Action Shortcut/Accelerator: if the action has a shortcut assigned, it is displayed to the right of the label, in a smaller font size, after a pipe sign. This allows a user to assimilate and learn shortcuts of actions commonly run. + +* Action Description/Tooltip: if the action has a longer description, it is displayed below the Action Name, in a smaller and lighter font style. +'''Example''': our action ''view-close'' will display like this in the proposed action list: + +
    X Close View | Ctrl + W
    +  Close the active image view
    +
    + +=====Update===== + +* The proposed action list would appear as soon as you type a sign in the text entry. It is automatically updated at each change of the entered text. + +When the proposed action list is updated, the top item of the list (judged the most relevant, see below) is selected by default, making it easy to immediately run it with ''Enter''. + + +* The proposed action list disappears when the text entry gets empty again (by hitting backspace repetively, or selection/delete, or any other mean). + +When the proposed action list disappears, any previous selection is unselected, avoiding accidental and unintuitive action run when pressing Enter on an empty keyword. + + +=====Keyboard Navigation===== + +* When the text entry is empty, typing the "down arrow" would force-show the full list of all actions (this full list is different whether or not you set up to show unavailable actions) and focus and select the first item. The top items in the list are all the actions in history, sorted by most used first. + +* When the text entry has the focus, hitting the down arrow would focus and select the top proposition (most relevant one). When a proposition is highlighted, hitting the down arrow again, would highlight the next one, and so on, until the last proposition is highlighted, at which point hitting the down arrow again won't do anything. +'''Alternative Proposition''': since when the text entry has focus, the top proposition is already selected by default, it has been proposed by Téo Mazars that hitting the down key would select directly the second-to-the-top proposition. This may indeed be a better idea. Thoughts? + + +* When the first action is highlighted, hitting the up arrow gives focus back to the text entry. + +* When an action is highlighted, other than the first one, hitting the up arrow highlights the immediately upper action. + +* When an action is highlighted, hitting Enter would run this action and close the action-search dialog. + +* When no action is highlighted, hitting Enter would do nothing. + +* At any time, hitting Esc would close the action-search dialog without any action being run. + +* Hitting any other key would give focus back to the text entry, with the pointer and text selection being the exact same as they were before the text entry lost focus. This means that you can always easily update your keywords without having to repetitively use the arrow keys, or the mouse. + +=====Mouse Navigation===== + +* The proposed action list will show a scroll bar if the dialog is not big enough to show the whole list of proposed actions on screen. You can scroll through the whole list with your mouse with the usual usage of scroll bar interface. + +* Clicking an action in the list would select this action. + +* Double-clicking an action in the list would run this action and close the action-search dialog. + +===Action History=== + +The feature comes alongside a separate feature: action calls are logged. Only the relative frequency they have been run +is memorized. They are logged however the action is run, whether through menu, shortcut, script or action-search itself. + +Moreover only a limited number of actions are memorized. This default of "action history length" is 100 actions. +A value of 100 means that the 100 most used actions will be kept in memory (and not the last 100 run actions). + +Some actions are not logged: + + +* "dialogs-action-search" itself to avoid circular calling; +* any action "*-menu" because they are run each time you open a menu, which is very informative; +* any action "*-popup"; +* any action "context-*" because they happen too often in normal usage (select a tool, etc.); +* "plug-in-repeat", "plug-in-reshow" and any action "plug-in-recent-*" because they are only redirection of actual actions. + +NOTE: the number associated to an action does not necessarily correspond to the number of time. I call it a "relative frequency". The algorithm is the following: + + +* When an action is called, if it was not previously logged, its frequency is 1 and is listed at the top of the 1-actions. +* When an action is called, if it was already logged and if other actions are associated to the same frequency number, this action's frequency is incremented by 1 and at the top of the actions with the same new frequency. +* When an action is called, it it was already logged and if no other actions are associated to the same frequency number, but there is at least one action with the next frequency number, then this action's frequency is incremented by 1 and at the top of the actions with the same new frequency; and the last of the actions with the next frequency has its number decremented by 1. +* In any other cases, nothing is changed. + +This allows to always have actions with frequency 1, thus we would never end up in a blocking case where the history is full but there are no 1-actions (thus a new action could not be entered). It also prevents highly used actions from ending up with huge frequency and rendering results inadequate, since there would never be a number gap in the frequency list. + + +===Generic Dialog Widget=== + +'''Note''': the dialog box has been quite modified from the original proposition, but it had several interesting concepts, like the proposition list automatically updated while typing (similarly to a web browser URL bar). So Mitch proposed that the finale version could be made a generic GIMP widget, which may be reused for other purpose in the future (other search tools?). +Below are additional features of this dialog widget. + + +====Position and Dimensions==== + +If you often use the search-action dialog, you will likely appreciate not having to displace and resize it each time on the screen (for +instance if you want to see your image, or any other reason). +For this reason, the dialog remembers where it was positioned last, as well as the width of the text entry, and the height of the proposed action list. +This uses GIMP session management. + + +====Opacity==== + +The search dialog may be used over other windows, that we may still want to see. Thus the dialog displays an opacity button (icon GIMP_STOCK_TRANSPARENCY), which shows/hide an opacity spin scale. The chosen opacity is also remembered from one run to another. + +'''Counter-Proposition''': the possibility to make the dialog transparent was in the original contribution by Srihari (it was set through a separate settings window, now removed). The developer who took over the integration (Jehan) thought the idea appealing, so made the current evolved Opacity button/spin UI, though is unsure if that is really that useful or even desirable. Téo Mazars also wonders if that would not be more interesting as a feature in other kind of dialogs, like in filter dialogs where you get a live feedback in the image window, but maybe not on this one. +Thus this opacity button/spin may be removed. Or maybe we could make them a separate widgets of their own, easy to add to other kind of dialogs. + +NOTE: the "opacity" feature has been removed from the finale version. It may reappear later as a generic widget that we may want to use on various windows. + + +===Preferences=== + +The preferences propose 2 preferences in "Help System" tab, "Action Search" frame: + + +* the "Maximum History Size" spin button (see "Action History" section), integer, default 100; +* the "Show Unavailable Actions" checkbox (see "Proposed Action List" section), default unchecked. + +It also proposes a button to "Clear Action History". + + +===Action Search Algorithm=== + +'''Note 1''': in the following algorithm, all text (keyword, label, tooltip) is normalized prior to searching: case-insensitive, stripped of leading and trailing spaces, and all duplicated spaces crushed to 1 space, which means that searching "WoRd", "word" or " WORD " would get the same result. + +'''Note 2''': depending on the show-unavailable preference value, the meaning of "any action" differs. If show unavailable is unchecked, it actually means "''any action which is available''". + +'''Note 3''': the entry text is stripped out of any leading and trailing spaces before searching. + +(1) If the entry text has a content (a "keyword"), the algorithm shows first any action in the history, for which, in this order: + + +# if and only if the entry text is exactly 2 letters, the first letter of the keyword is the first letter of the first word of the Action Label; and the second letter of the keyword is the first letter of the second word of the Action Label. +Example: "gb" selects "Gaussian Blur". +# the searched keyword appears at the start of the Action Label; +Example: "gauss" selects "Gaussian Blur". +# the searched keyword appears anywhere else in the Action Label; +Example: "lur" selects "Gaussian Blur" +# if and only if the entry text is more than 2 letters, the search keyword appears anywhere in the Action Description. +Example: "averag" displays "Gaussian Blur" (because its tooltip is: "Performs an averaging of neighboring pixels with the normal distribution as weighting"). +# if and only if the entry text is composed of several words (defined by separating spaces), each of the word appears somewhere in the label or description, whatever their order of occurrence. +Example: "blur gaussian" selects "Gaussian Blur" even though the order of the words is reversed. + +Note: when several results from the history are in the same "section", their memorized number of calls is further used to weight the upper action. For instance the search "blur" would select both "Gaussian Blur", "Selective Gaussian Blur" and "Tileable Blur..." in the same section "the searched keyword appears anywhere else in the Action Name". Nevertheless if the history recorded that "Selective Gaussian Blur" had been run 20 times whereas "Tileable Blur" had been run only 10 times and "Gaussian Blur" 5 times, then "Selective Gaussian Blur" would be on top, followed by "Tileable Blur", and finally "Gaussian Blur". +Additionally if 2 actions have the exact same number of calls, the last one called is considered more relevant. + +(2) If the entry text has a content (a "keyword"), after any action from (1) has been shown, the algorithm shows any action *not* in the history, for which, in this order: + + +# if and only if the entry text is exactly 2 letters, the first letter of the keyword is the first letter of the first word of the Action Name; and the second letter of the keyword is the first letter of the second word of the Action Label. +# the search keyword appears at the start of the Action Label; +# the searched keyword appears anywhere else in the Action Label; +# if and only if the entry text is more than 2 letters, the search keyword appears anywhere in the Action Description; +# if and only if the entry text is composed of several words (defined by separating spaces), each of the word appears somewhere in the label or description, whatever their order of occurrence. + +(3) If the entry text has a content (a "keyword"), after any action from (1) and (2) has been shown, the algorithm shows any action (in +history or not), for which: + + +# individual letters in the search keywords appear in the same order, but with optional intermediate letters, in the Action Name. + +This is called fuzzy search. It allows powerful research when you search some action whose name is well known. +For instance if you were to convert your image to 16 bit floating point (gamma), you could search '1bfpg + Enter' which would return only this response, because you know exactly what you search, and is a much faster process. +Or searching "cdrgb" would return "Convert to Default RGB" as only response. + +But it may also display totally irrelevant responses on common searches. This is why its result are always at the end of the list. +For instance, when you are searching for color balance actions, you may begin to type "bala", and you certainly don't want to get "Set Brush Size to Default Value" being considered more relevant than "White Balance" or "Color Balance" actions. + + \ No newline at end of file diff --git a/wiki/Specs:Resource_installer-20150912233138-edit.txt b/wiki/Specs:Resource_installer-20150912233138-edit.txt new file mode 100644 index 0000000..139fa27 --- /dev/null +++ b/wiki/Specs:Resource_installer-20150912233138-edit.txt @@ -0,0 +1,21 @@ +'''Resource installer''' lets you import and install resources. It facilitates mass tagging and allows for installation of any type of resources. + +It shouldn't try to be a resource manager, only an importer. + +==Problem== +# Where the heck are the brushes/pallets/whatever I just installed!? +# How do I get this brush-pack installed!? + +==Usecase== +#User initates an import of a set of resources(HOW!) +##a zip pack with multiple types of resources +##a folder with multiple types of resources +##a single resource file possibly containing multiple resources(example: abr brushes). +#User will select resource folders for each type of resource. +#User specifies package level tags and optionally resource file level tags. +#*NOTE:Scripts and plug-ins cant be tagged. +#Resources become available in the UI +#*All affected resources need to be reloaded. +#*Plug-ins need a restart, so if plug-ins were installed warn. + +For pack and folder resource sets, user should have an option to keep the subfolder structure IMHO. diff --git a/wiki/Specs:Resource_installer-20161024002526-show.txt b/wiki/Specs:Resource_installer-20161024002526-show.txt new file mode 100644 index 0000000..6d4a661 --- /dev/null +++ b/wiki/Specs:Resource_installer-20161024002526-show.txt @@ -0,0 +1,35 @@ + +'''Resource installer''' lets you import and install resources. It facilitates mass tagging and allows for installation of any type of resources. + +It shouldn't try to be a resource manager, only an importer. + + +==Problem== + +# Where the heck are the brushes/pallets/whatever I just installed!? +# How do I get this brush-pack installed!? + +==Usecase== + +# User initates an import of a set of resources(HOW!) +## a zip pack with multiple types of resources +## a folder with multiple types of resources +## a single resource file possibly containing multiple resources(example: abr brushes). +## a zip pack with multiple types of resources +## a folder with multiple types of resources +## a single resource file possibly containing multiple resources(example: abr brushes). +# a zip pack with multiple types of resources +# a folder with multiple types of resources +# a single resource file possibly containing multiple resources(example: abr brushes). +# User will select resource folders for each type of resource. +# User specifies package level tags and optionally resource file level tags. + +* NOTE:Scripts and plug-ins cant be tagged. +# Resources become available in the UI + +* All affected resources need to be reloaded. +* Plug-ins need a restart, so if plug-ins were installed warn. + +For pack and folder resource sets, user should have an option to keep the subfolder structure IMHO. + + \ No newline at end of file diff --git a/wiki/Specs:UI_Theme-20151127111343-edit.txt b/wiki/Specs:UI_Theme-20151127111343-edit.txt new file mode 100644 index 0000000..41eb1ab --- /dev/null +++ b/wiki/Specs:UI_Theme-20151127111343-edit.txt @@ -0,0 +1,115 @@ += Introduction = + +The aim of this project is to equip GIMP with a professional, visually appealing UI theme. + += Designers, Developers = + +Volunteers welcome ;-) + += Objectives = + +Currently GIMP comes with two UI themes: 'Default' and 'Small'. + +The Default UI theme uses the systems theming. This eases visual integration into the operating systems UI, but doesn't always match. The Small UI theme is basically the same, but uses smaller icons. + +The current situation has the following drawbacks: + +* Both themes have come to ages. Some people might find them not appealing. + +* The colored theme itself competes with the image under work for the users attention. + +* Users with High-DPI-displays (such as Apple's Retina display) complain, that the UI has become to small to be recognizeable. This hampers their workflow. + +There already were some attempts to equip GIMP with other UI themes. Many of them use a dark theme or a different icon set. Jakub Steiner and Barbara Muraus designed [http://worldofgnome.org/art-libre-icons-are-ready/ Artlibre], an icon set for creative applications in GNOME. +The artist jEsuSdA 8) and Jehan Pagès [http://www.pasteall.org/pic/show.php?id=60269 continued the idea], added missing icons and fixed bugs. [http://android272.deviantart.com/art/GIMP-Icon-Theme-Flat-375010811 Another icon theme] by Andrew Pullins can be found at DeviantArt. Partha Bagchis [http://partha.com/ build for OS X] comes with a dark Clearlooks derivative. + +Beside GIMP there are many other custom made UI themes and icon themes for GNOME. Perhaps choosing and modifying an existing solution to our needs could ease our work. + +== Brainstorm == + +To address users different needs and preferences we could consider offering variants of the same theme: dark (black or anthrazite-coloured), silver grey, light (white or light gray) + +== Primary == + +This project is a subgoal to achieve the [http://gui.gimp.org/index.php/GIMP_UI_Redesign#product_vision product vision]. This means: + +P1. Target users are artists, who work with GIMP all day for hours. + +P2. The theme supports artists in getting their work done quickly. + +P3. The theme is unobtrusive and not distracting. + +P4. The theme preserves the images appearance (e.g. neutral colors) to create high-end art. + + +P5. The theme is suitable for modern displays, i.e. HiDPI displays (Retina display etc.). + +P6. The theme is easily maintainable. + +== Secondary == + +S1. The theme is visually appealing. + +S2. The theme is timeless. + +S3. Due to restrictions of the current theme engines (i.e. the WIMP engine on Windows does not support theme modifications) a theme engine needs to run on all target platforms (at least on Windows, OS X, Linux). + +== Constraints == + +C1. It's no aim to supersede the current GIMP themes 'Default' and 'Small'. They shall reside as 'System' themes to make the GIMP UI matching to the systems appearance, if the user wishes so. + += Planning, Current State = + +Proposed steps: + +# Clarify objectives and requirements - done +# Brainstorming, collect relevant art, coarse design (=current step) +# Evaluate results +# Decide for reusing an existing solution, modifying an existing solution or doing all the work ourselves +# Implement and test +# Merge into GIMP master +# Add and merge documentation + += Relevant Art = + +''Relevant screenshots etc. for inspiration'' + += Evaluation = + +''Pro's and Con's of existing solutions'' + += Analysis, Design Drafts, Design Decisions = + += Miscellaneous = + +''Comments, ideas, unstructured notes'' + +* The focus of the work should be a supportive, useful product. We should abstain ourselves from cute, fancy ideas and challenges that are a headache for graphic designers. + +* Use transparency to keep the context in floating dialogs that overlap the canvas? + += See also = + +''Design guidelines etc.'' + +* Cooper et. al, About Face 3 - the essentials of interaction design, Wiley Publishing Inc. + +* [https://developer.gnome.org/hig-book/ GNOME human interface guidelines] + +* [https://github.com/gnome-design-team Git repository of the GNOME design team] + +* [http://developer.android.com/design/style/iconography.html Android iconography and colors] + +* [http://osxdaily.com/2012/04/20/change-photoshop-cs6-dark-interface-color-scheme-to-light/ OSXDaily article about various PS CS6 themes] + +* [http://www.graphicall.org/themes/ Blender themes] + +* [http://www.blendswap.com/category/blender-themes More Blender themes] + +* [http://www.jesusda.com/files/symbolic-gimp.7z jEsuSdA 8)'s symbolic icon theme (dark)] + +* [http://www.jesusda.com/files/symbolic-gimp_light.7z jEsuSdA 8)'s symbolic icon theme (light)] + +* [https://git.gnome.org/browse/gimp?h=theme-wip Git branch in GIMPs repository] + +* [http://www.nngroup.com/articles/icon-usability/ Aurora Bedford's article on icon usability] diff --git a/wiki/Specs:UI_Theme-20161013200315-show.txt b/wiki/Specs:UI_Theme-20161013200315-show.txt new file mode 100644 index 0000000..ff8f8c1 --- /dev/null +++ b/wiki/Specs:UI_Theme-20161013200315-show.txt @@ -0,0 +1,6 @@ + + +Thanks for visiting. +The page has moved. You find it now [http://gui.gimp.org/index.php/UI_Theme_workgroup in the GIMP GUI wiki]. + + \ No newline at end of file diff --git a/wiki/Specs:Visibility-20150709030428-show.txt b/wiki/Specs:Visibility-20150709030428-show.txt new file mode 100644 index 0000000..8883450 --- /dev/null +++ b/wiki/Specs:Visibility-20150709030428-show.txt @@ -0,0 +1,121 @@ + + +Specification for desired behaviors on toggle/untoggle Layer visibility now we have layer groups + +The behaviors described here will be implemented ins a series of scripts along gimp2.9 development cycle, and tentatively made available for gimp 2.10 + +This topic was discussed in the developers mailing list in May of 2012 (subject 'Gimp-developer] feature: Set exclusive layer visibility within groups'). +The following layer structure serves as example to clarify the proposals: + + +* - G1 +* - - L1 +* - - G2 +* - - - L2 +* - - - L3 +* - L4 +* - G3 +* - - L5 +* - - L6 + +Scenario 1: all layers and groups are visible + +Scenario 2: all layers and groups are visible, except L1 and G3 + +'''1. Current behaviour:''' + +on top level: hide the other layers/groups, discard their former visibility state; on lower levels: leave layers/groups untouched + +''Scenario 1:'' + +Shift+Click L2: hide L4, G3 -> show L4, G3 + +Shift+Click L4: hide G1, G3 -> show G1, G3 + + + +''Scenario 2:'' + +Shift+Click L2: hide L4 -> show L4, G3; Do not change L1 + +Shift+Click L4: hide L4 -> show L4, G3; Do not change L1 + +'''2. Proposal 1''' + + +# When toggling exclusive visibility, first note the full path from image root to the selected item (inclusively) and begin iterating through it. +# IF at any point along this path there are any visible sibling items, THEN hide them, leaving only the selected item visible, and break and return. +# Otherwise, if we have traversed the entire path without finding any visible siblings, then selected item is the only visible item in the whole image. (Whether the selected item is itself a layer or group is irrelevant.) Therefore, traverse the selected path again and ensure that any and all sibling items at any point along the path are made visible. + + +This would establish a toggle chain of all items -> selected group -> (subgroup, etc.) -> selected item in group -> all items. + +It could also be reversed; all items -> selected item in group -> selected group -> (parent group, etc.) -> all items, but I'm not exactly sure how that logic would pan out. +'''TODO:''' explain with the scenarios + +''Scenario 1:'' + +Shift+Click L2: + +Shift+Click L4: + + + +''Scenario 2:'' + +Shift+Click L2: + +Shift+Click L4: + +'''3. Proposal 2:''' + +Toggle visibility with respect to the former visibility state and the layer/group nesting hierarchy. + +Exclusive visibility in group-> ... in the surrounding groups -> ... in the whole layer stack-> Restore previous visibility in the whole layer stack-> ... in the surrounding groups ->... in the current group -> Exclusive visibility in group->..... + +''Scenario 1:'' + +Shift+Click L2: hide L3 -> hide L1 -> hide L4+G3 -> show L4+G3 -> show L1 -> show L3 + +Shift+Click L4: hide G1+G3 -> show G1+G3 + + + +''Scenario 2:'' + +Shift+Click L2: hide L3 -> hide L4 -> show L4 -> show L3. Leave L1 and G3 untouched. + +Shift+Click L4: hide G1 -> show G1. Leave G3 and children of G1 untouched + +'''4. Proposal 3:''' + +toggle all other layers/groups on/off with respect to their former visibility state. + +''Scenario 1:'' + +Shift+Click L2: show only L2 and hide all other layers/groups -> hide only L2 and show all other layers/groups + +Shift+Click L4: show only L4 and hide all other layers/groups -> hide only L4 and show all other layers/groups + + + +''Scenario 2:'' + +Shift+Click L2: show only L2 and hide all other layers/groups -> hide only L2+L1+G3 and show all other layers/groups + +Shift+Click L4: show only L4 and hide all other layers/groups -> hide only L4+L1+G3 and show all other layers/groups + +'''5. Proposal 4:''' + +When clicking on a layer group, cycle through four states: show layer group without affecting child layers visibility -> hide layer group without affecting child layers visibility -> hide layer group and all its children at once-> show layer group and all its children at once + +''Scenario 1:'' + +Click G1: show G1 and all its children -> hide G1 and all its children -> hide G1 and all its children -> show G1 and all its children + + + +''Scenario 2:'' + +Click G1: G1+G2+L2+L3 visible, L1 invisible -> G1 invisible, L1 invisible, G2+L2+L3 'visible' (but hidden by G1) -> G1 and all its children invisible -> G1 and all its children visible + diff --git a/wiki/Talk:Documentation:Main-20150909030525-edit.txt b/wiki/Talk:Documentation:Main-20150909030525-edit.txt new file mode 100644 index 0000000..2b110d6 --- /dev/null +++ b/wiki/Talk:Documentation:Main-20150909030525-edit.txt @@ -0,0 +1 @@ +As discussed on the list - it would be important to have the gimp-help-2 version number to follow GIMP's own version numbers - so, the named "3.0" would more like a "3.0" in "gimp-help-3" than in v.3.0 - the next version should be "2.10" to follow GIMP's. diff --git a/wiki/Talk:Documentation:Main-20161024001741-show.txt b/wiki/Talk:Documentation:Main-20161024001741-show.txt new file mode 100644 index 0000000..254acb3 --- /dev/null +++ b/wiki/Talk:Documentation:Main-20161024001741-show.txt @@ -0,0 +1,5 @@ + + +As discussed on the list - it would be important to have the gimp-help-2 version number to follow GIMP's own version numbers - so, the named "3.0" would more like a "3.0" in "gimp-help-3" than in v.3.0 - the next version should be "2.10" to follow GIMP's. + + \ No newline at end of file diff --git a/wiki/Talk:Hacking:Basic_build-20151228085159-show.txt b/wiki/Talk:Hacking:Basic_build-20151228085159-show.txt new file mode 100644 index 0000000..1dfc751 --- /dev/null +++ b/wiki/Talk:Hacking:Basic_build-20151228085159-show.txt @@ -0,0 +1,7 @@ + + +==Comments sofar== + +Nice to see you have been getting started. However, its hardly a generic howto. its more like "how I do it guide". For example, some people dont really want to deploy in home, but say in /opt because they want other users on the same machine to have access to the install. Also, it could offer a little bit of explanation in the way of basic concepts, like prefixes and such. + + \ No newline at end of file diff --git a/wiki/Talk:Hacking:Basic_build-20200919100804-edit.txt b/wiki/Talk:Hacking:Basic_build-20200919100804-edit.txt new file mode 100644 index 0000000..674116a --- /dev/null +++ b/wiki/Talk:Hacking:Basic_build-20200919100804-edit.txt @@ -0,0 +1,7 @@ +==Comments sofar== + +Nice to see you have been getting started. However, its hardly a generic howto. its more like "how I do it guide". For example, some people dont really want to deploy in home, but say in /opt because they want other users on the same machine to have access to the install. Also, it could offer a little bit of explanation in the way of basic concepts, like prefixes and such. + +== Page deletion / fusion ? == + +This page is a duplicate of [[Hacking:Building]] and [[Hacking:Building_with_Meson]]. diff --git a/wiki/Template:Hsk-20200806211743-show.txt b/wiki/Template:Hsk-20200806211743-show.txt new file mode 100644 index 0000000..4ea152d --- /dev/null +++ b/wiki/Template:Hsk-20200806211743-show.txt @@ -0,0 +1,2 @@ + +{{{1}}} diff --git a/wiki/Template:No-20141117164154-show.txt b/wiki/Template:No-20141117164154-show.txt new file mode 100644 index 0000000..c74164f --- /dev/null +++ b/wiki/Template:No-20141117164154-show.txt @@ -0,0 +1,5 @@ + + +align="center" bgcolor="Salmon" | No + + \ No newline at end of file diff --git a/wiki/Template:Wip-20141117111219-show.txt b/wiki/Template:Wip-20141117111219-show.txt new file mode 100644 index 0000000..8f33628 --- /dev/null +++ b/wiki/Template:Wip-20141117111219-show.txt @@ -0,0 +1,5 @@ + + +align="center" bgcolor="Yellow" | work in progress + + \ No newline at end of file diff --git a/wiki/Template:Yes-20141117103824-show.txt b/wiki/Template:Yes-20141117103824-show.txt new file mode 100644 index 0000000..3160c33 --- /dev/null +++ b/wiki/Template:Yes-20141117103824-show.txt @@ -0,0 +1,5 @@ + + +align="center" bgcolor="LightGreen" | Yes + + \ No newline at end of file diff --git a/wiki/User:Akkana-20200815174829-show.txt b/wiki/User:Akkana-20200815174829-show.txt new file mode 100644 index 0000000..5075997 --- /dev/null +++ b/wiki/User:Akkana-20200815174829-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Akkana|search for this page title]] in other pages, or [https://www.wiki.gimp.org/index.php?title=Special:Log&page=User:Akkana search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:AlexiaDeath-20210227153042-show.txt b/wiki/User:AlexiaDeath-20210227153042-show.txt new file mode 100644 index 0000000..3412d7c --- /dev/null +++ b/wiki/User:AlexiaDeath-20210227153042-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/AlexiaDeath|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:AlexiaDeath search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:BatO-20200920163001-show.txt b/wiki/User:BatO-20200920163001-show.txt new file mode 100644 index 0000000..c98c6ef --- /dev/null +++ b/wiki/User:BatO-20200920163001-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/BatO|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:BatO search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Bootchk-20210115205922-show.txt b/wiki/User:Bootchk-20210115205922-show.txt new file mode 100644 index 0000000..3d64b9f --- /dev/null +++ b/wiki/User:Bootchk-20210115205922-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Bootchk|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Bootchk search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Drawoc-20210417223818-show.txt b/wiki/User:Drawoc-20210417223818-show.txt new file mode 100644 index 0000000..afe4296 --- /dev/null +++ b/wiki/User:Drawoc-20210417223818-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Drawoc|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Drawoc search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Edj-20200923100030-show.txt b/wiki/User:Edj-20200923100030-show.txt new file mode 100644 index 0000000..2398c20 --- /dev/null +++ b/wiki/User:Edj-20200923100030-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Edj|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Edj search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Enselic-20210513100057-show.txt b/wiki/User:Enselic-20210513100057-show.txt new file mode 100644 index 0000000..86d2192 --- /dev/null +++ b/wiki/User:Enselic-20210513100057-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Enselic|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Enselic search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Grafxuser-20200920173119-show.txt b/wiki/User:Grafxuser-20200920173119-show.txt new file mode 100644 index 0000000..cf94f99 --- /dev/null +++ b/wiki/User:Grafxuser-20200920173119-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Grafxuser|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Grafxuser search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Lillolollo-20210115195722-show.txt b/wiki/User:Lillolollo-20210115195722-show.txt new file mode 100644 index 0000000..cb2a4a4 --- /dev/null +++ b/wiki/User:Lillolollo-20210115195722-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Lillolollo|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Lillolollo search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Mitch-20200806230338-show.txt b/wiki/User:Mitch-20200806230338-show.txt new file mode 100644 index 0000000..ccaab55 --- /dev/null +++ b/wiki/User:Mitch-20200806230338-show.txt @@ -0,0 +1,5 @@ + + +Creator and destroyer of bugs. + + \ No newline at end of file diff --git a/wiki/User:Owencook-20201022145607-show.txt b/wiki/User:Owencook-20201022145607-show.txt new file mode 100644 index 0000000..fae0690 --- /dev/null +++ b/wiki/User:Owencook-20201022145607-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [https://www.wiki.gimp.org/wiki/Special:Search/Owencook search for this page title] in other pages, or [https://www.wiki.gimp.org/index.php?title=Special:Log&page=User:Owencook search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Patdavid-20150926102705-show.txt b/wiki/User:Patdavid-20150926102705-show.txt new file mode 100644 index 0000000..3d08313 --- /dev/null +++ b/wiki/User:Patdavid-20150926102705-show.txt @@ -0,0 +1,5 @@ + + +Yes, Pat David. + + \ No newline at end of file diff --git a/wiki/User:Schumaml-20210117125548-show.txt b/wiki/User:Schumaml-20210117125548-show.txt new file mode 100644 index 0000000..43e2745 --- /dev/null +++ b/wiki/User:Schumaml-20210117125548-show.txt @@ -0,0 +1,3 @@ + +[[User:Schumaml/Playground|/Playground]] +[[User:Schumaml/LGM2015Minutes|/LGM2015Minutes]] diff --git a/wiki/User:Scl-20210115211436-show.txt b/wiki/User:Scl-20210115211436-show.txt new file mode 100644 index 0000000..715c242 --- /dev/null +++ b/wiki/User:Scl-20210115211436-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/Scl|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Scl search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:Test-20210615070413-show.txt b/wiki/User:Test-20210615070413-show.txt new file mode 100644 index 0000000..1772599 --- /dev/null +++ b/wiki/User:Test-20210615070413-show.txt @@ -0,0 +1,12 @@ + +
    +This user is currently blocked. +The latest block log entry is provided below for reference: + +* 10:45, 11 May 2017 [https://wiki.gimp.org/index.php?title=User:AlexiaDeath&action=edit&redlink=1 AlexiaDeath] ([https://wiki.gimp.org/index.php?title=User_talk:AlexiaDeath&action=edit&redlink=1 Talk] | [[Special:Contributions/AlexiaDeath|contribs]]) blocked [https://wiki.gimp.org/index.php?title=User:Test&action=edit&redlink=1 Test] ([https://wiki.gimp.org/index.php?title=User_talk:Test&action=edit&redlink=1 Talk] | [[Special:Contributions/Test|contribs]]) with an expiry time of indefinite (account creation disabled, autoblock disabled) (This was test account) +
    + +There is currently no text in this page. +You can [[Special:Search/Test|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:Test search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/User:ThomasManni-20210117123633-show.txt b/wiki/User:ThomasManni-20210117123633-show.txt new file mode 100644 index 0000000..7b606d6 --- /dev/null +++ b/wiki/User:ThomasManni-20210117123633-show.txt @@ -0,0 +1,7 @@ + +
    + +There is currently no text in this page. +You can [[Special:Search/ThomasManni|search for this page title]] in other pages, or [https://wiki.gimp.org/index.php?title=Special:Log&page=User:ThomasManni search the related logs], but you do not have permission to create this page. + +
    diff --git a/wiki/Users:Tips-20161024112554-edit.txt b/wiki/Users:Tips-20161024112554-edit.txt new file mode 100644 index 0000000..1269fae --- /dev/null +++ b/wiki/Users:Tips-20161024112554-edit.txt @@ -0,0 +1,67 @@ +This page contains a list of GIMP tips which are rarely known and/or extremely useful. Some of these if are not already included, then should be included in the gimp startup tips. This page is used to collect these tips both for users and for developers to see what should possibly be added to gimp-tips. + +Do you have more tips that you think that should be included? Contact us (See the [[Main_Page]] for details) and we'll add them. + +=== Hiding all the dialogs === +In order to hide all the dialogs and leave only the image window visible, press the '''Tab''' key. To show all the dialogs again, press the '''Tab''' key again. + +=== Quickly selecting the layer's alpha === +''Since 2.7.1'' + +Inside the layer's dialog, you can '''alt+click on a layer''' to bring it's alpha to selection. By using modifiers in the same way as in the other selections, you can add (Shift), subtract (Ctrl) or intersect (Ctrl+Shift) the alpha of the layer with the existing selection. + +=== A new image from any drawable === +Sometimes, you have a drawable (layer/mask/channel) that you want to create a new image from (to work on it alone or for other reasons). No problem - '''drag the drawable from it's dialog''' (the layers/channels dialog) '''and drop it on the toolbox''' - this will create a new image containing only that drawable, without removing it from the original image. + +=== Blending/Fading an action === +Let's say you want to create a soft glow effect for a specific drawable (ignore the fact that such a filter exists :P). The simple way to do this, would be to duplicate the layer, blur it, put it on lighten only mode and then merge both layers together. +This is where the Fade option comes to the rescue! Instead of creating a duplicate of the layer, blur it directly and then go to '''Edit->Fade'''. A dialog will pop up and allow you to blend the state of the drawable before and after the last action - simply select lighten only mode and adjust the opacity to fine control the amount of glow. + +The fade option can save almost all the cases in which you would create another layer just for one operation - it's very handy! + +=== Faking custom shaped guides === +Let's say you want to have a guide which is not a straight line but instead it has a custom shape. No problem - draw this shape using the paths tool (or even better - you can import the shape if it's saved as an SVG file, by clicking the import button in the paths dialog). Then make sure it's the active path (by clicking on it in the paths dialog) and go to '''View->Snap to Active Path'''. For some reason, people underestimate how powerful this feature is, and rarely use it :P + +=== Foreground/Background colors in color buttons === +Many of GIMP's plugins/tools require you to choose a color using a color button. In most cases, '''right clicking the color button''' will show a menu from which you can pick one of "Foreground Color", "Background Color", "Black", "White". + +=== Working on a single channel === +If you only want to modify a specific channel of your drawable (usually one of Red, Green and Blue), go to the channels dialog/tab. You'll see the list of the available channels - by default they should all be selected. Deselecting a channel can be done by clicking on it - then any action you'll do won't affect the channels which are disabled. + +=== Reversing the order of animation frames === +This happens a lot - you created an animation (each frame represents one layer) and then you discovered the frames are in the reversed order... Don't worry - GIMP can fix this for you - go to '''Layer->Stack->Reverse Layer Order'''. Surprisingly, many people don't even know this feature exists. + +=== Getting and posting the output of gimp --verbose === +To find out the cause for troubles in GIMP it's sometimes necessary to find out some internal information from GIMP. You can get them with the following steps, especially if you are asked for it on Bugzilla: + +==== On Windows ==== +# Open the Windows command prompt window: +#:Windows XP users: Click Start, click Run, enter cmd and then press . +#:Windows Vista and Windows 7 users: Click start, enter cmd and then press . +#:Windows 8 users: on the start screen with the tiles: enter cmd and then press . +#:A black window will open - the Windows command prompt window. +# Enter "c:\program files\gimp 2\bin\gimp-2.8" --verbose --console-messages +#:After a moment a black command prompt window will open, having the title 'GIMP output. You can minimize this window, but don't close it'. Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output and copy it the clipboard: click on the GIMP icon in the upper left window corner, then Edit/Select All, then Edit/Copy. +# Create a new text file (for instance in Notepad) and paste the GIMP output there. +# Save the text file as plain text, not in DOC, RTF, HTML or what else format. +# Open your Internet browser, open your particular bug. At the end of the bug click 'Add an attachment'. On the next page upload your text file and provide more necessary information on it. + +==== On Linux ==== +# Open a terminal window. +# Enter gimp --verbose --console-messages
    Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output from the terminal window and copy it the clipboard. +# Create a new text file (for instance in GEdit, Leafpad, Emacs, etc.) and paste the GIMP output there. +# Save the text file as plain text, not in DOC, RTF, HTML or what else format. +# Open your Internet browser, open your particular bug. At the end of the bug click 'Add an attachment'. On the next page upload your text file and provide more necessary information on it. + +==== On Mac OS X ==== +# Go to Applications/Utilities, then Terminal. +# Enter /Applications/GIMP.app/Contents/MacOS/GIMP --verbose --console-messages
    Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output from the terminal window and copy it the clipboard. In the Mac OS X terminal use Edit/Select All, then Edit/Copy. +# Create a new text file and paste the GIMP output there. +# Save the text file as plain text, not in a formatted, DOC, HTML or what else format. +# Open your Internet browser, open your particular bug. At the end of the bug click 'Add an attachment'. On the next page upload your text file and provide more necessary information on it. diff --git a/wiki/Users:Tips-20180812150616-show.txt b/wiki/Users:Tips-20180812150616-show.txt new file mode 100644 index 0000000..1e2a0ac --- /dev/null +++ b/wiki/Users:Tips-20180812150616-show.txt @@ -0,0 +1,98 @@ + + +This page contains a list of GIMP tips which are rarely known and/or extremely useful. Some of these if are not already included, then should be included in the gimp startup tips. This page is used to collect these tips both for users and for developers to see what should possibly be added to gimp-tips. + +Do you have more tips that you think that should be included? Contact us (See the [[Main_Page]] for details) and we'll add them. + + +__TOC__ + +===Hiding all the dialogs=== + +In order to hide all the dialogs and leave only the image window visible, press the '''Tab''' key. To show all the dialogs again, press the '''Tab''' key again. + + +===Quickly selecting the layer's alpha=== + +''Since 2.7.1'' + +Inside the layer's dialog, you can '''alt+click on a layer''' to bring it's alpha to selection. By using modifiers in the same way as in the other selections, you can add (Shift), subtract (Ctrl) or intersect (Ctrl+Shift) the alpha of the layer with the existing selection. + + +===A new image from any drawable=== + +Sometimes, you have a drawable (layer/mask/channel) that you want to create a new image from (to work on it alone or for other reasons). No problem - '''drag the drawable from it's dialog''' (the layers/channels dialog) '''and drop it on the toolbox''' - this will create a new image containing only that drawable, without removing it from the original image. + + +===Blending/Fading an action=== + +Let's say you want to create a soft glow effect for a specific drawable (ignore the fact that such a filter exists :P). The simple way to do this, would be to duplicate the layer, blur it, put it on lighten only mode and then merge both layers together. +This is where the Fade option comes to the rescue! Instead of creating a duplicate of the layer, blur it directly and then go to '''Edit->Fade'''. A dialog will pop up and allow you to blend the state of the drawable before and after the last action - simply select lighten only mode and adjust the opacity to fine control the amount of glow. + +The fade option can save almost all the cases in which you would create another layer just for one operation - it's very handy! + + +===Faking custom shaped guides=== + +Let's say you want to have a guide which is not a straight line but instead it has a custom shape. No problem - draw this shape using the paths tool (or even better - you can import the shape if it's saved as an SVG file, by clicking the import button in the paths dialog). Then make sure it's the active path (by clicking on it in the paths dialog) and go to '''View->Snap to Active Path'''. For some reason, people underestimate how powerful this feature is, and rarely use it :P + + +===Foreground/Background colors in color buttons=== + +Many of GIMP's plugins/tools require you to choose a color using a color button. In most cases, '''right clicking the color button''' will show a menu from which you can pick one of "Foreground Color", "Background Color", "Black", "White". + + +===Working on a single channel=== + +If you only want to modify a specific channel of your drawable (usually one of Red, Green and Blue), go to the channels dialog/tab. You'll see the list of the available channels - by default they should all be selected. Deselecting a channel can be done by clicking on it - then any action you'll do won't affect the channels which are disabled. + + +===Reversing the order of animation frames=== + +This happens a lot - you created an animation (each frame represents one layer) and then you discovered the frames are in the reversed order... Don't worry - GIMP can fix this for you - go to '''Layer->Stack->Reverse Layer Order'''. Surprisingly, many people don't even know this feature exists. + + +===Getting and posting the output of gimp --verbose=== + +To find out the cause for troubles in GIMP it's sometimes necessary to find out some internal information from GIMP. You can get them with the following steps, especially if you are asked for it on Bugzilla: + + +====On Windows==== + +# Open the Windows command prompt window: +:Windows XP users: Click Start, click Run, enter cmd and then press . + +:Windows Vista and Windows 7 users: Click start, enter cmd and then press . + +:Windows 8 users: on the start screen with the tiles: enter cmd and then press . + +:A black window will open - the Windows command prompt window. +# Enter "c:\program files\gimp 2\bin\gimp-2.8" --verbose --console-messages +:After a moment a black command prompt window will open, having the title 'GIMP output. You can minimize this window, but don't close it'. Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output and copy it the clipboard: click on the GIMP icon in the upper left window corner, then Edit/Select All, then Edit/Copy. +# Create a new text file (for instance in Notepad) and paste the GIMP output there. +# Save the text file as plain text, not in DOC, RTF, HTML or what else format. +# Open your Internet browser, open your particular bug. At the end of the bug click 'Add an attachment'. On the next page upload your text file and provide more necessary information on it. + +====On Linux==== + +# Open a terminal window. +# Enter gimp --verbose --console-messages +Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output from the terminal window and copy it the clipboard. +# Create a new text file (for instance in GEdit, Leafpad, Emacs, etc.) and paste the GIMP output there. +# Save the text file as plain text, not in DOC, RTF, HTML or what else format. +# Open your Internet browser, open your particular bug. At the end of the bug click 'Add an attachment'. On the next page upload your text file and provide more necessary information on it. + +====On Mac OS X==== + +# Go to Applications/Utilities, then Terminal. +# Enter /Applications/GIMP.app/Contents/MacOS/GIMP --verbose --console-messages +Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output from the terminal window and copy it the clipboard. In the Mac OS X terminal use Edit/Select All, then Edit/Copy. +# Create a new text file and paste the GIMP output there. +# Save the text file as plain text, not in a formatted, DOC, HTML or what else format. +# Open your Internet browser, open your particular bug. At the end of the bug click 'Add an attachment'. On the next page upload your text file and provide more necessary information on it. diff --git a/wiki/Users:Tips-20201001195447-edit.txt b/wiki/Users:Tips-20201001195447-edit.txt new file mode 100644 index 0000000..f7fed5a --- /dev/null +++ b/wiki/Users:Tips-20201001195447-edit.txt @@ -0,0 +1,66 @@ +This page contains a list of GIMP tips which are rarely known and/or extremely useful. Some of these if are not already included, then should be included in the gimp startup tips. This page is used to collect these tips both for users and for developers to see what should possibly be added to gimp-tips. + +Do you have more tips that you think that should be included? Contact us (See the [[Main_Page]] for details) and we'll add them. + +=== Hiding all the dialogs === +In order to hide all the dialogs and leave only the image window visible, press the '''Tab''' key. To show all the dialogs again, press the '''Tab''' key again. + +=== Finding Filters, Plugins and Menu Items === +You can press the / key to bring up a dialogue for searching through GIMP's filters, plugins, tools and menus. It's sometimes even quicker than using the menus! + +=== Quickly selecting the layer's alpha === +''Since 2.7.1'' + +Inside the layer's dialog, you can '''alt+click on a layer''' to bring it's alpha to selection. By using modifiers in the same way as in the other selections, you can add (Shift), subtract (Ctrl) or intersect (Ctrl+Shift) the alpha of the layer with the existing selection. + +=== A new image from any drawable === +Sometimes, you have a drawable (layer/mask/channel) that you want to create a new image from (to work on it alone or for other reasons). No problem - '''drag the drawable from it's dialog''' (the layers/channels dialog) '''and drop it on the toolbox''' - this will create a new image containing only that drawable, without removing it from the original image. + +=== Blending/Fading an action === +Let's say you want to create a soft glow effect for a specific drawable (ignore the fact that such a filter exists :P). The simple way to do this, would be to duplicate the layer, blur it, put it on lighten only mode and then merge both layers together. +This is where the Fade option comes to the rescue! Instead of creating a duplicate of the layer, blur it directly and then go to '''Edit->Fade'''. A dialog will pop up and allow you to blend the state of the drawable before and after the last action - simply select lighten only mode and adjust the opacity to fine control the amount of glow. + +The fade option can save almost all the cases in which you would create another layer just for one operation - it's very handy! + +=== Faking custom shaped guides === +Let's say you want to have a guide which is not a straight line but instead it has a custom shape. No problem - draw this shape using the paths tool (or even better - you can import the shape if it's saved as an SVG file, by clicking the import button in the paths dialog). Then make sure it's the active path (by clicking on it in the paths dialog) and go to '''View->Snap to Active Path'''. For some reason, people underestimate how powerful this feature is, and rarely use it :P + +=== Foreground/Background colors in color buttons === +Many of GIMP's plugins/tools require you to choose a color using a color button. In most cases, '''right clicking the color button''' will show a menu from which you can pick one of "Foreground Color", "Background Color", "Black", "White". + +=== Working on a single channel === +If you only want to modify a specific channel of your drawable (usually one of Red, Green and Blue), go to the channels dialog/tab. You'll see the list of the available channels - by default they should all be selected. Deselecting a channel can be done by clicking on it - then any action you'll do won't affect the channels which are disabled. + +=== Reversing the order of animation frames === +This happens a lot - you created an animation (each frame represents one layer) and then you discovered the frames are in the reversed order... Don't worry - GIMP can fix this for you - go to '''Layer->Stack->Reverse Layer Order'''. Surprisingly, many people don't even know this feature exists. + +=== Getting and posting the output of gimp --verbose === +To find out the cause for troubles in GIMP it's sometimes necessary to provide some internal information from GIMP. You can get this with the following steps, especially if you are asked for it in a bug report on gitlab: + +==== On Windows ==== +# Open the Windows command prompt window: +#:Windows XP users: Click Start, click Run, enter cmd and then press . +#:Windows Vista and Windows 7 users: Click start, enter cmd and then press . +#:Windows 8 users: on the start screen with the tiles: enter cmd and then press . +#: Windows 10 users: in the desktop’s Type Here to Search field: enter cmd and then press . +#:A window will open (usually with a black background) - the Windows command prompt window. +# In the command prompt window, enter "c:\program files\gimp 2\bin\gimp-2.10" --verbose --console-messages +#:After a moment a second command prompt window will open, having the title 'GIMP output. You can minimize this window, but don't close it'. Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output and copy it on the clipboard: on the second command prompt window, click on the GIMP icon in the upper left window corner, then Edit/Select All, then Edit/Copy. +# Open the appropriate bug in your Web browser and Paste the GIMP output there. + +==== On Linux ==== +# It is preferable to install GIMP debug symbols for you distro before these steps (if you use a flatpak version the command is Flatpak install flathub org.gimp.GIMP.Debug) +# Open a terminal window. +# Enter gimp --verbose --console-messages
    if you run GIMP from Flatpak the command is run org.gimp.GIMP --verbose --console-messages Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output from the terminal window and copy it the clipboard. +# Open the appropriate bug in your Web browser and Paste the GIMP output there. + +==== On Mac OS X ==== +# Go to Applications/Utilities, then Terminal. +# Enter /Applications/Gimp-2.10.app/Contents/MacOS/gimp --verbose --console-messages
    Note that the start might take a bit longer because GIMP now writes output data. +# When the GIMP application has started, execute the steps to reproduce the error. +# Select the GIMP output from the terminal window and copy it the clipboard. In the Mac OS X terminal use Edit/Select All, then Edit/Copy. +# Open the appropriate bug in your Web browser and Paste the GIMP output there. diff --git a/wiki/WGO_Redesign-20161025045930-show.txt b/wiki/WGO_Redesign-20161025045930-show.txt new file mode 100644 index 0000000..9b3178e --- /dev/null +++ b/wiki/WGO_Redesign-20161025045930-show.txt @@ -0,0 +1,268 @@ + + +__TOC__ + +==Why?== + +The email from Cristobal on the Gimp-web list recently prompted this further discussion. +His summary of work and ideas were documented on [https://leivaburto.github.io/gimp-web-revamp/ this page]. + + + + + +===Assumptions=== + +* We (the royal 'We') could benefit from having more content on WGO, in particular tutorials. +* Lowering the barrier-to-entry can help entice users to generate new content. +* A new facelift can't hurt from a PR standpoint. + + + + +===Benefits=== + +There are a few possible benefits from conducting a redesign now: + + +* Better organization of content +:If the content organization is approached as described below. + + + +* Modern Look +* A chance to consider usability and ease of access for users (and to improve it) +* Lowering the barrier to entry for new contributors/contributions. +* Responsive Design + +==Summary== + +From an architecture standpoint, the general idea is to separate content from presentation. +This is already how the current site exists, though the implementation is a little clunky. + + +# Possibly having role-based permissions against different areas of a git repository (admin, presentation, content, tutorials, news, etc...) ([http://www.git-scm.com/book/en/v2/Git-Tools-Submodules git sub-modules] were mentioned as a way to manage this). +# The proposed idea is to separate WGO content into more user-friendly discrete pieces, such as individual [http://daringfireball.net/projects/markdown/ Markdown] text files. +# These text files (+assets) would then be passed through a processor to be turned into static HTML assets. +# These static HTML assets would then be served to users. + +Overall, the approach from Cristobal considers the problem one of creating '''Application'''/'''Content'''/'''Presentation''' layers. + + + + + +=='''Application''' - Role based access (git submodules)== + +There was originally proposed utilizing [http://www.git-scm.com/book/en/v2/Git-Tools-Submodules Git submodules] as a means for segregating content/admin/presentation from each other within a repository. + +I ([[User:Patdavid|Pat David]]) am not familiar enough with Git to speak to this, and could at some point use some input on the idea. +As near as I can tell, the idea is that sub-folders of a Git project can be designated as sub-modules from other projects? + +It appears that this may be something that can be separately addressed later in the process of implementing a new site. + + + + + +==Content== + +The content for the website can be decoupled from the presentation layer. +One method of doing this is to house all of the content in an easy-to-use plain text format such as Markdown (or some combination of Markdown + html). + +A benefit of separating the content from the presentation layer is portability of the content. +It becomes easier later on to re-adapt the content layer to a new presentation layer as needed. +This also helps to lower the barrier to entry, as any given piece of content is a self-contained folder of plain-text markdown (or html), as well as the associated assets needed. +This is already similar to what is being done on WGO, but even further removing the presentation information as well. + +Consider, for example, this snippet from the tutorial "GIMP Quickies": + +
    +
    +GIMP - GIMP Quickies
    +
    +
    +
    +
    +

    GIMP Quickies

    + +

    Intention

    + + + +So you installed GIMP on your computer, congratulations! +GIMP is a very powerful image manipulation software, but don’t let that intimidate you. +Even if you don’t have time to learn advanced computer graphics, GIMP can still be a very useful and handy tool for quick image modifications. + + + +It is my hope that these few examples will help to solve those small, quick modifications that you may need to apply to an image. +Hopefully this will lead to learning even more powerful image editing capabilities that GIMP is capable of as well. + + + +For quick access, these are the four main points I’ll cover in this quick tutorial: + + +* Changing the Size (Dimensions) of an Image (Scale) +* Changing the Size (Filesize) of a JPEG +* Crop an Image +* Rotate or Flip an Image +
    + +There are still some Server Side Include statements, as well as having to build out a valid HTML document while writing. +This may cause extra burden on someone willing to contribute new content, but not comfortable with writing directly to HTML. + +This same content, represented as Markdown, would look like this: + +
    +---
    +title: "Gimp Quickies"
    +author: "Pat David"
    +...
    +collection: tutorial
    +---
    +
    +# GIMP Quickies
    +
    +## Intention
    +
    +So you installed GIMP on your computer, congratulations!  
    +GIMP is a very powerful image manipulation software, but don’t let that intimidate you.  
    +Even if you don’t have time to learn advanced computer graphics, GIMP can still be a very useful and handy tool for quick image modifications.
    +
    +It is my hope that these few examples will help to solve those small, quick modifications that you may need to apply to an image.  
    +Hopefully this will lead to learning even more powerful image editing capabilities that GIMP is capable of as well.
    +
    +For quick access, these are the four main points I’ll cover in this quick tutorial:
    +
    +* [Changing the Size (Dimensions) of an Image (Scale)](#scale)
    +* [Changing the Size (Filesize) of a JPEG](#compress)
    +* [Crop an Image](#crop)
    +* [Rotate or Flip an Image](#transform)
    +
    +
    + + + + + + +==Presentation== + +With the content abstracted further to plain text files, the presentation data for WGO can be managed separately from the content. +This allows not only parallel workflows but the possibility of drastic modification to the presentation layer without any undue burden on the content creators. + +The presentation layer is also something that is usually defined in terms of the static site generation (but can be modified/customized as needed). + +For pixls.us, I had used a bit of Adam Kaplan's [http://adamkaplan.me/grid/ Grid] as a basis for extending the site. +This has the benefit of being a responsive design with various possible screen sizes accounted for in @media CSS. +This is not a requirement, of course, but if doing a redesign we might as well consider responsive and mobile-first options. + + +==Requirements== + +===Current Site=== + +A look at the current site and types of pages that a redesign would need to support. +Looking at the WGO right now shows a very simple breakdown of content type into two main types: + + +# News Entry +# Static Pages + +These are the primary page types we can find. + + +====News Entry/Article Post==== + +News entries are relatively simple, as they've primarily been the snippets of updates shown in reverse chron. order on the [http://www.gimp.org/ main WGO] page. + + +====Static Pages==== + +The rest of the pages can be considered simple static pages. These include: + + +* Screenshots +* Features +* Downloads +* Documentation +** User Manual (''see below'') +** Tutorials +** Books +** FAQ +** User Manual (''see below'') +** Tutorials +** Books +** FAQ +* User Manual (''see below'') +* Tutorials +* Books +* FAQ +* Get Involved +* Donations + +There are a few other pages that follow the same conventions as a simple static page. + +'''User Manual''' ''The user manual is a separately compiled project, right? In this case we can work with the devs on that aspect to make sure that the new static build system has what it needs in place to support this.'' + +It would also be in our best interests to make sure that the URL's remain the same as they've always been, or to carry the correct 301 redirects as needed to avoid losing any indexing-sauce that has been built up. + + +==Suggestions== + +===Importance=== + +Talking with schumaml, a list of things that are most important to users visiting the page (imo): + + +# The project name. Main branding. (GIMP - The GNU Image Manipulation Program). +# How do I get it (Download). +# What is it (The Free & Open Source Image Editor). +# How do I use it (tutorials/docs). +# News +# Get Involved +# Donate + +Feel free to re-order these or suggest changes as needed! + + + +These are some ideas I ([[User:Patdavid|Patdavid]] ([http://wiki.gimp.org/index.php?title=User_talk:Patdavid&action=edit&redlink=1 talk])) am considering moving forward with: + + +* The main page should serve these distinct purposes (''roughly in order of importance''): +** Clearly state the name of the project +** Clearly state the description of the project +** Clearly provide a means for getting the software +** Display recent news items/articles/blog posts +** Describe the program in high-level +** Clearly state the name of the project +** Clearly state the description of the project +** Clearly provide a means for getting the software +** Display recent news items/articles/blog posts +** Describe the program in high-level +* Clearly state the name of the project +* Clearly state the description of the project +* Clearly provide a means for getting the software +* Display recent news items/articles/blog posts +* Describe the program in high-level +: Basically, anyone landing on the main page should have no doubt what they are looking at, what the program is for, and how to get it. + + + +* Try to keep the existing URL structure intact as much as possible. +:The only way it might not be the same going forward could be due to removal of some pages that could be considered extraneous. + +:Even then, the pages should probably still exist to not break anything (just soft-remove them by no longer linking to them from anywhere). + + + +* Consolidate page information onto a single page as appropriate. +: For example ''Screenshots'' and ''Features'' might be better off having their information be presented/duplicated onto the main page. + + + +==Pelican== + \ No newline at end of file diff --git a/wiki/imgs/Blur_dialog1.png b/wiki/imgs/Blur_dialog1.png new file mode 100644 index 0000000000000000000000000000000000000000..68b9f5e8be9b52e4e296065dc5b02156b51702bb GIT binary patch literal 12295 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�!hP1R=R{I_xu;RxMsT88~nu&Wm2gi#42RKngxw<`gmyvA|_W zg^n+q4~2QA=hw@o$41+X)-q=+D(}%0wyKHD_Ai@)B<@!=zBY@TzR#y$X69can5!0A z4MKj{Z-5{O2GsWU+Jp~}vTQr=F_41b8Ff&A$`xm;d-0bJ`t@eBk)-dGl9^89JfJIFLpP8x7$;4&1%56Fr3&tdHBNq*}S#4%3kO1Rv2^f-CI_|c#Mn+dx z?L7?K&5E^-@|L{O%v>~;G4MgYQLL0V&Ue;^%cQOA(1(M@&*x&V{&-R_)fHvpjg@7a zxt1}sTxX%+@^jGwDgl(JrR03DZlj`vabgt=1J?@%8$}9PXC05sf`Yyvo+INj7B|$l zSzI)mIwmD+sQ#@4ZT|Xb!Txub|G$&~M58W$n8)j*CU87(O}$Egt<(3_BFp=xr0vCgnOgfFD!^00VSud(`((^>x1lp+MiE zY>@@(R0iZqN1*Ci@j>VVot@|Fx#5Ks2qzN!+-Gf?HA5tz7eNWdpmGyLK8>k!UB`3KMjn`+}GK;WX0O{oT_015rm z)04@Ejvrk19VP?OSg|__G9%utXy|G`>qX%tJDxpy#%)`jG^%8H9-QXXG(b8z(P{>= zeGPs0g2$_y6?@<7ISu=k-6U$6r1ag<{24ykRd!1eLuyoenKQe(3H9kCC>I1n<4xjowmK|2i5&$nSBrGZcS&x~8M6`}AYu zsqi80sifL|;^jM6v_aeNZ(qd!c~_0olB?b!KhtryKJEi$U=neV7XyNibC(}fyXS4?+aW&ZgD-~#$*#wXO4Lbn z37{E_PbB%)Y~@Yl<8X0~_dee4+3PmBE3B`(w7e_BPq5wScn0f0cr5x}Al_v8zT8KE z{h!W#=M?)-{n!`Nk#-5qI#jS7dO)p zMXRc+Vi$2P>EL@?c;44yPL-PMgCRtc0%L}wT>xTc)w@O)n8I!bK6VxQ6)1qj3;a=} zUez?k8g$s7c-V9lF+SlVehP~w=A-E~L3)0?J=^H)d~^m21MkK61+MSCCO~s?n&8K? zC@mu&%1TdX8Xu#OUbyOvOMOeqJ1iy{gMG5r-ub)hm)ubkk(1AJH!_QEy`_>_a(}Ci zW7cK4u{jy~;PCM0mBy3CwwDQ?mt8fuH!BGXLrZe>(q4;{1M(Jq|9Tt*sqH!e3ig=MBEW(05%j`xl@<(f}p{9E5T* zGS*<0S*Bhgk~0Yg`k9%TR@W1cDRI1v3*drQb+_*L2%}UG>LL%xVxqErzmfOff%8*a z(I@V`!x}7+P>@TM4t(}vB#ip0A|Qg0HDQrv4z34&ZgP=i5%M9c!rXsZOHn^vuje#}n;6QbwOal2hD6QIM03Ibl1=oWt^ayuW{a z8dkLoTG&wX=8*dJH!ox_4(Bd9aA1Xb`lX@^>-73%0!1$86B zf17*N!)kH-6Skjf;YR1kzHZ|SYenrwKqA>Zvgd#%>!m=vn+2pKhF-H-M%(= z!l`?Te8-Ad6?%QJrIt2t_qa~D)NOGzV|q&L*#5*B6O-D&D$iFlD3@2OS_f8)z-SGY z1m-(!Ji}A9R<<}!&=h!hPq8|g!sP;USQSh|L^=~ z=>Hn#o~zzBpXfY~!}5H6Q>MNFmO8Yf2?-Gw^^0O2Tm!IR%o|R;*h4yhZ;f1YPEJbo hqiuM(v)jMEp6diOmfkPF0YBmgq{ZdMDn$$f{tH{8&J_Rv literal 0 HcmV?d00001 diff --git a/wiki/imgs/Dave_Neary.jpg b/wiki/imgs/Dave_Neary.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33f5c8d48b03c6039cd25f0efd25b0eabb6a05c4 GIT binary patch literal 7489 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 literal 0 HcmV?d00001 diff --git a/wiki/imgs/Depth_of_control_point.png b/wiki/imgs/Depth_of_control_point.png new file mode 100644 index 0000000000000000000000000000000000000000..12fae74a28759eef5e42a8acb01b30c1740a4ddc GIT binary patch literal 119140 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 z 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

    $T+XI(a^=!o6%`=!aFEV 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 E0|uDwhX4Qo literal 0 HcmV?d00001 diff --git a/wiki/imgs/Gnu-head-sm.jpg b/wiki/imgs/Gnu-head-sm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49502c771ff95ff97514eaf4c21f7a3f262b5310 GIT binary patch literal 5286 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 PB}iIA9$G1;=l{O|7pjZW literal 0 HcmV?d00001 diff --git a/wiki/imgs/Mac_gimp_logo4.png b/wiki/imgs/Mac_gimp_logo4.png new file mode 100644 index 0000000000000000000000000000000000000000..d96f370b3c02f723089130084c1c14f385c6182f GIT binary patch literal 11474 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 JPDHLkV1ju}edPcE literal 0 HcmV?d00001 diff --git a/wiki/imgs/People2000-small.jpg b/wiki/imgs/People2000-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51f90a1b810d8ec9c249c13dac7816daa77b2891 GIT binary patch literal 49236 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 F|Je(V+A9D6 literal 0 HcmV?d00001 diff --git a/wiki/imgs/People2003-small.png b/wiki/imgs/People2003-small.png new file mode 100644 index 0000000000000000000000000000000000000000..c921c9c3749b1e31e300009dd60917335681bcd4 GIT binary patch literal 244483 zcmYg%1yox>w>8Dx-K{`z*WxaPLXqGuE$;5_#i2z@fl}O^;0{59YjAg$KmES--uqW_ zGb^*QX6D{GXP>jro=SzZR_ z?cXcEqa+2|gW{y1>k0#dhWqb&H@zD04DCd6Q~V^0G=q#m2n+Y&yloH$h8jjuMpDyj z>A1r?+h9?5{l$Nxqe15^wzc7GT7h(YizHE$l4rmQ#RTHjj%`P72HQPB78#b&t}BLu z0xyQ0d|tbaki0=J!D+;a7}_0l;?8~&!uw5dZ|#t>fj3!h z+D7g!3*=W^-1_&l1them8vr^J(h1mx6E|0UpQfn+{m|Fc{2MY~-0pN=qrdf|^tVf$ zV%eNRniGp)4@HxG^CldHp=jm=m|$qa{%#F-zJ1Q(X#%4Z*TH4j>I&K*$a|f44U>sY zx>}b^FDmV%XGn8otE7EbVipLcQ`yd2kN~ie?29*tJyiwNg z$$eWlBTsvkG^Z40cK!d(DUGDIdLCRnX~SIFg$Bw~_}`JVOgO*T@TO@R;e6%)VsoAD z6sF%)(FR=}35A075h{JSobk_EThOj1ia^V@%LiT`Wx*c0NVWCz;Do%Ns@5!N`bN2d zr+~ji;1iSI}c1yDjMaHie$EnIUhc3-_+oN7^)J< zeTBXK_xDp!czw=?@RYf~59*A`P0tG)9ZmRA7(Dt6XS4hJ-|v56sf;WfymJSS4ex0i zC^M>20h~K>#9Rfv{dZTU2<8u4t_F1smhn<@lDno~xcU6~y+uV`*}X-1L~`46b41p? zMWO4+{h6m?1kw>c541ErILg|->0LkEw=WR>*fUtGnzllnZNNVy7FG3J8k`eZNE&YxritU3rd{+-X@*^OO2)5u|+Th{PrpL>{o&=a0l zo*$leZ*ZevH*6{yFj6q05^o9Y7j?N`_%dpD5c70O*i@8E+4{1SN`xuy(aTd0Z6=_G z^Ls>XCp}%RPE|}th2Y}b7;=>izrB%vFVYXGLLG)GblxAr-A8P`x5bnDj*5~aJecK zBNQ7qd8mDPw!9=%{4>-K+oS(A)UEp#sG`Fx@x{p_EOg3hSBg7)$H?;)#_qjH!tKn^mC9(?TsM4x zTI!W@=|T$grnXa9iCPYD6D~(EPpYu=H`Fkp3rZ2}(R2v#exE;86lqbCJW|1|j3ur1 zpRp>*I-&MYe)tJ$|J!Lna!vLvELzX*>G-4_4@G4w8UGp5yoAx=UZR9y@4w#pA9u9n z*o<$EisIxI9NXU~9ob(;eT~1T-BdZ513(i-q_YM73FK>`hC&Q7&h6mUR1#B_R%%pI5 zj|X>C7ME1UrIX9z3}m{cfAJn4S`%q1(luo+T|rMcFS4+(;5(YPr%yrgm-}PWpqDM^ zoSK#ORTG=@V|~ockpT6tprb3h4Y|VZ=#;_C+*~DV;s4?m!Oo95xvK|QG66e=lwp%N zNn2@rSypy14vvqH&jGV%O*5cGqcp!k&epXXIIuvl4qOS0ufa!^<+pF=qq2BZs+LR4 zUC227qv_zCl_QeJys5>YqeVw<$TQT!!(y#lSZIsf`@OUjC4pSjZP?<>?54Z&)S))( zxK^doG5_b{!H8vI&1Y7Zr(BWYJ+!9nzE0foDK@gZVv$2(=&r9lPtUh8YxPuYAam@( z*DbR4O7{|*3yONgFvX->#z}0jrJT%>(!p z4&lEj?l3rq5v3$)l?_|ej*Y2)DVs}g70^zs-0T}RNAZ52GF)qagsD`db4ru$=x4(5 zZ?OGS_9W0AaxaWI`rIL{c?sz1o(_5yg3L248UoMc*C!H|`C%)YF7{qe1}mQgJy#l& z=7FXHF#Q^*zf>&`UM#p{4A|e2?_Ak-7KZm0+D$!hucGM=n$*u)^YNiic zIs6@N|MAq4jw{lwS(yh7G~*nlcz!p-T1l4LK6=l8H?_8}yb1pj?6Qn5lWSM$#zsxf z&5aMl|I}^rfNL?xeHbBsx;ul6Wz7r&=MG1(8rs3C=lvR00{38n+lvavW5~1D-mAyS z;@ElssEP6I?Fo2AME=n!B$Ok2+w*NOZ?zuJx8=^2ZYPcUyd4@fbCZR;b%5=-^3`no ze@nNj+~w}gaMa`C$_MmDvv^8s8fV&c*gd%>#TD=ygaV$K!liKRdD9-enbEEmj>2aQ zOI^i9`W@fER8LPh0mpP_Tb)ma5m#NIo|gyW_qOHXc!Qt|W%0K*ftNl?agWQ|(>=YB z=ozGi=F`U5*O&h;LS+Y>UV6ZTj#=Kaziu2&w}ATKBFr_vgo9aiXujpg_*b{iiml%) z+NWdS_}E2b^v4`KnH?|bn9goScfJnos_1*>s|K=P__l1uPa`SO5T-QL)DhXgXzptd zlc6h()_5?H#)AFUVmFqZN4{%at9Pev>wM|!j~scXYu43{PnEtc^YbG=;`xC$M}b3I zzv$39E`mG!o|aEdUj}e`I8B~cc-QX_XP$3}DCKOgxQPM|p!XpfxF@pEx|*bSEAAU7 z{&GB@eCB^o)$wyJ;I96p>LriyVRv5S1m|aC`KIss1w-QrK&@2M#I#^ws@L3aH^o>F zhijqJTokM0tio=oHe$dmWsuT4SNyq;=qs-tk>9P$O|9E8@a1RV7}(y{d){|lNk=Cs z@V*e}r3Gm>_&|7Nx6=N@jO#2vO(HX|%;kAMD+58~?#8pu>V$JuRJMon_iDnQv3bGj zH{yW>wEQVi-=@!He1ZYjV+cS#&dFZz$&p}SKm^|4gwgq3#qvBCw67bEQCr5qW2G_p z_0=JSvx`)@p>?P<1u`~a@S{VNTe#~-L$8}V5elqq-J;d;thXw;c+=Kis6>tP)i*gg z#37GD9eJ}1~&Dnql|1}+}`$L>!VxQa#a(&8w z4&$)9huF?nTK7JFvZ;VV`a*4rK?pT<2FSdkz~FT2wC&WgK+n`{>tjmFUe*3=2H6gL zhVWX^^f%#9(ORGH_RI5d^k`Q<*B1uwIw7Cj+}qCD_mI{G249czCg%*d3+_7N{lw6^ z&R#&Ey5h@I=w;SrSm+mu@qg(gqK;Y%D?T;G6;{ffdgB8&1_GNsF z>5R=K`OsdjQ0v(JYoFQ+wUYbyo7`M(&-J<#@yF{7j^^7|47%r8;A0#7>+b>=og~M% z1Ycs}<4v8n87fvT8J*&cf`T=RV@I!R&J&N+xGSo+^}tAKWOm!^3>LaVxN<{a zj5Ly}M(J!ieALT|@47>-*Kt=2=IgW^G1T{ael$pDi}DQD&{^9w(bcw~8}86T15Lq{ zi_XQbKS~9uC1oWt1>f7ca1evddI!{HP#&Z(p+UZ*!?1q&2N7mAJu*IBVJLK5_FSJW z>J+>>7U5)(vo+N>39J&e1lO&5UANyK@UMt0ovpcP?mA70ls+U-k`y*pE0h|Tj5ao) zCthFe_kyMX?VmGtT!M4gxb>T=ARECcqp#o@eIxBrph3&ot0;W1SwN*y!FThS-MRMj zXB5?(c22LeLw1)l|F*0g!~8`X=Q~jmAr~*Z{-Evtyu6$&pJ5R2bS+0_>2n$Tw7|;v zZiTJao_y{cV?EkVK@r2(r@Y+AFIcWTfQdGg=OfHH?%ZL0su}{3_g0 zSy|qgR3SNS{1?|LI*pA@cKU<+hwmtTE#45a##+j#v0zCe0!wcN%80$eVh0&Z^ z#~L*rVpxU~X>4pfJzVyWY`P3k_1CLI0*cMsoTCG({oN!-(I!^k7ES-aJ$6snIRRiN z2Z{-E8tKdz*Oj*}isMdyG_{XDCjDossuMM)5T?Be6*e@5O6}ah+lAWo#RhAhf4hEN zdVv-)z3R))!y^isQKN)4DbO(AtBlX4__=YNWsZ(j*|xpsj!&QG$iGY!w{szng)Qqt zqEs8uJESGjGmBz`Brhm98=L%*4D1NYI+#dhIPpwQ{CoA=7vpjqS)92;Sm>Kkjndl2 zCUg8})AaIkqQ<)c10$euOPQBpLGTTk{6m)UJ!gwSM8W0`@oS#{DH+GZ3nNuva3t`7 z)v@`_14it;cfEJXy|Sj!$o5?P?P)K0=nab5#oNBXi?Y0}=X(`g^}uV!z%G%Q4vtZr z(}k8B%T>^Oxcmm`;iHngk3)s)t=ED_4T$0|9Dyl|SqR{AiY@EF3p(YvJwzx*dTROT z{y?#;rCEO*5PLmD!)?;iR*B6VH+huxM5PB%+53=<$u zZea-qboQrLTeMho%)3gj3U@L&K_9Q<+Pkm(8KzM9;`kUy>l}h&HWecnaLg*=uq;uN zSz_c^9)zos9<0Et#fHGwvuJl!n)pVLD1P~D z`7$sVxX00KKhFTQe7mLTQoQH2w?{t>TVh>Ng*OSc+6ADaBEuJ^U16uK$0VKS0CooJ z0R~*gH}ki1nzj2b3O`7h+Qoe#l6KeuCY5mi@mPqp)7t2L%U3x$q>mQ*oeVx%g5tgZ zz@N44H7(()h(2Q!JM3MA3R?c3k6Fuxv- zYr6HkL*+NMyqqSOoo3*UFz}As z`li^i&D^r^XtTF0Ej*mr8l(a&e`?8m2EDzOJa3D?!4xGg_xavBn1a^W$h}^Xfe&SY zZozO-w%uHzbuGUGic<|5jNo+%O@Rw7hIZNVScw;9ZwHW!lRxQ&xUn$MhtX3*XResK zw)$mjf0K)dDWV$z=cS0k?iRKKnjtiutkoaCR^k(mT1o#H=idW?oR&{Np<~`~IR`{c z@kz64ew+P<;r5$DSB)hNEv}LhO6qhwtiBttkMdBi`Ih=NXLt1=*sugLPL#9ri{TV# z8*cxDi;Dw-qi7w1W2BfHGCA!r@YaRQ$&M>|16>cNh2IuET`w8?n5~?_7P3Q`en@JkDBkG)h&< z=C(Hq;Gi5=ojI+={A|^xqIAw6C%>$1xtCOD7kP9Cif&u(U;6G_J_H=>1?*YA$Q68t zh;%-6TAtlpr#@7kdBX)>Sg)&4=M`aYl`>*_jI}6S<}GX(RjB0VwQW5OTZEvYk1M%s zE$F`9yj_v`&EK^rJy9(vt5q#qG@UGs{No8%|5!psdxGI6%u+^KMjCf}Y`iNpj%V;q zq@g?d7d7h|Hjt;u(z^eE+;+kOmK1ws_T>^mHly!J81)r_%9JSv=v!DviD|7Ls72VHMfGO z+o2g8=Jyaz0M0Gii;tarMx`~CDE9!AN{KkOT`nE>TY%Oopy{5EgY&OL%{cJMX6MC0~(_>s&15odpbJ%*F4>hlM8#f^h^A!dFC2`hq*gC{Et^Q zvo~5Uc(TP#_#ZbmINKcBatzo9$HwqMqIW7=@P_=`F^5;KnA0B!l*3FT`ul||w4eBj zhE|&#H#q~pRv#U_9buETH>MH=KLS$ zl%{%Ii?uS(=s5qGfmE0+wiq0M80quC_;&o#epP_CWq`5FE;v%3b#JO z-8n9IL~E5jLJ|07G^DSHTU@7KuZ{IHt0w_UZ_wf*>fS_N^Y)%^D^iC4Yi+G{p3p#1 z7(S^#0(Z~&&&FSxUEAC6(B!D33iwm1G8Ti3pN=+LRA3+)Z;*o;=r)*8&5fj>L1h5= zbDoR^A<(t*SKj&9aJVz?W>iVnqM>ko_OdUM{PwnGEIRURkf!GUT=k!a8B}NnJQ(*p z7cdTtPwjihYf5CC3hBpP{GbZlk1^p8HS^sf7*p9SuB|2C?7 zx@ChV8OmlKb>f@Fdg7`qx6yPdz0NE94uF7H5D^vdkjuE#h@Ee6-ZuLwPjukK(_v?^ zB$2g@YVL3BtZjUm*oOnCgL}P@-8rql_zJr0^VabY)bnp&E?VAszn`?p#E5REvumO& zF4@)Pn+DZ^+%_6KM3kt9GFYDOD0bEaj(0ns?wsy7zFJwc5Zg21yZn);06>=Bj@3`S zdmT=jZIL+01y#*!WT7|(O;qt?y(u5St{MI>P-e6-jnPe! z&?-@Sg)P*vo2~dJH7k2?5GA9cCgZP^&rD6GfkQ8_X{1A`rxTgYq` zQF~plh&Uc?&r}5LSH>RQ$*LX)WZ-cM7VXwPE7U`iR|I1$KWGK{+p#zg;_CP5Q2n9IZDqI!jSxI$i#-Ld-~RSwskc=!o|xKHrNRT%b=_753-7 zUd#gkf36Cso?hw85ImX34^kj@3-!+?o28{fVowKey^ut)K&{C?p+S{7Mn)5Y#>}za zyQRIyD-Af^IR~Wh?;fPm;hqwW`3efOU9Ec^Ryz|6efc>?rwN%G;CVIg-`AG2 zZ60SSwzkHMX6A6nrnhLUetZ^qS_oK{JM~#junZJ&ekMmtL!*JTv@j=%x934A&ZWI$ z3z<2aQW*5XCi-11vM@(O!whDpQ;eaqf?Ng*T&SpG+jx$rqw#GM)EitRKl_|_q1>)D zve0G(u@^LtfMZ-rk zEFEmi1l}iMJ&!3zRQvnC*sXhzWvN&x(l71~O@)q9=02H`kds>-rJsyus?W@PA^&*& zEUT6VExaDDwEVo}^ZNLuZFP5Y6OM@d$%97`n<+x)2AZncG|)oL6HpHH+xw@&*sZ(V z5yYFjjboeU3;J4Jz9&0XF8U~4_L!0)2*qtdfq?9(q)!5AM%tu%e6h4V?^+B9DGpe~ z6nBg0f4X;Dml3S;?p+uiJoh6p@{(4J{$1`rfgQIxf|c7HXKsN8>sfB%o3WO{a*|b- z#XR7wW2C9m;-m78ut*QlX#B^!I=Fa3_A+g#HdbY+NY$IF#5`|QdB~+Au!I5&El*-7 zJQ5dY{HIVkdi>mn0kraWrqOzC@c5@t{F7J&o_|0%%tku^(}SEvE-XU}i^@nW{-V7C zekx!6&xHkhPEV(y8dhnl8dMOlSl(@OxaX5M>PuJNSsMLUbXRH~wmdm>OK?Du_hM7^ z0cx~NL#j1e9{$CVPH2&|%-G5bwC?q!o2Nz)SV8emBO@1j9m4?bK16@Xc=m;A8PHiv zYm}+3!0Szi5s9Um$BK-*dLlj0iU(AE3BdJY&S2CRSat5LYWe2n|M&ig^`E>k`q&`y zU#-MP9QW&c-2*Px()QN>o3+?_V)fisyUZ0@7;X5EXb2UiANSK4UDL7#!Ge5O>P0MKr+{w~7U)yu~4f2SL8hu*7KTC_@bR>Ol!!jc(T z8Ag#=x?V@TBoiU`>^GcW`2gfUb4x*!S|jRJO%nM4^wN2{xNsLC<%*>qK!GM|DO)2< zfx(D|p%YN|bmDVqL$_Y55>1*O9!^17W`SO8m)=M}t7`+H$v&G^mcC6;!?oL9sU|6a zV0t;t)GQz!>b{7+J|yBiiKysD^XR6Zf(>Z$H8KBi$VCB^!qFRKLmSdHxPGtM&}geO zhq3Z6+1L*6)yR`X zq)!5r5DIb)1b#2snO79Cp@MubjVf;lVZ;Y zf1?9`90mk8t$iHSrcC?)$+Z-$gwckj4NN; zmPVV2fJd{;A-hN;B3zHGCcV-n;af#`zXrRdE&%Y`s4QvxgKAEWG~Dt$77rf}XmW#j zWCtCsfsi)6QX}1`A-pC+qeY@R2^bXXslYcQvV_y1RevrC3FaSkv^-*wRlm5@Oz7DqR$cz!LQZC1qWH72&e`H+fCO zt;#|IluqV`Cqf{1o^2=EDXIt3x zQ?vANJv6!rG1l21$e-DF{>-j8yZaZByEZU@r5uHn8didYSSPfD-k=lsNt7=+k;R#wNHt zx146#xs@xdaXO-*>*QO}#G+iZB*RkBlv=3wHMqge({l9;IdxR1xa^Zu*qT|wq7PoE zWqzu8K!GHE`fKIKtE*TWSf4iNllj4vzmjI&xgB0V@6KNhWH}o!56{hook?S$ zP49F`&r*U5EvjnkI<|v*pZ=OlK6Ay#I=QZIWz`wo&?DiQkhLgG_$kmhI%`-MVy()< zIoY37XkH(JxPG^abtz!{NSpVtO;vN!xca%ol$Gi`~6^1Hehov zAbd?rdgX3F^yAHb;Vj|bj)=N^1uh) zy}e=~Ux&Dx(B)`M2Zqe$zG5VkTbONaKENH~c->R(cD!TTPc!3pOE?Pfk}wP*3a*zc zg21*@`T^tKNKD7Hf0zH0b{($s`C`4!G* zU&G-;aQ0+i3s>%*d-+!Y2(dxY*4@~;q426H!N@kA_GPfNEKCx*%Jhiu2_avKcP%P^LJuJf zG=3FUl3We}Aj@FW5pxlD#Wdg5GhmlUvxE@5v#l}1K>!2Jj~LH=xRK4+v~|k^L9kH+ zs7w$y>2^#E3z^U0$4GcI(r!ITPJli3yZC-Ud~z2X_6oVKWexa1Nml^2-1(|9Y-Vp_ z+D6(UOoJGTE*7H*ts{m^5b!SzlXCYX-7Y-=D;B~UDU+3c+N!|tnWD?KIi@52x^;Pg zWI^zP0ss)4hJg(M|L_I9*igS4XoWk1WfaU z(@FoWbx&adLRx2Gl;?6R-JI5Gg()NZue&#EodmcJEUvo&}y zU|9{V&ocl#{n1FBIi3UNw)hjD+GJT`FKhuMG;V|#g}gr|4WT|kko^uXdrCDm>J4Kj zJwe6<1B`0=eP^r`PX#n#R$o0?d4B2%%(1H&K6@J&6!hEWJpxx1edpk;4M=@;K`CRK z!6WFros+k*L~rm2e|E{#cnI>rt%7TY(YurdN54!>h{X4&|mcw0~%0P;a+BL zrlpMuu_Z508cBq9;yI7_6Gu{G9ub|y#xAv3lTO$+iUJs0E&vjJ^K%SFsYNzMkwMEF zsieX=Hg};KS^FV8LN2;_+#y8fO}#yymx(orFVjmv7ebDI@eA!G>;dKGR$kY-uP5%8 zM$XRhy&$a+EbLM|VW>2e(346=_NDfwjs%*>9zD1J3*oaqM8~V zQVL$=h|0BWfWvVO#OK1-ay@T&^hc9I(xJg!_QIA3wmCSsz^_~D(Xb_G@4+J6XEHU! zjtdCg%uNs6(_Aj69%<{Th=uT6r>|*zLARK_<3%@!Bjdn+X301-VqQW^SQ%IWk9wXB zF&k97Ab|33cp?Zfl~eNtqF`Zu#}s$5IXVP^I7-TImO*fEsW#|RGN^&cHfqbC!j~?a z3*XsRshXJL$T&Nx34Ac#oX>Rb`pb_R|J^|IovZ;h-a`~U|99rk!+QA6n4*&=lMbi- ztsSO0q1m>xHb423+>vIj(MY(nzMq<9xN3k&zCz~f=o3j}=Yb~u<8a_UXR-}+$8xx$ zZsu_QwI1E3h4N;`Uo6h^8e-KhXVFh=H4cV-2{0EP-NKQOy9iw8^*hYvC^TX}8JQr- ztosgXF4irbhCAE<RX0#CfMmj=8)FNEzZHv zq7D#++*b3E;x(uJ;0kV1SLGl~gZER~>ezvM=iHr?EcmBpLBhsoaPJnw;+ZlEid4iJN_fWTS;2e4xayRqp>k_r$=y7&1>TqZ*n4}|2}(Ar-N*9WPdhx5+y#4oT)RX%+w z8b6%Unrz%x9G`!?bhffCyT|*gpT5h+4+}*!?<2(4k#% z?M#xoxJ5;V7waGvb+S?f`9Imf9J?x-SvA_}FouP-?Pj7q`Xx(;NEb2LdJH1Yz$ul<3wZ3fXjqdp$yVfC3(|8Ot592|=TuE} zwko2Y1(Wm%wxxKPefABjUB?733P&B^Uf_XunpPDe-z6u(n`4)y@R_$))R@(5Wv64ArsNL-cGSxkq?%dVHCfGM zYXDVJ?M)Y$bFJAN6R^%)Y|iYK<~Ax@=wAwpPT+9wJ~&Uo6kvJ1N73}_``XTfo57`r zt|T%@T*ZYz%oTMrnH@xE^RB=+&RK#82PuO6b>1eAQ!tF$7OouGo-0aV7d4cR@KaRs z0zXMP6VZ2OaS+!4T|nSd5a|gxVM06+^8y_IQx!@U#*J(a`oxj?|dKF~=wkD>`m@BAWY;^9U_j`rxo83_=}t~MDr}sy z`M8Op+iu_&vLh2-DnuKzLMwClVe9%Odv^1$y0R9qv=D0Yi-pPD`-aM|$gI8r&R>!&1@;E1$1f;yaQs~|V$#=1_UO4W#C8^|*ETeq zQZ_4RE$Wdru=Qaw{O6N(-?=7)8Y+t8%Z_AW?Wb(G1Opvwg3*%8-S>mFD^+cN!vPVr zleoUCFIj$5GPT<{`}7{C8ftx$BZ5dY?D>;|_p_uBzQ4(KvzFb;${r7|@ANzJT11hq+zp`sa5iSD?hjf|3NtQ@^IQL4%Duis?XPlzp zn5!uV+;1V@avDr$L4;S*Bz@!8T%EH-^%GkTfj*VpLcigK*q*;hOa zF2MyZBz)17+)OF5i|DlPvLtW@?riHhoNcf|eaillTP$isG}`D8ekaCqxqB!4p^z!s zKKgxq<#jWkc_oNfVjhNd{qrF@3I=O3SwiMlQgS zDjNcX?>9SbWCKUD`;Qi}x5GJq(%>q8XK}J}`BDA7@bgeJcSh3}Nd{^6noYO)oSl-_ zZmc?2H-fSV?TaL=H@G32(@tA~mm+RyX}b2e$N=o+zgNevFW6y}F|LvdotcqwMTA;3 zg~5cb@j|&GwR!6=eT?_};!ir)=vBLe;+N)rcb=VD#!nz1^55{H6P|Fv54NH45+q9} zh!s|JA4c5{dAO8tdckW#ddPE6+c8lTet~3m80I{ z4SIt8=cxhC)seBO*}YRWc(>JwQBtu*@%>ALU-lSu%lU_tgFVV5J@2UL=nBKU!!gkd zE;$o$Y3=>vr{{|exYK6O?a+TdmNT8F(;_l|+D>=Dm#+|95$xWmV4-E+Ih3kow^1KS zvW-($Bs6Ofl-}zmp*hzr3jK|~g&yoOz=kbrQ6ZptN@j1cDpmeIssPX@{R=y~r?xL? zFa-lJC5Cs+M>Cbe%~j%9DmxnXFM7}gjKAFFJj;b(Jt;b*{m8wgx(^Y($Q zcd$F(pvOlgxZtKxJrT?FOA<^9Z^|^bTGL*+C3pG!C=5bUJL*n3>lZKlU-)%AbpZUN zny>;{De0Qooo_>m7#||o{TWVq^utG4A$$wL3v@bamq$e@{`Yaj5{*qF3iUt%i;_*O61PX0fy}S1NB*^4 zJxTpgOnh+bcjk=ImPk|Ec$xJ6hnN|EhQ!;5E@EkZ^iuX&Vp3w5G9g}%u-8q>diC=4 zPRw6XNt*$Wk3N40VWI(lSSMFkPj(lYrxh87KBHe@e^oN1N!d#{2fl68ZI7(BzhYGF ziL5=sm@_6`oeKcRbbz-)hiF=uRHUw*AREY^k0mA+&Op*^~o*y|K4f^!r zrip731h+0+j_54#WV6Z0dXwMbGfZFKq4V%^t6;|{n~2uXEOK}a;XuA2OqU|H;s$#u zgoVKu!dSx7y`x=fW5Qz8ljlTkKZ@yV{jiS5 z^u@%&ymwkGVqwCCBNg^gWv93<8YL#gH)e@B!XF`Hg%sK-4+MgIN^r~(Mh5uQ_weyT zVlJnu?_18VnD{##n=GQodYIPMcQx824v=~|^z(9Ho=g{VL=W!naCQce zC=;d-o3b$kYo#&u2`0z%*@EbN6{qc}uM@i9*_mSY4C9(r_;m9oGROD`?-z|aF@JxaMX7y{wwdGE2Yg5&O98;??nEWD^GfgEW^nNRUI6%5<8} zS1UurxEirZ=Xbw2vdrwZdCa?+k)HI#_mbQ;G%wzZAnkc`$G}f;v7y-6Y0O;NW@83R z*p&#H;W1{~-B?g~nAqqzHm+^B4T*PR=3pCT<28X9KvHO2MF<`^0y-qQo2e(}cF`?+n>ki%jNCIToe>JcEdr~UlU@ynjJs{XO zLOK`-_%Ytc=WP2vID;+^M`V8;n@FnM#WJIdnF@aScQ*bNe;lJd3gwTeXnELR=XHXe zx&Q*Cc`yz2mR$iiL#5+`cl_kLSIPZ%6QuVrs?oiCeFz$hb_t(R+?VB~WXmeEs#rBx z39E}SMl?#b_sNdsWdq2QHlO>vH5HS%gyNbTw7>EpUy^W3!nev6uI9Iu#A+AH@)J!~ z>IfMN$sgF|LQhETT?O6}eY{=xVz=6w)E!Lox&Z+WUf@|nC5nfZ@;2xRhT#X4-GsO+ zu;<42`2n+**`q)M7 z>ermv2dNp4k11dAJ00m=I8Z1R{UNB2_#3V1cr@9vkWa;ghy2( zp`1ytg3$k^j98Z^MuDtICE1X~fM$gF;ygUIKAtJE{;8E_0EgmSwc8SfeGAu;97STK z_=bsd6Bn|RucHG%{n#y&YOKjW;g&ODmZlGKi#@U>Jt^Q0$EB&}`Z+qEw3Xj4ay!YK zp$Mo3%eO10jm{a@3B_bnT@Gpl!vzHtnhljsWL|0z^l(WH?IjryTFs! z)6rM6oADQf+V#m_54^t*87N?uw60KKJa@K03w?hWx7hkf*J%_H>5YSQ$HXGT&+xU` z8~ZH3{u159mZC+n4@uC$a3D!cDcOe~uoqV$8~L8QjQ=y`qTKhh9wuY5%X7jJ1k7M9 zE~oe~PCfx?Wwa$`mn>FXrWjF6qTh?n;AKhtWP@Rldt7trg1Rq5!L5n{!Mxi?DH`yB zUi835l=4zaPFHKb2TD!fbnqzzMvbNu9!7}-D{o0ge0a~_s?_XP$_cgf{R+q!oYJbP za&Te#3z3YKhNAfimnu%TEV+Tb(}7ULFVy3_xhw|vv7?fEa(S-TY-Z9ya>k9?!_s`W znhs6(!sj|TF3LTO69;Jm5!NEQ+6F^+2iAy=>%%0HNpp}=+@~lN1qM@HGW4uWK>X#g z*3kp%8oxJy9g{T`R}J0;qGM)oFobGfMj`k&EplH}4;Dc7uuA3QCY`)Q3+DQ=>K3tG z{!@$1Aui#(Fj=pP)wIJ3&3mlpqkRQelGX9GkesI@{NsbgM^J_erDx(%BUq5txB#??|Cam0=FtmYya8XX^D`_Hu>8r(Hq{3E6?!sp9$Xm zQ{moCyg}rUAgFdo2+y?R>h}tIOTMUa{_D!tc(OG9#n?CVbu&P7A1)QfM!&dtFG{bo zzvmlOm5;4mA0wKBgJ{NB_q4;NAORA%8w&K#1sC_NC3gB`z2vBDf_hb4VO*)ymHxe! zw6BjSEGpHMVtr)XgMR2VPS8JKC}Znc?Gwm$Oo{XMoexp#@!`r5B!9NU zJ#>{S|4e^E7SpV1kz)3o9JI!Dm>L>@pFHcfMTo4-_=urixpDR+V@CS}(4;P{o*T4f zqOwysknULBxO-)UMt=htA=;_imz_?Kb+2g)p zU37T-9ugE$Smb^Q*7dFYbhyM~M~dtL%fbwm#2~Oow+{JlVNaZ9oyIT4UEi=ML|kGo zj+Lu18=J(i-3}r~H{w4Hxq?fA8BSv_ePZJSrTQ+9Sii1(4vD8BGY)XtA&|xp z5lgG1*`oWCdCd4KYDw|#cT))!N`5O~Gu-^t>8K>vC+=z8Em7LFToo`BwT`5Xs}W1k z1ZEvU@=FqkDq!*KTg<|kq&y$F*Jhw&7vv(Y&_}hg`jHdVA&W5g1fStS3VpAFG7kzMY4&H5;kQ%uQ zA03GDuDjxXTGE0R^#Qjn7L9fCD*+QZTTsY&0v`@L-xqP-dJfZ@< z{&y?Vr3O8ELr6lTt>fD(=&r7=emA4W&gZVg+>_#c_CGx@$9O>1uTPOAD=TMC4))a7 zLzaIstF&x*i3}O?I8nDQLt`~lfA!+dMR1mWxIdKGE?us9r|B`w#XIm}$tyi0nj}+c zvZg^pDj%v~qbrKCV1Kj}fe9X3f-jjDTN+`SH+J8BCLtswREJNfiQ;Vi#?}ER`#DK@ zr=m>DeSdd?8c~nUbOAvO*Ja9f0}csCfKu@hwy5s&$5rD84AxwiO0Jwg+V!!__KeC& zf}f0fl%_kaNO*$N?mCu4OfRl4GFkB+P&C#qNI~=jWd`5Q^gqP)Ng^nofaoj8n7PhJ zO%*{J`C5DD5lAR=F8n6(1q7Pe_R~(14&TzwN?j6nbl?Q_gy@Q(GCR z{UL8tk19ftp*l@9EEg2%_rf6#%6J{Ds@q9$gs>ELv_BPiCXMU<>X*&X?VI&KGWo+9 zws?RdB}FSG<*YJGjVIh;y3(9Pzv>>wN^=>dXcAvCI5;Nf{F|2Cboh&6N~JInJTr*g z<7ndXfhWKaiE={qQvAL1>yKH@_g}B0-)Wps#jxn)F8tlAre?6|t`*b`_^)^-VurDvZ z<&{2REp!iZ6Lzn^_b4XrzYzUJ%Y~$64vTE2Fh_?VxuU;+w$#AK1oX(3#$lr_VBBuD zW5@E{jO8&-X`)UBA0^Snp4-5Fw_ZG~Ju{E&NTsLESHIOG`#XgF!36Qy4$5i&LP5b+ z!^c6v9o-u^8Z`53+_sk!aR8wp6uxBZ4-R#nRQh`Lwymjk@7@;$-d&9)f-WFb57@0O z$lwM|8%Ql43jU2;j@7n_wd$Z{jp8J8OIN});8O=B% zW~6a5dsx?41cH`clKQIN{uMtQs&=o(Pf$I>AEdw0Qg}~2OTl1@n~Xtu5l!;Pqm)Nl z_yiNBb<1?Rx!+3hO?!p3$d4ZvY3g1(wmG0mW&g(9FR(%ifyN(h6(5z8%Oj4%@44>S z_wwsRu1N1*=ehgZtLWKAjeOn)(%Q>A8Q;Ec59APj2XA$hBx*_bzUr_~N2;^Pzh@pd zmH3zL=#uMMWI8)o&&yTHoh2jOC)A@ykK$bt0PjD3+BsT0&4sfS31fj{{%muW$@SxV zoH-ns4hOGuVwsCOd*N2Z8?~5NPZo~zJIf6s)sH%r^t%$aC(A_!-#1$j*9Ic9f;fjv z-7t`C*tP$#^8#hI~j?w6td zMs$s}x7j5!Lr~re)?0At!3Vu@MAPD~<@E>5*Kyz*k>4TEKY4A_wDEXBNo;*Qr|tH# zLcX(G{_Q|~D^cv`>)K1Or}V6m#&7;-NZvE&`cuw&_u>Nz;JV)_Q8T7+*^Ks6-J%le zirK~IX2oMY^e6p!)D6r}(R8?N^xxujq8kV+gmFAp=qsN;&^s*gEfM|b7nb5zvhg-2 z5{bo@w@v(dh1)9!HHx?#;ZT}T4OB~velw23GBEb;`F(SlG(snP#p+TO? zigLzmdAa@ybHetsBJqGV7vegLHN>a*Ud~lsrb~*yfHb9=wW7~IdJ9FWa)BLjX{&H) zfn@Q$A)T^<@@ZSakz|kMC>I^}kseLz*^^6T$cObKCZ@uVN%RwxqF=iPEZ~v@B#(}; z{~rK=K!3kU{n(#&f#90aeE<|F$I^@kD}Ez}kxmNwNz^0`YOry$uBU{%gI6SBV7bE< zI@D!R;+SZ0q>7-G_N-J0#IbfQfrs_9Cq|hitpNV;1kX&;SjPf2p3LQH`NaOwcoIY0 ztZbvCHJ{Kk=}opoX=DRi)^6rwzxH2v@|)k_>8GAy?_GDWP^q|9BP`mq$(8bqkIxfX zmt$tLkjW?tg|a_ECa$6Rc5bT@N8dT@S9N;xhQ!$jB>$odk5X&3jszc zTAp>9@o-ZFgx;=60!#bgFo-&g;J6+fvwp>qjg)mgf~Wv7hCmrI{=}lhzM6y2|VCx`Xbp#9(QFuv;-P zH_s2_d76=@geOR)ii=dPS34%XA>@J#p%K^nV~sbSiiEb0xNIT( z|H*puAls7qzVnlr=bXD$-P&KhwfEQkx|@cErd!a69U~AzMiLeyBMHxp#vx1gY@RJ9 zJaz;zw!?OW$1$TAImQ!mNGJfAMG_JMA;j7=G`-UM{?>j=?YFA#cFxJn`6GXs=eFh# z5uu3J?^WGR@WYUMYF|Dj#SII#zNj_>@A6E?W<&^eYeEn6xB^(1}c@ zL(ZSOK&Iv}4!oPvX?Hnx^eB1TCbeK5Pc#)&md*!4g~Fk=_;SK?BzwMSX!X>Xum@B& z$(N&wF8(4i+%av78z?zB_!dbtf-0>6m5n%y!!(`&A0#Z8$9~x z!@T9*dl~NS&xU7Zk-gentpK;|ula_#p|~kZ#SX1}o=*-uxV`A}4Rbj~{-3ul@NS^WgU%;O^V+ z?oFY^KWe3e37?^rLdnZs z6Bo{dDxL)ja^=y!Mq#LZXe7wM+whP%vEL|+_-RG-CYG#-kkd-mUn*(`!1y|x)J|i) zqSc+F(;ibEj>uKc<%?HXT3Td$Fk)`5LzWvB`*SSzx{xc5-Fg!xW9EAqs0kFXys*aZ zwL=DnBQ^%xJoe~Q%t7N6%YdZ``cuNrrU3Yi;OxLpgpWD z^hNyQ8!w=iRh|mpOBe}Q>beZyp%Av31%Pg5WYM(lAu~>;{ZbaBYNEPB9`4xj$crT} zy(8`co%m&h(dQMJh+a@G2`s_^NRmQ&c{#@iyIj7uiPx>5hO{LM{bkmU9zo|aMi3c) zEteIZgno*$>e?!t)_4~Vcqbz#FMm!`3yUz|rE27%cM7d++IcFa@li6Jh&)QRB0lOR z$Os3pS5os^aMF$_5f;@-{DKK6U{IQHiOCo>3F&mBCiG%w@G`>6glrQo3WC{Q3t`4f z^%@nKV!#cDpTcMtiVM~73o}3Cn-Uv~*I`c*y9kx!@hXvk5UNTXg~bC-E69XU<8-6W zQuvw9r%_%g5y*G~KNZ?%$&09hHAjiS#wFC9*aT!O=Tfyz18b1;&1prg z1z{D9k{Xn?jQ96gUB8ZwYE#s3P>y-;hd#h(Kl>$Cj-KG=>yM*z&-wE&Gp#CgJE!dn z%4$MxU}<@kX<3Gg#DKOgh>KiU16cXpRPtsvd%ARq#O_@islLJ?Yo!|rqngu#grg&!Td(MN?y6FH_*u<+DdPk#04l zdujsA0R_1Z(qQAl`X`ACmBSd%RMs%Y)-rI@GydFQc(>k)ELfAtPOCzQG|Hs)QXpD2 z9O7IBA&w`i;YAoD=U%R&_CbL*VZSc!0H=aSInydt(Y1rDQ=kfsR~1=q7#tpQ!|{{+ z-tYVl*PS`e={s+tZ3=d;ZP8ntr|mOFcF0pdd6*kco!}q+*T2p$f9ym2;U9j1*ETmO zRgeGt-~4NCzwI<{ed`-3CnKo$7#v zFr>fO15*ilO~%|-lzeW?Q%^q0_a1nd^E;P$;KvW~_P5<5Pn@4oB{u}3Mmk@SIiYh1 zNL0S`hzJXNFij)3jU%wy1hru%sz9$ob?BTU*O3-s1XdfW%}NwuMuDbgZ)=CcL4~nh zv^Mx^!ph1q)>aq51p0#&+5ODD7u1Q&KxE~hP^uxXsALOiCODOc3{4>wQ57%qSe47) z&X%W*Wp@|EMTd$KbxnV`hz{)pDJSC(G@15*c1;ngO z8g(IPBrC0bmaHNXk){R0Eq|x7p?Z`9FFZU()RaL8U_?Zrut7|uWQ3rhwqoX1Y0Htw zJxXj0I*$5Oq-Q7*YRI_V3rA7*eRUkeX{nf<$H$tMfNIfg?aMIzc*b#`A&=ab5yvG{D{&*M;^gJWiV8CbA5 z0PE_o@Ae{a5sX*7)SQk6cOS1n>39Vc;dLOD$ml%!ezg)HdgP4?>Bg(ZY7yYwB7*Xb z01Necd$J~UG(IZB6V5tzds>Jp(M&H>52ILIT14m2$~=!f_$^+2?kDJKiXZKxGtK6~ zK3i8d7;J2F_0kpI@wT_Hx;%&Rjtl2s=FM+<1CKxX9EZb0ur$Ju2xpra?P}k=tH#9% zNhn-(@*e7dfYfS6aAt8@QTf0x4SwP9t|%k$3m5pjakb)SL`_yyw$3}e371|FA-YB@ zAiirWyw<=r4&!B`L%C@^R05Uo@^{AHD6UhYFizvs{ugb)I-yI2Lf5EZE6~bQ$dn-L zA)VN}>Hy@*o|o2Bu&WNSu1GEcxqA( zIse)Ps9RWXDDoVGXL1(`n{Ij$*eUX z(kmi&AUv22Us0!nFA?}>sIW@A1Om{07C9d|gK^9jz7G@WIx37*;usR|$!sVZoQ@u( zZ~!~)1pFO#4<1CE6Max#L>b|mi(XTwW&|`!i6Yb`-=*_S>WM{B>!?~zs9{MbX(~BO zIH*LlDxh*2xjrt*=ZzDYs+K?Fg2Ke(3`Y};GH6*ZXf%Vp5eo}*eBzV8#23Hx zM_ju2B9|{-kV(9(1w0@5#s_>;Anr9??3uD-g~Cw8Y?VPq`0v@ z)>>g*5=f3RcGjNKha?^2w8-k!%!)MZDr=g+0WBSR?LnKM5DhB&@c9{;Y6L-zs27R< zb}Ycc*;9HO&Jy2jRFL!xCxx?(#V{7@EygtOXxuZaS^GrXb&HQtNeYH{uCZ8Y4b}y3 zrm|8rWgQavzjveFj<{rbk zBvTo=$?(e2%7PcNtSWFp*WjGxU^HY}S=xC{p$)CVa4?=wyO3&BHYrwCOPj$CCNSzD*m%@R35 ziw(iM;LB5DjJF=aXoW5$?t-is!h={xMrtzNi|o;iAQN_8kZJNVM>U1>GqV4`n>6E7~17J4R?1;ISWUTgS+-RcUC5qJLvxu0nV7Aw(>h(e= z(UIC=L$|6@;y{d=k=P_zi2ImAKzMlkIkiBV)NK$gV z1Obb1JOPZORvs&Jh9EJIwgC|WVKH7MUzt^nxF>Zz2(C<;08N5K$bL)?a2X*+yj!IF zXq7@NUN>s2##0KN(NeRKWR9KvT~?1Q@$p~&Sr%HqLcc%Ho8NFJ*RQTJ-zq3ZyZq@N z{4VwU5JQ@WCH2*KYCiA9yF&iYvSO4EFb!PKT7kA$Qzy8y3scPd&p2 z-uEs}tj^Jsz1?6`)9JNP2ZxM@L!ku8B*22vI^bBuCgYU6w{nRT8eyhN=R}N)YC7{c zicj%Jq5u}RDh^LBt-RAN*ou-RL5H|6d0lPPYgkXFGAR~aVxSu3Bnic&;yu`5tY{0u z&mZVR0>!r)MMYy5ILh^-)uSH009WV2yUDkEYiFF}as3m1jaU`$S@J;y*D1~zPF zc&`J44zRVy)s9Zq1!tL76@_U<8#?#heHWFhaXJ&ly5;2;&hp3;PXe&AyvAGJ zdM|H#``gKM~C~tM;J|{VGrn<1-Z=2ji9mcp~8<6-Wapv zW+*7m$MIw!_{RhZjA!?7oAVbgk!SN5mto5>^PM?P9a|@BYn&lv0qPmbh*M2gSz@3n zPvxvAuSBaUX85=taVh0MrF4ZXN@%?cA_pg3lw5FDRHVs5qP*--q$48whkP;;yOb#x zeul_0RoYYJ`u`V!rDv!!!J8D!vEDfuV~XTlDQa1|MEbSaVP%OUInN-gEi$xbI@h8wF~x)`+=e4JNl6z#nw(-B5aN;%LzO0_+8B7Ud_ z|K*zsI*11}wIwiU9Tf6nswl8&%7{>qMW`@gbdwNWEf9DJi4{{LXAF6y%*Y-EP5L z7cQKAiO+rR^E~wMkFl=ARW;`~_ju~1i_CQu<#5FQ?hco)Zct4t@P?hu9d5emM$TM! zf?JOE*%<6HDoadm$h9GFwV9R`-h!40H>2Y`APVBbq{0gR`Kw5PPRl)+8l*sKp&K%BHZ!QX!5>dqr(4TJ07^rl_sKI?dU$ z7r6bdyIAb>Fk?$Q3p?*_k%M=%O@^yNC;saB^W?h4#A{AmcM~_Cx}GEbRh)A;>!`{p z9?$d7KM#FFmK%;N9i?qLs2ZS@1f$RazjomqFFySOt0$KE{*NERS;ygc#2t6t!$1CC z{wY8Afe$g=*yg*BJiveZkA9oyzWy!z)Pbv-*fu}2E16w>qu9Q-MW%EL=?fpM)6Fth zB0;39ls#P7I|Wam@btV&@MN8gpwb=s8r9NlZf$U7bC=xo$+f{%Q`VM_a_q!0w6RGA zr&JRwga(uOmRZg;F@EsbTEF@8qGA}e0)V_IJ$Lvr2+NP_?|)a=MjtPBx-h(M-;$W6;$TZyDRS_Py#l%K0v z5sG{Wa>FFn_CS#Z!GO4HRPA1sli1FZnN1u9v zJ8w9_;r0f~dD_6OHy&ksu*I=s>vZ}Zvb;r>&Ex!tTx+bY!~U+WLzr_UODUHUbd)9G z7L^a(bQ)xdN;7iiqYZ(Xuwm^4nys3|TRj6d@JhzYDVj_sQObnfy9=XfO^9GpUexV^ zFf_gi`_54)XA&-QszT41M>~WM+6pTxnkoX%WeSigKUtz!8L*r9)2f+Jafv1~Gd>KQ)r zp^xy95B?1Ad(V3@wjv2JQV?$V62AA9Z*b=RH?wwp3FX@eE{Ygc^xUg2a{C+3@a6yT zIsWWBH4i=g1V8`LUm(xgeDYU6$=mL^n<9hh@PPm4_rK2vKKRpYTs#MOUcT@ecc?HG zP}a}N`o(YC+=-i4HbVMDf<7dGwir7j!c4GUaaI`7ZZV`Xdis2tO_4eM7P%m++>>XJJY7&Ahhx_iiyFxv&cIqqfjHSa~+Mr zyndVf`j)r22D z@F*Ys=m$~N1f?x`o};bj#TTFFCojE%Z*^%+E%(0b9b9_pWlk*^9{jV<&|Nvf8-Mz} z99cg~Rl#6)ko>C5gsz&D7_A$Qi>H}Jq-+K!0mv%tzh)!Wj2!e%KC9;MlcX0J*GJHP z)S0;$n5?6+SEYm)ucCcNibLha1`>Xc3pY#q3iPdxl2E2^g7^Qpq@mBc0Vay%n zVG&po_UU!_D`HjU)9g$d0tvR3wL#X-$yzPkXpC~6@o-FcWuBYQ+{E`D|307p%dZCT zzW20sL8r*6l;Xqhdlw&g_ub@XhtGWWcUV7u3}bSXx6F0g2s)I$$**FA5ftjBDe z+u$qT{x-k*Uwn$C_8dR>&i4V>m`?E~a64o4-b{JOteWoX#x*kSbW$)1 zY4Jnn6U74}<@Sw0L&c~SW-C7FOj0s#BM)>Ry;gIWsd}xIxE5e z7sk9c`JRjd|!d6i|;sPMmpI%7$5wDMsfmc z6eH)cO4G_)C=-&xtqcCN7hZT4TUR{#@Z4N3%JewD;vNssBdvuHC z6Gyq>y6d?0_S-SjA?4(NAOH22&~u9%x$z8lzTqBJ3A=j(Q4cnXHYGNd24o#AK(Y@P ztBvtGjq<{?CB>tPCVkt)?+CTs%Vfa_s97g-Nn_^;j08cTDVM}V0hJgDDY8@YidEr% z`mE;Rryk^iAAFa`AAKA@8uBymyq~#t!N6Lk*5P!;^{cBq^3-$8FSJ=|_vn;UZai|7 zldFsLdOdunpfZ}Q(+#N^)?i&wRjw}0acOhFpspB9#*~vGlkowyhOu%K@*FnZhY2(u zo#YmYu#!BQQh8eE1(ha>W)*T;jSs=SO3%EPJ_d2?q=?R#@e=#jhb2e5Q-BGCDUubD zT1vVX(Viuor&b6%N^;b<`N8Bmmfp zUozNToGBzovAK zx~fqq%BrNUYZe#g(I|HI4(PNBd{wctzr)lI85|5ba`FalyZsKzNy+^DB5!;1PxEJA z{Zqd9<0pZn9V@SYF8pQZUZC~Hoix`8kK#n+fSx`?kz zNvfY|24%FYT;xD2u5E0Rd8t-xBzJg|lv7bGVr20eVZ%;Tlje01bPXTUYez}NwX4^d zPF&b$c}IcbUu6Ya001BWNkl=OSsGPr`+B}V6j+owj$$jl0^O(*4(6|ZI_{zR}+_#VPOCyQz0 zS<`XVJ~BO3Vz+8p=qGywKAHBtQVG;-=?0_vI)0^z#f`T0UCOW7EWYYPRUF` zkqcwig$1e7aPH-ouvJC3lZUvQYDi1x;7WS^KC4TMterT4Me*z-k28M{T)J|VwbdnB z3tf(6H7{Sf%pZR7i`;bjO?>K8zsb?{qj&}Td;7BEmJzx5RZZ-Ybwi%fUSUOi6EZC0 z#3`18Hl@kL@7UpjYB1(vIzKxzNb)k3Qr>GKcqqWEn~NB)$%~x+e3vYPz1>Y-dHyGS z>pS1#k!PQwtZPQ2G2`KsXJ5I(nVWAwDJaVchlhLQre^EPRZgy*=IpEIdDolHaPx^} zrp_^_YS!kLX{nqsC7v4RrW}kWT--ijGB{*!Fy_kM4qJm=Kv7$po>3>XkeMikAP|eV zSMTNj5QVEs3w#xeGg)B-3|%t`i)#z5bg+Ag?Z$}Z%EvvUj4)%6Tc+b=Ri~m{OMzXP zc+Q30p~r;KYuRgRZ)I;R{iId2LO7djl$BU7wCDyx@e)1Lq@vWz{=Bh0rQw4V#F;RM z6-v@g!dSDCh_#K~Z9edeALi$O@gq={P|AU4!5to==ey9(njw~wUCRt*DKU4g=fSUh zkN@#sewwp;8?3CY^0(gmAwK@mkMSp8{7?LM|LcDbgDF>Eeh$2)^d-jD>JB==g7(9jQ1uK3w3z@Ya1L9QS$8ljGs099NU|_WJ;*+UYjuT zi+CPC8xIpM4;{nYwUWa%5D>Hvqc5ikVXAe>YnQKLOO5shJDo5;zr?X)C+V~mI%{@i z%FpzudPdQx8>6w2ot$;zQ;U2})p!eI=&wpujdT^U*76|s6#|E{TKqSSv_7P) z=oH!Fd@v#-bN@nzjw6omv^cfB_>GX_LC5G8u@ZRSd=W{_DxFhCGe)nZRKurP?Xs_vY(X`%3)QMIFlWkB+9shojZs{Lb%))NcRqyAdiA<-Xu^iZA&=}OtQeRB zRmY|8G!7za>FT|Vmf{Y|`5^8wk{qwnr7AN27~<-EdXQCwYKubI$u3jRP%~-qP!8 zu3SA!tE-q_nPW1Zva-5HH5&8mlh3lWyuixJD$8q&ynOC5qsfG`ue`v&_-FqUcij0V z{>#7rU$J_mPgTOf?m#**NrkW;Z8C`v)8b`w%@|YZ8KZcd$H+cN{G%>i_)R=lgvqN2 zZtyc?MO2C%%ESg0i@4>bMN9@dbG-P>BfR>|PpF0mw6$Ta)n@y`RZMSzBgc-i*BNth zbBhzl*O`vC818JcyFK95SI=?x-DfZb%rDN9&&^@x`%Dh@$TEd5JcG$D*A7auqRnJv zdF|RRON&dmgK;>gwC9$aZ{(53o}nC%f$WfM8T%BA8yaAQMJAH;alL?o+;T)rX*G@=YPGx%1t z00AW3C;U8Nb!5f<;H44pqLm0ETq}Ea9jG`0<*c>GcnivjuhoQv7ChG1R8}$9TjXHx z03&6=#>Otb*QOdB;HE=HqY*{B#dI`bX?cag{vO?8j=X4zQqjGBFE|t2O$H}#J;Ja2 z`p3EBO=p;tQ-1a%KLdwTj;yVMuNV&Zpq=sb(?8*v3(s?+a}(cv-~oQ&BOl@a{y+ac zH{WrF`|i7kgRLzprO1te!gK%I-pb>zyb$glU-LSjiY(ey#34XcHE}_Xo+g(}uy+y7&aXndX#p~naK3l?G zwH)d`E%v>0=|V~L4IK_lC(C**^Zl4mpuCe2Bq9=Na?G^$X`Go}cn6sd6=E$HQ!PHd zOmgRZLk?~(YXWY`$^{(vgNDFUb`|2f3Gr$PrgR&vA1cVHZPX5?u6c$~;^Pi36bVYk z#V@Cd!bTT9Ed>E(q?JUks!u)nv*_O(sg?VKZPD=aMbm`;XN&T=rB zf>&I-yhYyX(Js0yblTi_{5Ux^gY9eV?d@{zVw>kKUSzMTDE*j)mgd#-&-2v7-{$E0 zI!8|2%yFoytwfG%LT`o>ZMxTA%)=;G|R@DI9gu3sgh)TAA8Pm7&jZ<}2 z-E3ty-Y!}!%+29jurs*EgWvfpzWdE@anG4EEESr1TC-VKSflALF4A6JqjEI|``c{n z59l+c?Mo=fVddeV-ELE~4fV37BBxSaysE&oxUw_g%GNG=eu>IEOt;Ja;Q^|y@w&ol zLv3L=8ix$Ka*EHPP*yUmA}ckVD-~9N>q_>X(JUm;Y99(trDS(6Q>RkvG*Qq&1rw$& z0mw`3E!r8hZPGWCfgCF# zMA7edsp?ANv0`e_jI|-gplOe)9Xs25WYI%d`_Kgh6=ahgrqc%_24t<0sWXts0#PN` zp2NW*=dWHt>oyr0TU!xQC1$n<%D;7j5*UX}l;^ zRbnKk;bKe~5c#}TK6HbE%5o@~4EUM!3K_k|E|VrR(Zx|v)DGyNltYLpPK6vg9pljA zof*+`aY-hZSP=WEwBOQ7p^Z)cP9Zsj&v`b*yzz2}??lfeR>Y24QZizEY#2d$>axVy zP*`QHjIt_OToXZyMh9Dr5BKP` zDq2)jw!-=f%b4>oKg-UrqBGy)ptp!xKfz=;W<1#9-0mLvT%Y-sqZ~bT6W+n@&TbfI z$+Xk@8Q!foApt~o!zpTL#@`#Z1Um90nvOoaRB1RE1u#~+6yqJsi>qKD%RDbV{{&zC ztFQ9R^Utt(d4qCNaeR4=Y-N>c>G6eTd1-;SyzzD(c=AbhHny3L4k)K%w&!zhTwG;g zZl3l+kL}5XiRpxih_Q@o%kHRTGzDKzDe^#+vf|UN0b5TgRfW%jI=gK&riN4NCmA0c zfP>!RDhIoJ0gSIhL1?JSC5<8KRw8{j0xh&g_WTxY9m;8xH}afEAc9IN-@-e*^%!LY zmLb*=A40~F&$muPXBj*@VO1F$-f3B0Yh|frgsU)U-Mq)jH-26x0w&{i3fv9{TTqnN zqKr2oH%>Hqipp1MqN5ZzDf|Ktwc)N>q9{;&t+@hM8y`+dAQ7 zd{bACm@2j+7kA8?5jW5mus>7bS~k&?0ARYm?254YUbC zy0)~etsQ4&eU+R#`SxT!_`2LQr$Z<&C?R2l@tl^uloO>>PUF+3UD*yBN2_fPDmspq9`AamsbkyMNvsAbWBmm#P=4>#a3oaO4P4b`~*rVjHQX9 z5#NuWq0%IeTU6=E_f;!dYr6pP_O(mmXd@g@AH90o3)fQY1xmDUTBY*9_+Z?RCg>F3 zlK7D(CB$cOizy&?W-gl=9n`{6q>>Wpa-Po@aXMhcgJ?^=|i_I1`D z>yeJWG3{F%Iup1;{M_`+JK;plT8D$f5xxZNyzpD&9$1kXm{c_r=jbcQ+XY3dz!=!x z+D4n4&7B=KuI(_HmW;+V6PHsd%fWEWrHw7>+LO0h*lJ8!ju>q2P|RBal-H)~)jX2NCL%{*J@&#|{ZUtK4$a@n9S`QSqqBvmj_UK12DM@oo!$THl!c0}4<4r|1CLkW0%;RoRi% z`4oduRfDUq69+x~l8JmZ*(j@;l~yBlPd4DEtC$`e#YS`c6YD3lDf0JGLQs1&WPaoSQ>6<5z+WHNRb zIv5u&$MxeUSy);?6MkT2q9j@3Uu4c+%gjes5h*UGFd_AUB+>TiVv2l5qg;}BXCX@n zXJYh7EmfeTP#E7Fm@!*XKDY$bj=4>;&kC~iU{kQpzYcMPbjSEG$_%59a2TPLL|282 zrx}%ph$wC1s6!=cOXMLYMVruKA|KOfNgU8(N^#*LaB4;h9KpG`q!3ZQ$tBZbKXJqg zI7X4^CNaRvcu0J0KBjKCAPR`eOuQB!lyuap8PzptW-Z>VQ1C<(vGt8mL(g7KTSIXrT_m(QA2}GMq{8^;qG$w=rr;)k#C>y{C*18721+*9EdE)8E*xI;=%DO!9 z@Q--snU6D^47j>^l_SU2m`{``6R%S#MK12PnO-lf&; zG4w+Wjy5gIkzzDdbUSTM9P9DaGtYDVa-Z!>FHs*ZaJbuNw6;Q3PdIz&GQa!({w`|^ z%e?dcck+SvyobfrehNR@A0ILtO)0dIkYL{=q$fC%OWrb)C$Jd}g%H#QvRnttkFvb@ z;?w--f$y`@E$AA9%AhJM78X~@Opp1aC#XFX?VPHf((cT0q-(hH+F2fd@>L#r>IE)d zyvnV&pWfIO)NP0LV)x zY-N<0NfLb+S1RqKXfz>b)w>{e6U%{eW+vU!CA6YdvA~tfMr2ynX%RQojc`TiCpPH> zo$RxNCNvg2iV!Phl?_&j=x4U!qP6mKWG?i=fv6MnD~$xDhj4;G)v*C$;cbErC`=g5 zYAD^5yqD8zXOz=WIA7h|q_?=p`06I}ON&hgXdLw!&C=Q$8=Kp#9a# z%$l5f3g`^y6qRl<^$wUq4YX|)PQladRU&ZDn5+C`7WrBzw6cOr%PZJv&0II5qkEiKU7|l{*t&L=!R{W@QO#VdN3TE6nLF<0-uvD{ zWK4S*4LVU+8?Vz@68&>Z>j;L8y|MoTFdlA)a{j=SK;NgD5H~zE2P1AAyvi`!=ao+1QEMMop=$-3n@q$ya`Z^ zu$$8CLCE>qL2{bWZ3r}?G2g9 zS(xiH*xF@zWhJr-8}Uqxe=>${r_0;#yO+VWtGs;n96$Fp@aReISY=)>2r!~{*n2VQR!?_%sr)@miX^yQQqtnf#+908w0xd+)KeC66imB9$ z%mj>DoV3v~bzR{^zhqUQ(CCI46fQt{RE%Q=&fL%h0yEU7Og}H1M4k4=PO|N#i}W_3 zh{6a%n4)6hj{sw(8aaN%TSfd*M1=X6@*ago_^@Y~{Si^gcZU(*U>!cULb@U=f~D9w zc@Y~qD=(dQNfG5_A#Y}Ohhn4?8c)Pc1(JgiP_LR<)CZNSPeH3rlTs#P!I5&`yhLWn zlH59vkxSR6J$?|^AeVaVPQnOQ;+3Lj)i-8tE0?wxqo@&@j-9zA6MQQ2Tuod#ic#5l zNnHp#$}iq@r}RcJ74`elj$B``NCJY_bqp_ zw0@Mbp3rO0(KB;gt9Pg^kmZ=#VqHbv(a_PDaSNS!%DUvr)_}{`4(Kc$#VAXj!_s1x zxqOb&jhIXixqR`Er=NY9=g(fF-R^MehU>WX*4r4}bvsLK%kK7=%U3UQ?zPK2{mQE> z9y!AD@;WD0kMfo`y^)o*J~|826i-N{pLol#8ge)~WHcDCP;?mW?NQYu%HaXey!a9i zKJ+ldX-#c1I&*CfCVRa7uH#Jh2Mh+ATzdH&2b<@3=8+$=xw((Cj)i`gtU6$|+rsFK zR=b1F6s=b1Bw6f|6`G=GVV$Dan`e7}A9RK(a=JxMYh|9B*OoZ5vV_WDW9NXievh`v zDY7<(f_5t-&s!Xp`y7t;aCJplm5j=YR^CRL4&|t#${pI)l5*iiSZBjo<`l;1ApX;F z0u)E4pnOH9^b8>*d!u0hs?{%H{o*pL<^+4ll0-)uYqYiLrNs@2^waA6;lS%v- za)yL+E$n_vf(^ns!5V6Xwn||5Cgi(D!@QqW4NC%xzz2dl-Q#CelMQOjCX0hh?7;?! z*vShrZNOT5Ipttyi*J4Fo80?`Gu(dD4M}+wvlgScqtk2SoMW)J$HLOWObYpo)f~mm zx7>uuG#4&hqUiQ;w&IVz{GVv8%|mV3ySl~a|KiW7TtzjV3a~XyL9Dg3^ESGrW6u>p zCRrQpa^m4&(74)SGSeKkA||@FwH-o<-OOPVED$;c!g{=Xn4yJs+T)C3cV~;MS2sbm zKzNqMv^aKrolY+oNbHOk&PPItYeIkJg7it0BGO;NGB@C_L?jbC8d-t|Vvh^sTHpBg zv=(AX#G!gg9v7vd@fuqpi*#WD#F!Qvd{#~_EGxdLOytq=0!h&+@!*fzOYtZvuY|iP z9bWwRtyGcp7Mv4&Y&_<<)&`H>^ zHeyzz0TBeFa_HDi6wA;=1Vyx$)!{qNg@0Qs8C&^g>>Nd3(KfDi^vK#~We{dzjD}OZ zE^wKpazoBty2PDt`6=G~j(79yvky}KtCH)lyOCRtog~*aEtBCi3=Ufqc|loK7z>v! zoa5d%-_CqdP#P0R`M$;U8qCjkp&DUx* z&pb~)+~vsn0_(?)bL!M7Y^&hH+2=TW=@k?PV;wI%c82@zJVU1l1&+%y9(e2tE?nJU z=p1%z(PhPl-}81>=kgE<<)$26RLrTG!}5^2oO1Ep7FQmhGI;3;4i5Hk(=k=;dFj#) zufBSj+iyS3V1JjDeuw$ILzZ_aa?O!kGe7?tHdh#9IGjvTbSR2Bio&w7y~Q7W<(s_e z-n&`q^~sfHI%ny$b6R=ExvdR6ijglFPN(FZ0#$@(qpV5}H%rQC=&DL@$yzNgU*1HS z1%?yP>Qcef$$?^&OqycxswHmArPWH>uR0a%V^R1l!n-&+O~s-F8aoWyX(78*IIXeL zc^YNVHjGrm9ySwwNQgtrO%Uig7tm;$D26e371X6jL0%ZSpZ6##icXhlJ!SV`8)Y({e)wTN z`+JXY@7wOT_c9|_($OVkDJm#C-OR@r z=+5GUYpj}eq~VZ~NfN%!OO~6FWQ5WORju)!%0+3v3ib{k;-r)bm7EvCgH|CM!Pjw4 zD&i1Xq*80H>>hfUT7lG8Yg0HZ&P+(^o)5O z0opNjJs8`q&@HqN>N4v*ExBmKfe9{jQdX=eu^LSsnvI=wL!f9~39V{pbpl;XX_A9mbVW%2X`YAlr&2WFn zh0R?~oIFW?&au9J7tcNS65u)59I$ic3eP_BFqgOY`R-#cG|FkEc;&8Jcy!T#?EG?pPMYo+}J@k5QilU&U3}s$%%gHrPudkq#=DR=m z0V^vj40iWeUR(fesZ>P?OlB@8<1I$Jpdpyn?C$R}x7cTIe-~>Ny9W~nlaj679iD&r zRqlA>{Tz?+$%4v-8LX)bK=*JNJf&u5KQ|wl5J+;=9NZJIo#EsdRtSb?c>CnZ-;O$z6s*FhI z001BWNkl`&Nd+k$WqmZY=~NPo)9?U)8cEQJT88 ztR7j%I@sRaKx@qh-uq#8#yf(2^eJ@PCnjr?0^jfV+27x1XM4cX%3`vufFf&$xTY-6 z*x23T-+ubv!r_=#o_U@kgFpDv7rF2Lx3RXcNLRJ6(;yYM&at(<%iQ83S)S9%T2#Xc z`CJb?w2BNWCwc<0T4|5P$~rE>_chnucq{k4^?oufN0L<@tDCWz@_|UAMG5I##pTzo zvb{GTFFI(6V_I21#>(0l4lamq>5HU%jhsbQ&NN8&8c$`Y`NC`ZN2ck=R zF&{52IrOayY)GG6-+~b`G0{H!;#Nk4c_3&vpNVuOw)P30>*~ZVpJg@&qctwb)nyFh zT+BcVhixXa{#pRsDn>~8kaed78`lIXMN}NgN+%+Q@+$2V;>C%MiE5%4jlv^> zC?v99wTkT1V5YZ%*$P{=MqV67#ad8yDo&ppYK@GdQ8ATUaB?Dx4k_v?v1h#wBRcKE z_v}+;&;%bR-mQ<_wwF4!QQ1dOsm(+EmFAOC#-eL#Z0c~+E)f+&NV$(F3q zkcG>#<-_0K&J|BR_+8Ha_zC*A-%WYXTUcH?#`a)`f|~PZUk=iB?WnxRm|W5Tprj&e zc@`GBEG_mK?{>K1=rW6QIhoN|JI}(T6oSEKG&Z-#tvsh)v~k{X`i3J+@*ZuK)6+RO99?Iyzt7g@CKoogY4;YW zot0fqV4Ak_9Gz>{SNb^RnUppA<1v@6?6N;NVE=HR?6y<17v^x4!pojA5JchgJs zRgS~C8mDE~E*bzWlau62^ua>my(Ol)IxqB>nD9dMx`wl?5J5_e>#7A4=#-lQUev?@ zQ01e2OYBK5LbxS>SVq1|_VqW@&Xf#r_$s84V|FY;SSb8}EXu;*lTxfcd3){`LR$@A#>E?&FR- zZwr9o6aivk67+bxC%L+H%`o}y(i%7))n3WGu!TvbDEU`95ka?O#G z>ts%%9U>>MmOV^-2)y!4$0IJhb^%XLH*Zr-CuCWNwbfOYmluFCMTZ&{uDzPq(=OD^ z5pQUSFHz}dXF9tkDMKiTiD=?y4(`B!R1$$;louQnDa`=E=;Se?d&VrR61pqS@=2<@ zv^x;1L>wIl8FW-T1~a*HK1sf#bwF!y);G*hW}>NPc4HAv;G=xnMRHgesp^y`>1VR> zd>UQH3qh$EmWzmc!Y^uUV)csood*7^{0xt^nOGQseMcRQ@{Jm^);{e%!VXmu-d&Tc z-uOF15g>1J+QnKG4k{&nD2-1rfz%y~C8d_I;TT^OIGSOXixd?RauA*aEn^uexc9_p;FG(K2nU2?uP; z1U6+WYokmzJa6q5{rP#?SAxB zoS%e

    `euqn+pI`Wnmg^LSgabGXlVT5@%BkA8oivh-*&jvrkI9LuWoH$+=*)Gn z73@z++8xcp>H@=};`$>?tj@O?PCTQrWqq+vFPlRZtpJxW1xw5GEEg?4|HpsE>f#Y5 z-ZP$#aV9*wwY5w=TpLU{9FM4#Vp2_bbz_?=+q;}tKg!m|HRf8Kz{d0%WlQ>b0$p2l3*ngv?2*9h-mWYOI6KV zeyx;S3UDvhmZf3z? z68&Rl)XCxJoL^jEG90qCxx>QpB1M+dDO$L)fHa^m-ZaLt^gi$Vz1unGZnbq)uhZQ#)6+AYA!j6tlp@MnDT)FeiIxo5jxEEE905V1 z2uTnm9}*}L0w_V?B$huYi33@I7E9DZMX^LuCS{7ER&El9vv3y9uxEO$?&{iZ-Q}F~ zF8T2O&$-2f9|&-!yLju~d*1iIJkReT?;Mm&7If_Ri&@U(y6j4V2z+FZC{b4(QAP`l zz4L9E4o;m`p2pJ|k6kz|QLVyw1-quCgEnZQ@_lMehkXOM`qXp08YVolzRpK}|};3y1RN`=UlIwVtSo*|+!zt%3 zY=e&|?U+uFdGE82Lp{Z61r%(pjo6}b z^UYg)=ewWeeNSKI%%os6sL-b5pk8q9V1qN`l4w8;Ck%#TX0@lT1GX@@hZKTWy}(4@jC1Vfik z+U=Qhap`*v!%9GgM16U!0G}_q7_r*oX(cPN^9^S|q{0xoM0t}hQP*P#dtEjtn|I!F zk(+KB5t3YHoyH;HL`;ab#1z0pX%#v^zU{fEiYzVH-KD4uq2HJ*nGNMgyBLJ5t=x6lKZ7hYu;Ml2K*2bNd#@w-$W(NB$=9 zXvSN2clq8Q{2(9xzy~wWRDRB+DDidR<=0;4-A_C&NdmE-EEQG7Vp%hsj4-a?;lX~t z1MNO>tsK$k6<@c?S%gLQi0Y6#1uJ|mpR#C1>&R@mck}Z;n%toh^by(Yt*U(%w9a{Wp%bW zXdz<+sam5HL@LFMBkF7>-Mm1g;44M`D&afFNlHME>`YV?jMFOjIe)G`3W_fEVChc1 zx&ks8iQrPbHBPPgay^Mu%i-loXp^ZHrh_IE`}i&+yUh?IR^`~OY*_Yc@ToO5~5(kxr7QfTcc z%8E94hLz%AF-O_NpnzpF9i)EIr=i%-ii$y~WON@s72S>c`nJ3w* z5(%nrXXa?`}aV01D3UZ1Lok^IW~ONmUrE(o{vsXjoEK15`1);wMneW}$TE0*Y-wX4gurC71|hPT*Leb=`VcR(qjz@0U7u{Xc>gq9BRVYRY&d^5<;o3l{2vJ!FlP~%dN^;ieSU$r0FYPQdALle07)?IGi zeZb7N{PxE_#uq;KC9b^lF+Tj^_v4qxSY37?X@*t7$VyT87BT4}LXBVv_(VOCh2p@*=pOiii7ruErj4P^m8*w9fX1Agaj}R`ht)&wIOvT=yxiS}MmC znk$=dwJ3P=4$b5Wk(KXEOF*#_#$}W|%4DS&5PxQ8qsa80(2Htv_t*vdDo#0ty8-tK zsn!=4srQ|#wEFj{U&MENnkeJyRkFKMtNcrP6Mi0N1-Z7n48&900ou-^C0%UoBega7 z>5` z4kndB4J+mjPUdqKbHiG-MOCy6%bF*zy_4&gHaIwVK(diU!Of$V$Cpbs&y4XgF)1pZ zd&grOKD_9)laup&SkZmcs|+vMT?0VXQWTo`4_NU5<#k(6aNo6%^? z+LGL}au@qnYIx>dPve&`ozL+nOHpBhidG8Fj*%RR5<%3t zZ~Jg&EdUW=bY`!g?qt(FW;k?Nj*|Xi#2ns%9)i-O7*>}0q6eWjRP_Y-?<^LZo){M+@)`DeJr}WYtR}=zC%UP-NS!rc=8I%F7 za|4n0O}QHmHKSogQI=UGnKT1yX=6jFdv;motQM|6k5*-D{DxVaQVL4Pg-eg%qTyTL z^&B@}zeS9SAOA=H0G4xhZ{KG*uQ{I2m<-3fapyK)zjc%O(&w;glSF(M2~Ew*uf57A zKJ~|Z_Aft=D=J=m=|zsGbGFJ#nkg-OUQHBa<6^eN`$PyWHpB)au_8)qk`CacUX?nHd+XFqveS{g!&QXk z$}rw7s`KCLc9H2DgIona6}vbnnS-NOKL;`B$FB5=sXu6uODN;}WUQBjm!h=Dsdewm zG2Mty_IPwe|855;Q8{UaGnUGU-bbe;Q_*)(ADOWD4JiORdbBbx-QmXl5tpb_G}%~&a&z9CpL$>*oV>lo82fY@lEX9%w}2n<2T&VJk}YBS_JcJ!H) zJ&kcipk}_Dlhiop(ksK}&L)>1zrya}A-{5qN^-r7Cj^5_gTiR0ioXlEQTVWt&6S_Z?4))WK^yc=cEu|6RUN_Lku zpZVO&{Llyg2A9@0QO02_n|DXvFj^loUaxp?I0NN4J6XpKhuFcCa#BJ}Y}z%hK6wQ{ zn=)?}7;V`ZY%zK3Hp*qcqt}r+a1tVe^-V&6x9SBq4)1g4a7wU4R7~8yd5?RCGc=wM zBd)Bt`|y~>V#&Jr5Mo_3DM~79h{+R(G-1ZPf$98+!C=6~#u}s2F({!}D{!&qr0`rk zJ7#0UVYH=LTE>-QK0PF07>*_^o5bJ!hyRFIzx)z^@QIHzn;xJn)H;tSyY!jZD?f}aWz zn`IVPl2nX7%_rqaOcMe{HDELxQ5i+5m(1#8j`ofipIKvX?>@`A#`~K2$q9qeP(sxc z&R8LbX`HiIYpKd1Rar1!)@(nr&A;>BckzqA@~?Q}$tQ`6nz?iATs%)lc?wjNzL7V{;?hllLnyN@lc&7(pGGe6_@+jm*cT1W+i{9&9wcad}Fwg{=o6;%i_ z&Q!86mQ-EUA-N>bGp=%}R-Dh653k<%EgrUxb1Ijf75T9hpGy}=i;T=-e^#b%kdQ0c zyJf3J5EW_%mhQ6LgyxV|qY9%lJ}wA<5(#k?ymr1?x-LXKbwQxjN<1B1_o_u45;|Io z*cGC@_8!S zNSf$lpKh*{&i+~~tKi2KkxTbEktE_Bg)x?4HAWBHJPt=AK&*=1iMJY8o6Ri(^kSGc4wYh7s14+&T_??bZPo9vwi? z93Ct=KB>7kYpCl6lM2Rziv4}fnT_*OU}gnhP!K|fTU0tn6;;C#MmuIFM~sVt&EW*C zYhp4qbws5CUmvqkS|+0bXI#l++dG`>@8atv!xHLc!(cF=ur}|olp@tCcX|R+c(8ZE zfAgdNkpJoBpP?u#=8IX5hl*hZe+V6oGvp#nYeL8);mB$NlXS-{&TA19BgDi~Qr)fW z^in@n%I|xw&gGI-T9njCl-Mb{RLUx9ognBHZ`lZNKYMEPgv=X5GTHK=5GHQ76HHxh zo6QKFPE@7@ecAa7QTe%0iD(m-rbH>{vzOmr!d`p9P)LcM-TV;-~QP@=kNW!zs+?2fTR5r>Uu%b)LGw$(-5VJ~k*A4lTz= zhupe#hql$I;7~E*a9p}@naSob3jzd16t(H|((;=uS%%+`Jw?BZN`f1rOCA@MRG%Nn z=}RY9^`6*|89H-)QfZYS(UBBR?d_C|@VYsFH=EYdg@q(y3h6ME%9n9e3ZFt&OiHSQ z{F^@9HxX9p&K*^qj%g;Q`<^hLR>|-EEh1oUl?}0)h*n-Q(h@-~W&QtQYSP;fKtk3o<5X6+w5>Jzh93f~Z)hlni zX|~ou>?B4&1$q41fjWZxep)ONA$9Qa%v9`(#pNfi@Jqk+^W1#v zCf6T*ltDFMF`sd9XM?q2#oKqU(4MkzwM8rGEN${ERHAmG2ha_zPqe8;sR5qEV$on!MWF`y`*5r4u$rO4;#;7zi<8wG(4~Mz}ep@_TJH)1y81ckgrc%4II@oaa;j_K&!5?E+UW zKf=AcZ}Y+L`(9|fMP?_Q(5LfiR#cAUv)Um`=Erl69?p67tFQC-|NS51XaC!uhNcA{L|i&f3V%|Fs6`464D9Q zvWV3Ea8kq^$;bdEQzVQsy)>HSv%)eNQV=7&c%Pz=`OBhm49)7jj5uYp30JE=!ibdj zTarYKlF?35LDu~mA6MgSrHur)(q|oZ*=bn@Ct*!W^@T|40)~~0X_CskO{MxUU4@L7 zx}Z^QM17W%5~79_x&(GD>eu|z9as@EMegl#`MhufITf^)d8QPooRC z_SmDm{_-3A7>^4klLGBV`J$b-?5tOe94zN2tZj@rTUT7W zaE??|gpk;`1s68PyzBf9!O!v9vuq9L&#$q5bCS_maY0!Y*s|p6xpRDR`8>)x#-nxa zJlw}BO*yFYUT-kO6^7X65wuYTZ#-B7K@+V;D~Byge4C3JXA<)`Bltj4o+`Pl-8B_T z6&O>Kbfh*lfff@g5}N7p3G0(Fo1+m!qZpKyaaHp6mgCIckfVbso5KM^XGu0c43*Z* zrbl=pn`@i-c}We5Im`M0zg$u;W}MyJp>%7M_L!IyA$ff5^Xqbkwy8K;HoSG?27mDT zA18!>wuU+yngB|>elOlhsiV$gY_!QyM zQ&WdV><}3*28q~sX7vnhgeIkIZ+{DIgE4t0rmPgCF_798gT`0~#$v3&xq_;!GJriP zqPAFT@J-EpxulJO=ic)zeC#)WhyCe3TVb1>i)Sfp3Ca?a7x0QFB#%|a3hL1bA+`9N zRfNTo=ihjRICR{&`8ro0KhG;K{S{yM;`10&5TasZZG-Rn_V47<`Ez{nQ-8*np8qoM ze%Cws+G{WJ#N$t7lb)7~O>9zaXc#m#&tAVy-87ViFu1x+n9Ax}ykRg}N7*T9RAImV z#+P~Fg|BdYFlRE{VrzYya&m@CS1)6SS^8~7YVLcrp5U`J(mkv&XR0$XVr1!TyYpH0 zN7>9Blh`Rz>Pa!3Dog2{FPBGP9VI5Mf@r0ii>E>tb6m;_;iDpb)KL); zHMWmxQa}hQN3|H)J7Ka39F>E1>1-HTi{!=3Um1&%QAxt|;jf+WL>YrNIW;#>U@}ZVM@c^Oo@EmWDPXil8BM)}!We2LuhC?fyK<^G;!3~=F{S(vgn)|qa4^aA zA*m=Yu@*67w1NcGDo5LTtSfPaqZpLTmow_9Sg49gY5BmnJ;y6Ayo_&J264dFM!{20 zUE=DMZQi(Xi}Cu9tCg4p|qwj zhH>erT;$e+15#?acxjVSS#W-PozeP;y4GwB*SNO5$!zSPXfQUgSvty{ZN7T*4qImp z&JvIvUJjZO9s4jGmigt0MP109L9Je)2uu42}-*yLGXo3J@4 z8JC)Bu#VQ2Xai@*8|?(K5-{*+NU zz{fyv1>gCDAL8kEJ;i_VQ$I;tFM0dxuM-RmHrHsDC)A5NlcgF@@G&dgO)d%@u=F0K z6m8Q|`xdVv)|yl46i_c0v~8Q=5=x_jC&YY_p)76mgwW;{M9gx#sPlKd&=wUL zE~{S37*rlt8f~yu(dQg0W6;)+f~TDwF>9AJV&y7J!*DoavboM=RFc{Sjc+B_6HaCe zCZi!}LyBJVUp29n30gOn?6d;is;p`FKYr=|;>|mExOceEmtTCDXP}@Dxv0fFL?Uod5cT z&$D|p<=)<1?8Ci19^QMvSN{4XCZlb>>A7#?!ue|qhGnkUykvSAgVnm<5v36OOD_kw z#vXqaV-l`pAeqoh>j~ZNE?)pDDzxc#XQJCQd30b+_Tw4bsS*{zWWkC}l5Q?-ywi88XsGH z3>c*-i-PE(^=O5s~je^2DoUu8p(#VWc8?j;l(c{DjtWv(PBPEl`khS4}5F6?kP$75e zA$g1u0T-Hp5y(J9%loYQ&|jgHSes4CN%!9w(*X<=1S1(5$zW|_a*Nfg$M{JILduH{ZI&Yp>nmxBks%`Q~?CXOsdDrVEC91uwmFkDGflhGUOzS}t#& znDU3D@#}((t6Wn0P zcRce9cOEV%2SbJ$p1pE~=Wo2t&h`$^UAoGd%>oqyik5|Mc=GBw-o7`dBC=M(6PGV@ z_3RD>*-K?)?EK92OANQRPzk03!}W_7xqg0|qmyHry5-!)2HWdv*flx{B^S0gSaX^; zZr$a{N6z!+?k<1%xtDnA+I7k*3RGWXeBQC|9v|VXVgKNOswjvtP%oBD4`;k_f0s%n z>ZBQuEw}d`a&)-QWK!Ylyp-_@mMNgELecQWzy1O*zVtqJAMCQReuh8)^FQXxFMkcA zS{BO_T3_RrZ5DnhNw<_qmj*)c1n+YJsB_k6pus4EQzeBhF)qWJBO0tB$ZA3-1+kHc zI!AOxrYxyMr6MtDLP)tV6PB$uiBdTVn$#wX%xIVmE7b z4$PIqFNi3}*|N7LnUst4)Qw*Q0s;^rjFiJ61&oi(7gO4%0hO>SW9hv295xL~8HS?~ zk3M>ZlV!uhqdo5J-@?CEv$?aw&bc!ZePkhIL`hW^qJHZ8>bnPK$h45q%!xFWKk#zDdatzZzJC218C@mIapV^A5tyjV2v>ux)pp&hykNbejOUx#tY_5TxePo zb+@3-yQ{`$@17Q6Pn$BFw}Wlx=#)Gjoy}($lV5)bkr+E;dc^yz{?ayI1R=B-op%Bu zLW-WEuo9S@yIiI7W$LAy@!peyCxop0>N>y>qFksEYh5q+QpPZ=7dRQ$bPBd+vB)t| zKwURkr8OL(C7W+Pol}$rqrm{J1+%7LSQZg)KWUM@HT=2!`pT{bLUpByqx8J^p zafbQv5wV$}svNsyO2`<5W*PML}eg63h~ zRKrNijA=V3VOeU+Nz%)S)_u^!2op%N#T_xxxm+U z?_o=a)|!)(87E=EVzJ=l;R#PJ63%K0XQ`ZK*)ADxZqT67G2`2u0jnBNidmD`-8iuU(#4p^zoItnEDgzf zx%A|Q>`Yuigfk{XxkHy;Pr`@1=L{-QcfskBE)aDV#Kn%@lzcunTkt`k7&@P&ZHHu3 z3S||_M;0e1eC?Ijxb@l_+<5&hW{VlK8#DguFaDBu{o}vSr~b{SxOe{nNf~)(d`>0n z))Go_^X*#{*0T5Dfaz>b9XwaBJ<8qPyFC8HW6(yH^CdbZtSx#CM5nSefF&>-mnaN- z_x9P^*^vl25n(7rGK$e;!eTKegcfB?=N+S)hp7~yjZF8B85Tn}&#hzYddbOj&dK}; z|EqV)mq{i$7{ zk_EBOmxju?Hl4%FB%ik%wPq%sD++>dMQfLL(rsX1i_A4_aMdDO#U$k>NDTr9OCArOwYO(ZXGvj9%r+bycrc zA`lX=LoZMgtB;|Z7-es#Ls2(**Beq~cCyTcP+haRwnl93%@Q|`np|8K z6%U(+S+gLZ!9nXFSWBxEuixC|iEEGGa%4zO2+@wwF!Ag&Pw>&-{UeAUOsrcB z4ikrYauI8ENK8!0Sd|<$7OfqLf*SBTVNJ|RaWx1 ze35X~5bvQdnnGK~Zj=jNZJ00Tgf>^J=-x9iu5b9&iu9)+lAOl32uWp;L7CuoWo~ zQ{LTGF54w=R@Bc?{H}TbuS`yd$ib=_m%3DnjA1jzh>a=AUQCI#!pX_!vpp%~Zq4Rk zSAx%uN|d7nF~gnUH|SO>Z^89(R@ z^|F?joKAR|RvhI)!TtO9vzUezo4JQxYC}6;aPwrB_pMc^7_fuEfVy4ceM2+}TWIzl z?lBmY*r{c-w$8Z=7bvvC**p#mp`mFbzKw*oK_!oMMHV%5D58`wraJ&-XJ<5p8h|Op zyQi{B$>)nhncQJ$WpLKv%6u_cfjH-=kFZK4ScwLEHfCot$cEK6tE`j+aCE`C+zxFsbbRoS$vtb7^cDqgEIkIM)mq#Uw|%7*ny6{G;l<~(d82HX$> zN?Gv|<%8c@iw^-UJAjx1A!MF?lCfV(p*Q&}tHn-{FW!v$Qn_PxnZ1Zos3QOKqAAd?Z9|`?SwbX4O_(;N&Y&JzNLc{%fN>iVpwV{cg7jNCh3^yniE&KO&*&b|icYn#|#s*fG zyzBboJUpJ^h7$;eXohH;ICteye(iTY$=>_FgTL`@PZQLFR=0WNufY@stR<-&hFXV~ zWHW2A)s_ZL(urWR#Jnmh&YrcjE!>^W**!kOmx*O)I62torNJ7X_~fU#dvA~Hk3Z3? zdrcRClnf?8sUxr4xy@)eqK&Y&wt;OMVu;*%>lW{R`Z||JV~m5OEFrZl7gLlgsEUfW z-@L`UpMHw1aW3#`m1vV=JgFEAU@~?*+~1{b8^*&S&2p6W3o$?n*e+yMVvv&P5HjpY zL|sO&IKZ9s(d5ytirJdbWtW;1dk|ZJ#tE0W72%voDO(phy=2S+I;(Bo-K$Jp?gOcn zg#79(!pkBYjfoK_h_zOMHAW!ZT9o+NYGzGV$TljFbi~E15Jh~&S`d-hf)?_H5Q1=t zGb|tE@~amzm1jH&kfW1*Y)aS=6~pn6`D_8T!W9Fma)cS= zW%t9wI~+~-c;x&Q);88?Lya>QV-u;8H#o$s;87`87oC_P%A`7WxmUvKi%|^dkr-88 z$cG@K$YsXf;7F;Y?NokR45gwN^sx~|X};u=h)7H~K2uTfITDWB#f9ixRT)=^9Yhg) zd&&YJ7o6^l=1Nkk&C1{}BL>x}AUlMQWQj##5XK<(1e;Z0Q52UkFbUbpoIumJf1LcE^Au@1Q$6kdnxi&hVU+5u!!fW9MWE1{ANk?;^Z2E+T-qvW7d5lC#hJu-hAvoDW$&qVcnn235Q36sUeCCDGUa43XEGeHef2WG`7eKy z@B7Yg&&Ga<9kM3!#FLl#^q>9(uibo;=id7q_l{=N3Cv)~!AZ^i*^IZQM^qXNj@_dv z_xF!@uy;aR4I#kM{e5;1mc*Dxl!X~^Fk7%cpHsJixQu9Tc=gqL7?Zy~k`?^}GExP0L}n_C-Hg{IJfMZMs{R!LJ7 zSYt3(&+*8GO*S_x4vrQ~s)E@`!`9j+u7$1j4FG2I1%vT~;`k^Re$n(7Sk$0ml;jk> z3I^?{MEVr9iiAPp+~TT`@2wX)_0u1d5>`cmT!W ze~Q`7UC^4BUwN5-`}?2d)mu0DF$bkKv?PM|In+I6G+a;#r(Ir2wJn7!D2tM*7R0(gJQC7gqoXYGPTQ}+!{QlTf2f#&$&m}jp%$JHxW`PwV5U}y81!9Y`0755+9 z!2-_ZD2otls=^UM;`Oh+!P%X&oIiI4S6bTCO5%Jz_==8dqF0FwCfc5M+t~ng$|KS) zYcO9>*)yiPHeP2?w$ZvzK8P`$qMGD=SU*k`reKO<@Ydo+lx1y*Ipj4fR73AS)RH@) zIm(%CzVT$hKaGQUznV*B{vXikmk^6N5Ms$*rPmh|!`tg!rAS>ooI{K3H? zjfd^+^I*VeM~nf5m$6a?`gxisP#CRNJ?_kslC6`j9j`=fj*2s7|$@Dh$dmNiG zHKv35MjhlrMCd+Az~q^rpVzf9|MTt;N=n2wAp;Xc?W~ldjS+1Mv@#5ac}M4MnJ?JF z&@>+7hAfvb9P2C=8;mH+5d&LMR0b7hl(DAJp0gVxk}0UH=KRJQ7q{1lv7o8*!hbv( zQB@_w=xC#2xmeN$4^*=MOc+yO+sM%7LIjf&983ZiBFpK5$F5vsJRD}^UeQW8Y(z`8 z!L=(_S=0@`{gFT5Xt7}D@%stcDl6$iSNx@_?;KA{Xle%V9=QNGf=Hh1m z@B|fMvgz=C%5*x%O!D4x=wWAlouSpVD&bSa0ybKL%|%k10!`a;`_3JX`sy<7A3mQ`8k18hy1YU8Z!hD+&a13+4yaWf@km0RJIF>K;BM1Og`QHMRHDS2hFFDE z1lRfItgMO1+(@l-HuS3~#k%fe?u<$+udrTCl#~)%m1Op$jttYK$(a1C>L{a9qp(UW zWPt6wvR%NF?h;+{59sJyQLu|jTO20a&Qf=x2&6wLV$w|KOD>!}%XnkF0$V7JvkFqv zXPTx&-?TVoc>YUY=FWo${3rkMe+aGTlb`%UuD$Czk6ye)VN2E~Yb=*Flff7xX(YPu znfuKK)|QmRF~(>Hg~kpB>^-*~jp_cuk{Qkl+M0Ock=o*Nh z(&+rZqshOsPAP+=Q=ZRj6$K#NWnUyA%;fUWbcnm8``D~Z$CnN&DfxM_uOwR+=nj`2 zV!jfJMYZyWb_o#?vbj5C&z6so7#f_(!YgAsv00Sew_1%idgwx40&3ytb=|B+_X^Tn zZ42u_LrTReVMO(N^ISMtg)2+i7zxUu^Z=s^>X1;S>5GaKQU(T?fHR6_5g1k_%>wox z9y8b|DN2iVnzgax!g|HSy#=G8;mml<{A7b`k3NDeEp^-S_{AMAt&iC(9TeFMdtBEL z@|472XyJX z>nN?EF?nmcQBD{agIw&2J<3*NTrps6VhQuW{f7rU|H2F0eElZh^v(&RYRIG-6H{a% z&fJQG(O%xyL~u)j(!BZRO)-~8>Uzm{y!UCUNn$?BBC19ytSc}^5tC;!9B|Yusbi#2 zGQKDKRE^f?q#2|FJZx=lU=*y4^TAv%m*Dert$GA|eqU@9J%Ltz8lMvMUj|c40Pm^q za1xAJmu8P-2kP$J6`@Nc;lz8FS)KG3Zcwtj7e%^K3KJAoE832~8MD7GukEyWnNOv^ z$QU;WghKa7%j^XXeTAv9q7%r<)*OZ%x`l$#xx?+KPO6KylO!BrmJ)L!4&5`*SEO*)MMO!>o#A0 z{zbms_~nrcvCj3T5! z=?s(MkVwE3j(Jm~l*dFxj3Ec~?jNwZxyjmOU4k9+!5VcwBwd$pq-;-Oh?4YvI-W@D zkWmT}2o$??^`tYm(d0_r^jR{BXQI2_e3OOBULP7MC3`+FS_y90A~BT+G<2f0wY zkB$z;D}lpSe!iDTD%&NG$e#~g5n%HrqtLw%GXslr=Vq*8eQgcpa_W5`KhRb~p)-(S zdVI1P6v-Yi7hFpA$ScOIKIOSIO06)zT@+MzgUVrqk0b;-ZSzlFEM}~gB_=Fr>xSWA z$kxV2pQvITkQS6CQdmtZJ~8VIDh8Iz1WI&TVMd4UmTZfbw zDtPSNHai1D^qw|&e2hHz*j4VHEE%tDFkf3|ZBVgMI?mWhPE*&4YmZ&x7k>Ho_^$VU zE2Fd9xw5kYg7-dSyb8_Poh_Pq!|mM%T;AT`<=013Q zXhwrI=CL6v&DHal7z10AGx^X~8gC6an=xrA^x3CMXYfOYt9Rc^omVnSa8jv*dvpj4 zlP6dma9ic))y6J|GmpNrdOoW|H7kLeM&nIhJ(ytSc+gqZtQ1Z|j5>oJVi1g*KrfWZ zDtSR1YN_0UO2lZfG4GhIM0=$!8m-p}WFL11_eYsvC6qC!uu@mFT_Q!y*tID8QZ3J$ zD=o#KWVklU&f_TIxbmNq!vpTT^%f6r-{z$kUKLcF=Kh_#+C5Je*PDKmCdyYmo8k&>kp%||2PF^izN>q?&Iez zH*VhHr+@aJvRuqb39di&B){>=Pg0cwV(SS$u(`Iw4}RAVa5Oz8En30QC4!FVmZd%-ENHm7Fsky&K*iCo#J)d(@^F1$4(Wup*aln_8Vo+e5Q zs_j&IL}C@!qikl2cGqop(R5Kzd2*4h8%B)R-DRnwP$X6Wa1&Aw5a>d5wX%I`mt6%w zWxIts6;Rt%AG!mPb)pg7M;aNaIIXGpzz_Z)N)P&L*hxo~5n*{u9OYp~e4AR*v7?qy zWWh>BfuUL%E3e)kdh(8vBx)<+{;Wl#p*xbYf)`lo-!OE134;NoL!T+V2V)&Kw?07*naRCZat%NP<6M5I=%Z&34%v_ldCXj-^XuBmkI>$iO$p3O;7c2N$gFRxWRhv zxP3!a3^=oMmZM|O7B@F}srQL?pJaA{*ioM)7lDhn>0-JvKfky5Foj7@e5d*Oib`x0 zF{2uL^db4OO)5h+qDpds2y(4YlE^n%lCvR-b<3nYMGMM+%CFVPms-b^_wN$*)Mc$^ zT2h{DDWT>hNpMMme^fC;>s#?^YnjNX5WfLcXcGPIvC};equ7ZugnJpcIc_b3exqy#IT-{={Q>{O1k7_N%|nKlmp< z294(ze)U)RiJ$ln_yC?jVZWC@|1Ws|2fv@ko_s7<+>L}6gh1OiOzSyczjcSNeE!RP z=F^|y$@jdI@BX$A@%Z^GZ0~HdbM_1y>ubnCPG?;H^IxCEFQp;hR+ z(=PC{L&*u=dc}W`F=rAWK@K|>(vDyPJHWLPC;-A$?eqj4#wbYgyOOma=zqbK4a!YD5w%~YCb26LLXie0xY(4Gti1F4o$|xFOw7Je-{Ki+<`rflx<8U^E)Egi9 z>f3i&JAanhNsC|1dF1RC4-OZc+dRj>Xoe~S0z7U09ySFumP(ZbW)dWAM9!a~&{{=| zQViS}t1WkDdqfiF%noVpdF-((eBv|zFIDdurP)>A={`H0@Wy&8S66kcZgo;Cff68z zFa%?JVUGjY805jm_TaI7y{?BlzP=vEbv-yCuwe$@vAH-84j2)PBm)wP2<6Z@sJp8} z<@ly^&JOp(K2^=t7ilRiwW{jfd;kBx-}5}e#PB$cYK^oOvv2<%5z2t~WoV?C-svC2TL$#5lMy|Ydws?takqS#}U!&^aW1EW$)P*#^yg7B_V zG9vN@XAK%j97W8pukgaL;|w*2z`=!?8Qy%y&D?&&H2ti{)5m*sbc!*arP(>QUAfA{ zMjfAd3M3tqb7gJ?S#Kh(AhHqd^^CQiA=M!(kmZK)$=xBZQ3>IVG;Yv0CWM=;#mW-Q zP}YxR>EkSWNeHjPv_}exay6hguiRTis&bOz?4~m!n0GcW_CC-!yz^TE0l$U*E2}!2 zMQ>kr8fEAuyYk}fy+gS`;VN9%Ws5D9SozuJudzvec?b)C4frp%9t3Pb`@Jrs+U2iT z`ci1%Z8_BmJwt0OC{L0oMD8)p(Cc)`dOeH@bQV`4CtHmM!h9F_UqQRyXKZ+aU;8h= z&hP)x$G}@Y_NRZsTi*FruA80?Qe`jj-8_u(BhR-Vd4ij6IRds%HHztFS-CrLT%4WZ z*;ij-=Hd*)gF|d|du*H7#`N}`U<^O{gYV((_uPeF%~)MurRewA(2_WbQ6^k=V-- zHhx8gC3Bujv?}NsgEip*amJB%*XeC6Q>)gAl9aR(5$nw)qXh~OQQ0diQ%r~wRvq40 z%DM1jDtU0ihoHeVAy3%RsZyPywvK`_sU^ggr9zZrfh~bAa?8fxN=3+~cFC8;AnQW^ zZS(AKC6!(YiLje~Lbkr?tlIP+imm_7vgi{)(1h3TCedL_pyWN$%QDzQ==F&(o)G1- zI>f1cnPDqYO)~7sgachtWz=T%MunG#wSMc^gU!QNZM~8h?Zm39eXP*s3f8L zG|# z%1gNJ8ectohPslZ!f@f}Q4Srxkumi($h8_oUkYnwmVT2!U)Fp@ujpm$Fj7R z(X8#@w}1VYc*7lUBrkeA_skRg^B4Yxk!Fpl!O=kI0UrL&vsBYjZoBQRy#MB#*u7^L z0$5vI;>Bma&4b_g3YB<`T|34@`ML(;CdjHO2|+G~xs_R7 zc;zHRjUfKLbY+gw;UV67&l@;??joID#%q^W85|kG3CH@{DogD(Vp(2jwIqrn5*4Ny z#ur5KHLKnx$+z9_GB7!UH&9K>(WotGcQ+Uw9i+XwvY8|+U&rDaXSh7*a2Bt^&tin6#9fa!C=?}fw?l~V&(zQmoUWFiOBZ@7%wEo1fOu3pJ-Fo`mm zEr~*!T9mm87s4%#)(~1Lv<#CmZymmLqP5!{tTWe^o8@j_iBMBA1OalblH$D$y*?dS zo<(8Evpya}tyQO1tsyNe&0b}o-e9BCCM(RA-l^57GdeV~br2dP#uyIVcz~aH&%ful z|F7Rhwkq6m`^~)Jj$3K3u8}4w$cV?De1e{HJpA=XdHnGw`Ots-Api5v|AN!!FEa0Y z{Nn>(W@>DL)zx+OU$>w4z2`@n7#S)p1_C$VVc*W(ArY)Si))LR!cuQE$@_hxINqvI zAp_A21I1>SaI|@*WA9FX)9lvAiQ*CqBHz8Ys)sE+>F#aHrt58QSJ{mGo4}EZM{I) zGWa7xsdIC~pb2(p;q6vhO5m|VgAZzz0O<|Kjx875uH2&r1+4|4%S32cgcmj_swkzh zz6`v`E$z}Z*6ZehY;54cO6RWa5c#f!|98c>w=TrxUeUU6VUPsnM%lZ^c|oOGC8=tZ zf^KJxS6_aXSB}2IrSlhASX{w5$;j|1`}ZB-wp;IH|G`6y47X6Klz{_T(c{9*Ykcd` zZ}8Z+9_HlH6SP-)yyGozN!} z3-i>5ck$IP|2=7Sb3Y7kf9Ku&$iM$ye)8TAvao!Xp=OiQm*)9}|MWZjhYx+2YPH1j zmOnFE!cTwbgM8s1@8UOp^Vit3Z3=_KMg>|FU;?g+l6;bSkVavJ2}&caw;*0R(pH6mZPA$92#YO6Re%gg6A5WjRDTkfDE7k0_v zn3p)adBbz1X~!X*q!1x}xw&c6-cuWBk;Dm7gp38wBBd^0ivhNjIR zYX>zV4D(yfCR%E=g|%LXljlxy@wM|TUYW&vPi?Tl#P%JGwMJ;vV=9#jX<9*TPK><3 zn4HWM6voi*7M#9#j>XkwW>=P(@8zuYyHIUV$P_O;4QptwEwFcDj5pr(CWZ%VnD$B# zF(ZhQ3Ip{fgY{NOghmmrmvdnMLGT4P-gzUBKl^Q7o1f*aZ@mj#Mm>oMTuR5&FF(&O z{qiqj+a13B=wp25)Bg|mf8_zb{~hn<>8GFJPe1v`3|E_B|KUOf!rSmOByi;3VwIqq z=YXPKYqB`ML>woquXJcNH6Byq@4^L5DoH=jh#qr1H*YkX zuGg)pYne#%n?UdK=I6@;DRdyixWlvg`^_H%Q!1rZpj3E}v9=ce zSGn>v={94}0_z2hfhJK5S{q(H@iY&9`AdBJ(MNgp|LvI4N1ul5A_BP=-JRtYfjxkQR=%ggN1fv|zkh!>lio)TYDtr4tARdC|jK6RaRg zF*Gws8SJel(ODgBTXXK*L%Et;uudp_7cv+$iyhE zp+OGp%eh=H=w@x!+kKvT>NJ1%k6$8*;rQ{R96WSAC1{ELH{QrEfAm-Qz)$}N0RHs8 zzve?f`4c$c#OV{Em*(8oBxHDej32u9$2ocCDF5RxKEqvax&xa#oDYdjB^0tm{W&QR z-e6o7xWHv~Dz`bWojk*(*?AhRW|&AA!P3$KKlX#~VtQ-@gQZeQLO==V<1oHYQ52*) zrK+n$QA(nM`bP?fli^~#xVFN!(IKjp1Vso?+OiVkzq|2yRiYi zZ8#H`0TNrXWnpM|gjkgcP8WEj7Edf9;?AbN)7xn+ue2Hq2?D11gsfx$C0GQ_FpUg7Wm>7Qv14lz13&L@BG zQ#8g~4AyGsDCW|oD{K@6U;pMKyzuOE4317Ps3jlzv3t3AeujzB35Hq?if#u{2uxv! z(xhY*2S|waA#I!Wy5KC8B&Of*Z4s}sq95QX<*YDO5yE(UZa~BcFNt*+i!QJB7~8pn z>Cs`*dQ7!aLwlo8Iz^@d_S~#DsMk}R%;@LcV5u*eoU=;k%0?1GOrv?6cky3j#9L?p|hnom&F>XLT^kdO>PT(Vc5(gD=o|PY4{>I?Z*$lF-ZDWeg!`_+i!7}io9XG$98YyhQ4~SPBt;1W2%}IZL$$<~crsb)l!~&@ zE*!*BM6=l-;7AKzJ^Bh~PMu)(>Qy3L<+=k$xZ}>dXtoB*ac;QMnsU4v1!@y2hF4F% z$O8}E&)2^4C7%EGaTJ2-$w?0FoB;9=1W^iQf*t$iGq3TDhaTdghrS-Z8CB?Hw!1xs z8Uwufp1TmK4*DhqXU<$;?~Z-ccTUqD7$Wa>a0)DCLB4#tC}$apWBTzhYn3W8@8XI) z6xs1O2f1}f-v^~}P6Z{7b7Usmx+_SGvh=;6A)`446|3RaK}xDG5tR4>yCQ8 zN~Mz0?iD1pI;O;L#q}7aJ%hT!sdMM})L;Aqy?%dd?9@tY9DDv{-f-j1_?=V4am3pC zDtEv2U8GuY;@D9R?%&VVtFQ6MqmQy{*8y%ke3k6xlF7_X1t&xv&zc zOXnqq)wN~L&CD=5I=VHMpIca9VrqhVtAdFgX_``v6J}S|C{zHjD{B~PRoOE+#7Lus zjv`|1umv34y%SZh;;~eBO|WCz2$RDNy8RB3u5WZiaT& zM<;-^RFjlOvq_{vKE>V+v|%oo&M-+;H#^x7~gl2M-)3 zk~-|($_u0q_2#ns45r99ckTpFJ@*XHy!0Zkp1;7Vh-qARh$yP#lL}s^6w4X?C;yHb zo}I&^9N9a~9e3Ty!TtMaPK*%wuqHA^#_GaVo_Y3J9(nNvPOi7pmiO1Gvda`a5@!AH0EXbBMfB!(}~O-XZVzuoklMDQGlGp0OdVrDRUxwLr*- zm5w8cVg|0x5MMe^1;_Wl=X-hjk;nPt-}qft)|UC;``^#@-P>7OSb``bZB+5j)9d#F z0~uKD_L$x?%?E${ebD#Z|CgWV*xUtv@z;L_T+SE&*Zth}_J7AnYmoWZF7lzD|2Zf^ zRp{?N`+4dUBaoS32--||+fe=Tn^hPkp>Sk*1}5C%i!3A3G1Vlc-|5pBsD~H73kDle zPS)aT%Eo%e>QaXu&^M0CXcJ3Dr=8L7bkU|T$V8x`u&h@~ktPX+u!xd}sgw+KaUo0K zap`5k5j&020;2>@3q%nTr4W|%&IDV6DLht%aEUD}KGGQBh?5`~#aguWcrVMrr7y8# zGK_Sb!a7;*&q}OXDP!Fnd3YI8n%0%Xlydjyy`=90h*y+PXCYLWmv4I0#dnP)kzuUq zHbw>gk z&N!6KDSQ|K3mbN@*2DFCcVbm|vEo9Y!E1qYin;kUI^CSXdcCBH7@EyNCU)#b3=Gk& z#Pr$*tHbCv!4a$QgOFQEhC=uPDPl-sWMmj93UE0^k&|i(BBE<8Sy`NJ7oe17zyoOd zBxDJ6y`T^hi)9EErU(ua6>j{lR$&YNzby}XEN=LlhF4OFSA z8lBDt`*sZz*J|_%$H+j;O$VnLsaCMYfzw0?BJZhrLQ2qqPb(zKbK&9)-+Ashlaq(| z$q)VvgUu=rKKMnx^3WH#?!ZC*;&Xq+*#GhKOiT@O_WT9jbkC0=JsiCLdgiX4<+fX2 z&qsg#kC>j;{LSC}Ex-6nA7N~Ail6_;|Hj1&XV`yWAD{n+zvk$%vrO;Z%eIM8ZomBw zA{BGt;zeG5nt0q zYwVfcLA6q4&$cPX2J57%LZlL^GGWh13#SVdilOOAwvP@m7^U>H0^T(i@*H4&v0dKfxrLT|Ccx1eIGk_jv;_!Cr|L? zQ%~{i3omox>KqHkQoZpAjBTeYA|jnoIJnRl;H4Lj^JibUpY6kg+)Jo1SK% zRm1y&&PIpX%U3vi_8c#rIm_v}dE|~=xbYoO8KxD-M2W^m30V~3ge3I>`^F)9MZxjT z221^%uYUYKhP0+ttx`>6oHum(eHJ@iR;qQ(o_!?KI}u5Ym7dx_11S{_sFY!xo>B-G z5yvU5y2GXew6&yOsi7Fe7Yc`=7im%%Kp2fUA~p_TEVV>Y@i{ROdTEK;>I!vh*nMCZ zcfR``?zrhjRu<-X_JOa{Tbkzwf8Yn$y>nkc*2Rt}iil*y(#jGqz4`);p#~rP!28NQ zjo}AA@T08#`RDlKKe&(o{lEMYGt2XgObj!3@(klsqamx2utwA`osTB{8 z92cf?!b4$$tFhlN6EWVQl_bmi#Fdop$_l<-K}Uh|71x{8h&Vgjp`uNwlWZj?$||09 zIOFjcbT`kb2~9eXV63BBYaz787U4r$ctISc473{PIP6A*4CxzhLOFW9v(C!$GERnG zij*pVbaO{R(49C$z-I|ZPLBdXq+@K}MVcU2HBOR5ad7U5@I-djA!XSGlnSXs$i$Sp zvnWZ!RKI-9Rnsaujzc!aS@h2rX{&gOG^hu7r za+JBb1(b*x8=GYBzWp4y;d<`6^Noy;PEv1#Fp4Yf;NFARAhlz0VTOml`86JU?3+CK zt;e}CvqHaLFgh^6oreyWbqdGDxdonj;z?e3_8Eqn159n-!T7`&x)RYh8SBf-bXL|_ zSX?5@Gp?JOB-xqbGZ$XcPLbhp%Hc(@YgmzE%Xxd)-CAO!&_ZIo1?fpEF|DCNG@3|g z3i=EVO)xOMpY^c``o@qeuvP{&kS+_pQk9huM}lNfg@JL`333^HZ>fZ$U`yA$xfUPM z0_!5I6Qo+;rNbIe0Yu&rNlOkih=|Lt&jyZ49HH_J8nai}hy*J-W%r?*s79W~r5Har zz|vZenvUo!XEevE;nL$HYSgI5F}0>*Y^cF_Jz;Tv6=S;8Y>lyMN)L?`aWKb^4l^-W z;lBUzRjw?+%P(GGa5$_~{?jkr%dh>~ukx`!`~v_!{h7b!Lm&JhzV+x6{Om`nSP5wi zU;OfyS>IUamLrF``^~TC%lH2+-}u*uxH7ZM-u=57sKX~e@rV51ANy}S_rf`*rds^x zU-{2G^5_%%=I{J&5T$z15i|xGKoJ1>-r$4Fk-T%{x(p(Cfi;de(q#RdfkqXH zV0pdG+rH->@P?XnOmE*tOD9}eT%pmB)LakYdmw7aIL6rwD-`SPAm1GwZE}6HA?xca%q=c*er=6K z1l1dFp=b?LtJJBKFNJjbE+QpCrL-;BG$9>oa&c{q)pn21|M_RZSZvk?4Nhoev%%CI zcT&^_;O3p!dIOa8K7SOvA4R5Yc;ctKtw1=pm5!5W=H(0u)ySXo_QZex|Au(Wkb zZG4PM97A&e-x#Em)G4GQ7J@=pszB-lZQ;n2BoQ%vERl{7UZI3wpu{&hD-p3nnqZ32 z&Vm;hr`T{1>4<8mtuyHghBjuIs%k2t#^qOE;q!mKfl`w7tj*<_87`kc&sYEPUr1^V zzW4jz$*h^@y&t`ozO#%)4UWC|0J$>Cw$H#t$B3Sj1Q_FxKKq5xRE)Ua^JXR+RM$A<3-4t@r7!uQ4z@NE|z? zh4Ha*a+9&LvdFO$uW;(bF)qzqq0{c6b;7_vi?Q)3_U${&b^8w>wcz5+InZEpiIf3t zW1TLo>vD^2U8yLHX>;b>8P30Uj$&ab+j+x1Z=pFjj4u(Po>D>|RA$5x6!bZM=6Rm_*26sct;cx!sppuzvP!2HMq)~Z z-IkJ)B#zm&eLL43IK=eceeBw~i%LDAAgA5lV0K}a^RJ!Z?D3OazO)cJKo)L4ay{PV z2mywo+;vE{jSVxtZ5U-8z07j@%xTV^IZfd=Q(=O!p#cu;+<`EmC+5kvf=NOK8FB8x zp{Z<%jxF9m&M zRGy9qmk6Z5Sx=(EWh5^gR%x^hL1e3;>%&kX5+36{N(Z)N?mR^aEj8Lxs)fx*$&O{VZSzTs)s6p;?#s(^^u6IL}UTpST zBOIR0JK{K{uojg{vQExYyUo&So2b?zi9l*kwU*NB7aTh|%Mbm~hiTT~{MplhX3yR| z{NC?>j6b^XYRQu-KB5gU0%F*bm^@d(}7%f!tFl~#>p z`v_k;eF`}`PF@{E3{O%^Yp6J))@)%!Oj4RCa_PyWBK4ZO_qb{b^*XvWip~2Bzxkc? zi*A4oK(J$IjY$)tp=}r~kx@zoO~nQ#W}(Gae{~b0FOW2y!s-F?*t428Xb%okaRm)) zsG*3XB>Z}HOkYbf2}(GelNdDXPOx6~ij$Hf+Q3mOJl#Z+mq9owB$*djCyA9Mv0*}@ zq(ECj8d*hX=NPG`G%wFEDhdwn-o`MaeENY0_}Z7g#)X9i`n?`XYwFc1&IMoT)tL+E zw94Sb09`UB?|vIPuJhWN3pC<7dv@*$^%kF#q%rq?=w9yo!%uShrQ_Ul+pXA0(Hb46 z-)WbabMq}XGdVRuoTQk-ptYpP`=Mm6 zB8;|}k~ezc;wfHu=~+&lJk8wYtMs}V9!(TQG^%xyxJsN>nVg#9b+5mJ8*aKeJf&s0 zomkr^&kKx$yw~US*;jb_>8E)5@h3R?;wk19*68<5An;gE8prhWFA&EuhYuX)o_pTH zU3cBZkwZt=wtX8W^0a#^oIihx=bw9?=brfv&ph!RX3o#yN~8L%Hy#SQqq1l#Rrq5B zJpJk^&b;>8rjLPoC8eKb!DMYh47jkCJ8wRM#v!c3n_h52ZtVeW`BqYRD=93*am3;2 zok$s!F>14Qu3X8#ET<0!5MfW`aVU~N$FXJmP=yJ;RpnoIgbi|eh)Efet15|6k;Ykr zs-?tx4sdmJoCRyyP*F+bS2!8U!bM>a$|GW+@FY@(BD9pWQb&QKZ#6hU4M*Vu6uobt zYYn;gL<%4)$v`CsRSVk2QxV5A`0G(QB_z z)dALRjbz)%09HA2X97)0g+P-vhBQivWRFT!(x_Eg*$Dr+u15;EGJBQJe)i9J?|VPUuBjG3^WmT8p$8t~t6%#P zPdxrDe(e1pVekH(tSrpp`=BC6p63AEecKJ}+OvnVr%wZL<-6IwY$O0a*E5LpJ&W( zv{@UeGc_?mHH|q_t&yq<149$^ckkw^)>KrCx0b$6NOhnlWo{F)ps19Kh7B2Fw~?2u zON~e&C0HbKlT&eyL1!pr3`sMBb4K5z_NglB>{t8*lEESx>X*B^R> zn_qwP77%}v)UUOq-|3^2#1+AcAqk#aQLcjmx>{jTq)DBb`8E1I6E5hr0rC>yVU5Fx z;Bb{*g+p%B98h-1ed(aZyRsV^R&08(HNx;%%Hqmvbb2csouB8-#aCGGEHN{4iPgo7 z?|H}fqQ)d61H-Iutgx`KjL98R3YyIpl}eSDj(>;K=a2D~2PSyk&9CPTcfN`7iLn4n z#^PMYMrV!FGpBg=>8Ck&@-(Z<>!isT+b1W9lN9SMlT%Y5VcWzQh3WB6U-)~528TJc z{}B83?x!_8NTd~BN^+mEuylpF%a=KS_ADn)pJr`sm4o{av$51=WT-}(q*N;@wWLat zR55s3trp*W=s_O&`oD2t?_T!o-9>${fsQnJ-sQ^dIbM4Cd7gdxInJEALa!Stx3}JO zB$SDr4fX{S@O?#Qc=p&Uy!gtC{K=<3fz}#bcA|Q{KE_zS`?njWcTulYwqUy6IeZC+ z#ugzxjNR!;DyTM_Tre9fR6ykxB|TjU zJsejr&fu0dxU{fNH+NJMMWdowm|tgcWdoZukj}EOw!vEN7#|y)qop8<6tOCJ z&-dNM|M^?L&5ykIhxvzp{vuZ|&hXsx-(hy{68HY-kFc<`#Iw&o%e&uoD>q($BQGC) znf?0?uvw7ZvHMmI9J+z5bD2s4pZ)A-sZ>&o2zUoAH;v*E(uG&QbipugkvNeA9Gl7M zcYERBk0OSKTA)2rg%7ga7)A%H%*@TQwA5y1ZjGxe>!`sVkyk8Vp6B%3QlRs27XXoy`%r>~*O zW#}FjND3L6mqG|qDXDICjSZ0!cpqM7u{Bg==o)r>s4`VWNO>1dv#30=4S|TrONKj0ign&6AjkgD8V?vM!(Nm;rWGM z{Y}!L1{+xq=c1Bg(nY0lvea?!3{U0blM$stT=h<6c;aEpvZf~v83Hw=HW-4WajcJ(>umFw0jo@g)NE_ zAPUCYU>ym2SZ+MHn@C2Kk}%p?kNL$_;wYkCse)8!B}rru&>9~gn*kQ>u+Cyt*t11a zf$<1uOB@^6A^@1AEkZe0g}oTYBPpjMmyU@K9E)HWu+K^C%tRhsL=&v5QmnA+n7wQYr?e z#2V-d1+k%}`dAkS$DTDPXM=u6WI+>Vb%?+_s0xE{;e!V+$fc%MCZKZ%g;GRL(2$ZT z(_wXS38@vC>67IVy$pIT=JNVFE4?ms`v{kF>GD-B&(7oeU6M)&ZLQ@!j$N8ZRV%Qx z!o=7x(>t~?zqY>hLG%6(ypvz}#gB6MhU++a;#EHP*}uf(fjAjXA<0m46l1&Gdi`PU z`)|L+AN}rsW#^t9zqCQBcy+UR^Nm3a6z0Ln_zU|G8}(~?%X-*1DbZb)k#}3(GhJ6Wb>kt=9O)!{6lYH@}Hg z1_b2GXOHvNx4(rvTPJPCeCc2Br!t_p{id7n&ZC`RZf%K`wN=i(c7cl4Az&D%pftr= zn*sqcLh6{f4q2~TvYrFc$5~U_d_vnGK*jL4*1qnIjZdf^A$^-go3Ig-1n-W^Is2rAVon-aSU8Q9-KBT7(B@G1g#mi!mOP_bG~;UOz|b zn8D$p5`W}~qX^+^cps6(DUOJ#v2DmiA$3F=S4m=x(g{Lo;;2F+tr5pTfQohW^NfCx z(XcHh#)lCY(pYl&(kYG~eV)Z-&9;fb0M|Ayq)4SJ9eDxDYg{-Ktq*csg+m!n>|nH2 z!y?Iy36-S6kd+QR<3gz!2OUo67dUUZp4@!+>x(QieT*MTZcK&oPk+-M&2ZKy&gy?LY<* zv{MKfj$`sb>6bXNUJoTCQCuS*+|KgwBz>JAy6s@JFR3<3tIkk+k?8ny^q&7VBJWVE zS19s~Zf-%v?AWn~i6d{~%I^^e8rZ#3Lgm*As-Wcn5`zaV`qsF|W`n3hBvy zk4_OGH8_=`YBhYCAe`XB%raBsYb>vZgK&EHH0RErkvHSSMr#{W(=x+MCVb8vU zRBNECaQ_$onUDPRM|jWOZ=phrGa;?*ox>Jk2W$bOLiI<;O>AC)BIeS<63u}DmX?>9 zn4F-O*#NGVo~6|dPG6iM);%h5l_aeb%Ru`v2yBTT^s3asNQd!~%!C6Z_8}o|`$b8+ z2?vz&;lD466H=v+)>D`+HqXFX5@HI~XF)qs?@7uoa9;?t3mUb8&@puilyhjQ=n75M z3t|g7nhhODM9mV*u^|J&q6I_*4`8NXT|iCK8^Qh}@L`5Mdc;4v<~G zNWEUewT4Nf3JobqqlA%IGq`%0-pMEE&0Qd_zfr|tKl@zT#*YBFZW;rIQ^4MdK^UFA5Z+PgT2l&LNKf@pY*?%XFgLbUb z>u~?K9z+Vk(&`#TZuo;g`4pXv4e}zx3B?_EypeBw^D&Ok&T##q8#uWC0K4`~6A4X} zO0c0%om&%D2Hs)435--5E*>6_@fKlhS%33LsZk}sTM;_aQn->OUD|9)rm91rC#H5# zYYuSm@J(QP)RUMvmZerlqLOv0jcTClyMnY)r`qd)(By@qFc#-L#ulMhvejC*Wc?mW zSnvhLIHX9Z*ITq&Ee2|JT8$b7hJKObyrn2Y)k2u?`{G)Y5QT?yhiBGQ^z$0c@6B84W_2~tOhNRr4HEhJSDNGy?(RBH)|7D(Bp@JmPy zNfhCVC}@X@3?hYd0xvbf*fPp(0)5_nO^j$QHr9h9l}L zG@+nfr~+lf_{KT{7{HW<_f5AT0xeYl)JlsNVKk~$uv^5L3O0a9VVy;*tzK2cLJ%AEr`pt%(m{cVf(JEpI&h@cIBFY_%&|qz`MGJ7=qDygTLByr`MXZT% z)e%;QCh0et$o>j(*%RrD2vM&wG2FY+K8{&mLDm}#3^nOx1+f+^tS*t-9JjK< zo;%+`Jhq23tLvZ(5)_eCVGpT7u)`S7YPtJV76z5ZDCl8P7EkMP73kMr&~zb#q%PUwM6dC>A21U0`W2jD?)=AF23Lu2-jk>Z88?vhu})GE zmH`p$pE-(5gu}051N$>CsV-4zknvK|E%jgsh@=MLh((~A^vZFlQFftWh(UW0UIN?3k!HP5(4@p{On2eF7Q>c?CS$g$V`m5_`$^zR}=fcO&SqOCE6|KxxAYhAM(l1(#oZk=a*Y=H|O^!L^2Hj!zO* zQr0eE!ShLQ9%oZqRxhgp?b;>yyKnRFg3wYJ=EvcdWLqAVq4fl=b@}QG{(%5SP|la50ExH3Z@S6p(mt)AtfP{~RCJTUW)o`-McyZk5|pSS zg(a;&r@)&&I9cM9*pgWqXL0WT6pig{RSO5ydIiW*C#9yk_RWT19QX#%wwx z?Y1dOnCmX1RPaw_uCfCd6B2+jfER?dl+L213UPnnXmCV*VYLb*RiC?76vl(kv8u#r zPphl>`Wv4nSDxSd-T#@+Z|fNR(9A>t=k zZnY{lFh310pxE8pr?=Q+dwZMT`o^!4wi?{Mcb7O#C}%kf?FP&9J=)C{QKYCvnw4&Y z8{3DhpFKk%3j~T@Ta&05WrOFj6*swbZjCsNNunBh!*hOlfz9QV!DNDtTD0pm%9`d- z87595_9somUaY`YbqTwvD@=Q=1fX}#hwT)^q9%LqzC(ZO8r}Ii({av1Z;97ldY*Q(hbRp~L98^_M>)@)yTF-V z6UaE2M2M*gW)KALjjdKxpC49H4L zA|px{3iC1wvd*}kgc&U!Ej8YG;;2q7Rg@-_Xub8gxC$Ps%BANE@CH|UtUV=iN|Z`S zYfZF}L{XqXXy>q2RCg7R*VT>CI}(`$tGo|#ROuhT+E=(d{`-A9rrjm<)b(K?T{;Q{HKqc9m+UJ$8>IH?gSNg~0QDxBhRcyDl` zlIMyFO5ofhSaF$WIOm9E6gqjQktl9r-sQsLDnGe)j|*p3nXAWaF0AwTW{=&&L$1C1K3AW8nxmcD zsCRzA+0U&qN+gClri5XUg^wpRk|=~7q7)THWF_R*KsLm?g3NVO@Cm*u&82UMTG-gWr&G{r;Vg^1|uanjV53jBcLZW zj*=k?^oV9+Z+aJj6bXW5-I6XhG>D4#N{7WA*wwy#4$Cmc=Mx zq1EBV&wrj~DrwguT4}=ZaKcYMzRB*vA^j*r=mA@Q_NT1;{R?FCYqYG!8z{0V@yB;z z_aTP|4=L{NQ0(tA*#4MitIlG(#<{sw_UtjAe*F_{F13+(X0rloA=Xf@YX&33(Xfy9 zE!xfSy%Iv8lwzSC5!Die7D(YK$1|Eyjo3=cvgBkm;_6GEU~CWg=wOGVNuLkz-X@My zUVi1Xyz%MJ^7+qwkr!ULN}Q%R84mjg2M>@!W4)m)EVgtQ>#)v+?~M>u>ODxjsSFZ$ z9Y|zSR*Jiyj!dbT%u-5>H-S|v6tPUg3d-9`TvYL68+H!JJcJRa+Wi)Q#Msf zuh$53`^tf3UDy#Qr6@DdDkY8uQrS=gI4uVfzIXw$9tWL~vH?5hDlUo)FOMG>7w7Yc)mJf;FwB!db! zaD^nc2_DGo6!&Pj6!suOO0-bKN>TbS$`MLY+JIC`MT7*VMakiKK%_Nk9P|2fS6NzK z;Lgq#?|pQG)rBtIdJC+qSbGjF!+y{BAboXClBOxbLs4c(5m8iXnJAnJKo}%CIM}4b zJ6k2X!Wc=HAR>t)gobh@aHR`^Q|E#S0JT6$zuif;AM66~>MMVnXTS1w`fIC<8!1_T zmsCJe9bOvkCf)py=?6b#``Wu~cH7*4xXWuVT;=%-=h^6X=++Ws5~>e>wYbb5eDhCv z;>z><AGH{*@{_dHW<$w zzNRtdjBGlkU5{zTiup53h?N#ko|~s#k62!)Gn-9m)aoHRF2n2M)Z^!zLraNPA(|e? z5w&`ZF-6$z#u6<&%7vOsD9QvxoRALKcO2bzVWr6 z-ru3{a^hh|KZ2)V*R`P%Cn!O>2Gs*a7=b^Kz6uK zcCv#X4bZYiBs5vkXJzvO-gzE-<_ccTSZ=oIwHvhR5&5(vjTA;38c~C#g-wpO54nGM zLa*1OR32#!Nun_2nD1YE$c^n?3a?mQSYUm9fn=%6`k6I$TuGcLN($m`%2Q81&83%L zxG6=9zop?#p68EFxy>LFS^R4YNLs0=`QW2G5r1M4fqwUqI6#QnV? z^Sv%bHo=ybD2}S64M;7Ct-$Lry0JFUI=l}HZ6Rc({0Rv{t0Igwj{w+s6^ItHf@Z65 zo}$`+1(0^wRfQOCa6UL^Y0vct!J;t_?r-xqe|?SZ?L8W;Ii7v`IX2eUP?6^7=qQZ5 zDx$m~%#Baogrd5wNuf?HUx5u;?cTfz#_6DKj>6cM;PAqo>Waet&Ehd-j*=1eREOQ1 zEhr0!R2&E_*5aJPTU!Z+Bdn7ssZlaQ6H&SXfumXNKEil9=hpTPy;he`zwjzgU%re^ zBxla9)9KZDc)ZIuzx5_>zk8i>aLjzC9s&R&!dS@45M@u4MyCpNgz^q+!x(#3mZA42 zp_#^&S}Kgclv3fv<2=F;3c2#9E;^wk%2`Y#m}FBFiZqV+@T1UEd+pOd&nv(B_u0Sn z1limIvxD6LhZdEm(Mx2MppK8Z|M4~M-QHo8^!d$S`W4QvEzzh&%#33^9EW0Ws`=7$ zSJ6W8r{DQ5qmgI-y|-E0c$}OZt2|i=kw`#kY;2Lv5mPcOCY08aWP(&jL}(%=@5*I6^l%q-ji}k#J^Xk**TF`s^kC?>FC~v7Uwkd36&kt$p+}7e=@t-{XDw z`de24=}V7~suH$QA)a3)f~<827lul?vA7bPvluc;3|NIVBAkqIJbZY>U^F3$;%e6q zg$rwe;Nn#59v5d^Tv}KmcqG zmDVi0&4JBb6|@RzWf{A$evk@Wfr=H=q6qw1;c&L#_J<#H@v}4RxbzsA}p z7m1M=6jKSQFR2S?;EBCwA|fW$&9-!&NI*jfCf2g(3N{ZOu#r#c79+CJ02ym&%u)0f zcvx$5Ep9PXt>BK4zLHTpVjFsY3Qy)E3KXfdL{1P1fmeu_Qk8rjAv#9w~vq5`_7+nZ+A#hdKT6nC(*hlq?jLgb@duGG%|dQ%I2fregA!Y>6sN%N^hyBHIlSO zX&t_lEX^%as|n7XSwp4*Cna79v`>P?okj>yZK)y}jXFtOr{0M1CdYVB>B5LNk>G{Gcu(#M zu)z;VQGjw}ChT==5lWj9k5Cbjssk{YP6KWR2`WLyb!xUi*&@WQg+-IFwSUNCYis=C zmwtwqu0BJjoq`fL<>-$`%+=ex{_<;_yYLvdKf1}z{Rgz`ZH)0KZ%JALC1SJ>+*pII z9`F{cEcHeW;XH{BHwV1JI8RNvV7d1KsT5WjR3!|QvF!H8eD1}o91I8i`Tzd!nf~>k^Xg~6hKmzMrNu>p!~`@RRnU+xn_xyV$g0R(gamm2Ecgv2 zLFpP(S1=KZObU`lOq41R9;0#!W+cP`<7P61waj^&IWpr|u-{>ziDwC4!en$z9Te9CLFeyFdZDCWQo#}#`*gUIeTe?xirPtz?HVb((E<(!W*CAogcnKtYc)eMlW9H-H*08vwogSo9nF9 zTZ~P~!u&ETOY>a5xWQn#!?52+8q58g+n9Qr-3L2FX`ObrOFc<&#$uhvh_FvLQAlWe z=a87-cohO`O1!g_!Xssbu1rUuky2Eb1`(zuDoo-;H9A!ycxHX2Z*!GNNLHOw;-tE@ z3knxfrAjEgad=F~(R+*TbvkGnBXqdQg>j`uRzk;itAlYF&XriFD$`L6%7l`2a40?c zGhO|#2_eEMuflnTg=fVoRbgl6tB0l30gR3PsZrgX&WgRK(Nz5S{crOJ|Lza?@ZH-) zUh&Mia}=fLcrxIi-wz>z{xSdTpZ_+$dE>w2AN}KhT>1Zku-8|6EQhR|fZ=o^Wi{{j zj#wy!Fd!Xsi!Ivi7OpUqXs{A31Wp7Yt8jtgsj9zIVe;@WHv(7K$}zJ$8iG(Co5-lY{L+Krd;~6hJd4-McpYhgTyvg%_?>fn) zr>T_%xjE&HI_6@5vEZVJ(kUh`RCp5YkVcSWh)hY8c>2>JEuXR|B}IRa;@~zXC&$d9 zglsxsviE@b_9~59lPsU2wc=!KIh>uaKkk#%ViKjuCOKLqWX7@7YooAOQBsmot0ib% zfGx?!j^q6SXF4rje&#WL@o#;KfAzoqVP!3+;?xH5bfg5PlCat==j_IMc+GiBiNusS z)nS+^C0n$I4p=LV&~wHhX)5lQ9aays6LqTG+T9uB5djK z+Vb}MACflfJl1OQkAC%MIX>A1Z@7Qd=iw-0p}Byua59^6JSsRElxP9N*^I-fVdrqj zy?gsC=YrC~;P{x^mriIWidkNQg4~vTyuC+nbq!?Y7V{VLQyzmcy zo1F&_>3{Fr$SC6K)6ekUx8CIOr(R_Bm2(&+D6teuF}C3~3E;V>#1mVv3STR)!h@7*8Z3lyTfSyw7}Er`Jxn+ux_N z`UH*5WpKgX>b{xd+|Jr>phm{>O`60`A>X;r=NbBQU3@b9QqVL zCcwy&v*%XW{wO7zO;OU*iR-*@`6AC>eu7$_vz_iTla6M)!P%uQR3bp8t+eaZ{a3(x|<79;^3Y2ULZvF(}^9`O-_c_WwwJh?JP{v=-q&aH@bq$RLswr?Oe4aiyug zP@zK5n{V+q-~V&|-M{$*p1$xDU;DK;=*4vsEpfGQd&*`7yGJM7*xusZ8+Z6${S@4%F^)#dv`ygKr?tK7>+XWd;c)+$i{ml3PfpOTz?LNk2fKW9>mH-yA^AiRYk@E^?|g8B@p#OcGt0d3 z$|w2w_Cvn)-5;^IvW$|Fh~V~g)%QdxjZu<~)zz?%)$Wn2QkXK>$1Am%cR`tEu@$b( z;DyB4@bju7!FX13_s%w6DO8l8Fwkm5|mm&c;l1#@t++XOne) zaO(~iwWeG?&r#e#i8_tau`tarlY-fFin@Lsdwk4fG{Q|rFc`vch#l=SIl9i7Ph27^ zWB)%NMjl`y#!`+?aAt;x6omql=R}dGs7s!D z`6;{^lMiQPwo7+;jVtFb@Rx7?1>?yCAr(rvAO`oIvOnPR*-flcXl+S+f^ZQoa~S1m z*Ai;Zu(r}B%L{B~DN09UVUhac3Q{E$(_?hIi$~xpOk;Q*I=nN%`znG*HQYYJq)$|9 z2FFiD&_cLSQ_>RQO(iD}7bfW~T56n+LVZF-2v=d-TuF%q5e0=E5Lf<5%5YE-R)pG@ zvYRW2dq4PQfe$VB>5;gINaht{^?)y!ljpZ;jt&E#YJH0 zIZeBf(n>Xv0(W5(`}}hZFnsUB8~lrZ{V#d#^*89ux0q$KV5F`(MArV4F2H}XthIQA zj>%2V&iy`uKz1(;U^1i&jw~FMHY|E^K{70GXcV?Oo}Y5;kf96cl}9HE<-nkEXrzZ& zD0CVjVnsPC$+ChME??ofXP@WN6HhSTZgXaN0Xdss?1l)?3n%C z`&_+vnQSuS&h|b@6d{}n54a?Z#;l8xGOErr6`n{rl#<{T(pa3$FclqbuGJ+?1C=p~ z6O=Rz2Lpza9P2E1x3(CLW^Arq;_JWhPf;(t%E878hh|7|)JLn}6^y)LE|Oth@4zdA z^`1D2*f~0``ip{k6mk9T9jxCB? zHX4X*O4>@uZ{ETW#`KR5$(MUHl9bXJtWp$#CKXUv#^J2PdC&35kefGd^1-!R9QMad zijw2OkWRD7#?m|=-};Ed!(BeO)n##giB~`QI&Xb+i%5q3p98ekl?`4}WEn3#eYHZK zfi&UugK(50qNqR#`f&S#ArSy);AZPF31n0w);xy#u{*$z-x0YBbT1k^4 z^ZexYO}vhX>kXFImU-Ck)80*})lwXa*)Zes<~orr@R6j^NGQ#S!u5j19gh$t&XqJ9 zO`KOa1tLzcBG6r&2{ItxOR>8f#!Jp5IruChXV$aK1DHMIvr7tjS(CM?@fpI7s_JpM^k-oCunCibVdDtPhJCx2MkNU)Ufvrea zvR=bYN@P(4CbF#{5yFEB^(pC3-LS60tmWvx`N8)C>(U!$CZi}bTv33Fh+<8%Q|IB% z9xp!o3TfO4q!StTZMxbs_^=T{oC1!k-;2{L24Sy-w+J8Rz1|1cyFiA7A`*iQqemMS zn)AI5Z@u*{kDocqYO{+ZXEvT>iwO>C8D!jt(dW zLn7hAzOQM$QOLID7_HYk?tCuceq+pm8G@=gAoSzS`iCof% z+r0G5)6~)y^PMKGMoOz*;U;D=Ol?6~*wb7ccoar$XcCNtA5$9IpJS&1vBARWD> zvovIi?5?4En%D*sPp&E%t`OvM#BiE%JQ%Zc=K(W2rBRDmXtl^D6SlT?*gYQ6o@=qT zy3CW0Kfzq9!%C9!%=#+(S3vx80m0mobk*iCCkelCgUkZZn4hbg{jH_9`im(Lho+fqmeY|Hk#yF&Rmj!lCaoUoTWMRuGV<`~ zggNTG@XR@W?+?Gl7ryp0VJ0lWD~nWBB_o8M!|A#zYzgVZ+1Ln_)U5WFC_SJ{oL5LI zh^SFk#dd`V$|)P{9bgfK#Ry5F11Q%CP@)V07I!)?Es2yzMjGiP6eXs}LkhDjS(@*$ zb@Mh_r>K0&_~e8dVMGym&8)}~g<)}_OVVsInhv@0_*ve){vPwoOPt-9H0f$sIG@P?35BuyM9?+ee!vduV!Sk}n zD5hB`dmG1KG9}Lov=RCD~8Xi2g;7>g5v>I%HU&!hJ>pZqBIXO9DI-AjJw|VZF zXSlh22NhXtS<-3MQ3^iz-~%)bgpmvfGrFxNmp9Kd$--D{u94E;-l5&7)0>+^X-&7) zVQc3hYa1Js#$r=VvnFY#EtGV`T5))ySzBJF)ehrkv$4pz^*PQiHYtjdI1;4V5=)5@ zf+9*FZK0AHswhx)ifb$|n-0)G2Z+67snNm2bu2MD_vo1+dH8_Q-ae)!*go3h!#hJ- zttM-o9w(y_*Y0j%Ycc1~o@J@mWwqU8)Sq#(zt6(OB{o-U9L++$!d5(3e1!HgnAWw! zcm^Mc`3M=PPy+wvfNsOcaE|q=yqd@;SsTdnK77Ii7O<=1kgsk-eA-p;}IB9R_C4w zmq72rGW$0RiopmcX4o>PMnc2Hlt;&u!XP3=g9b=PBukEu5BMj)@lWaH886y`MV}*m zK`AArJ|%KE3(7 zY^(Fzqlcdhe&Epcw&czQ_OJ_6$6(5`J9tMOGeL4t7A2&Xz{3hyhky9~+Fib)w9dEtsI95@+nCc;t89#_fmu+}qlsp<=FFyv$?gR=Gc#GMSZh+f9}`P4a2Z@_d^s zkDuq@1ud}{-j{c;Nae}fC)O0N@R#fP7Do=O- zihy%dXp95t6jCXoR+GVGMye&Bz4APr7gHMbI@V1Y&!+4i9C3Z;KHvZN9su?F64Ob6 z>K{|DL(%Oq8Vs>$jFCakEG@CE2FKD;7varUMnPTF+1Q|a_8jYTJ+w994cvN!n-DRk zoM?{rB+fgI2D?}@=InAXkb9jn69Su0X%}Pmb&QI`h*C(8bb?f9yo4!`S2E`S+?CZ$ z)nlzC_LicE@Lp30PgyY>o4TZ3P8e<9;>j<6iH%l^C^Dp};CNDS{!9;>1PoV0q%?&j zE*%%<<`|@g3-b#swi|Ss2`h{9v}!5SBIEFAg!eH@DN?CvBu&=l=Xr2AB2DY$lPPPD zE%Nxqb)I`-lRP)f@{;#%eZ&vny2k4ITCfy|h}+w@|KI89`NgnL5vqz_RmEf;2`It= z^|Z2tU_2Nwo6MN+b@|e#UgELMH5TT(9A_imy?#P7nny$_kDpm!crxVfy<@)g@@1B~ z3#_dzu{Pghx!FJ{0y-`C{OJ01zWw93Isf?$*5|uCSX^XcJ#i9Ik7IhZ1=CR3(h_Nw7J%K&pvygHj2qo}yF~y2nJcqBhN5jd(O= zG#sI(27BiKJDcJr873_CB;BCh4@iFbB$=nM|2pywk#Lm4Pd|sj+ zyTFCz6?Cn`WW3En=3ttGs)q@W3x{4?{iE;{A}ElY3UvO4cO>JCv%OWCjT-vWC2ri^ z=E*Y`SnaLx#QHMQDSC4wqI$~a$`Xr>W;pb1Zm@Ot4r%Lrkj<7Q#*TxyI*L#=NfKKy zv#@^?Fq=(7kJ}V@6QQ-Nq~I256v`_kmQo7z;u34kIqtmo5yy9K(d}r2)Qn~&Nw3b* z(md9fpc=zd=9cMT#wS1fIo1UH+yCKTvRm}ona=3vC8^ScG=O9=iD*YLy?R0?1`#P7 zC9?Dol>z5jD0D3GQXp&;R!hopFr2VIo>Vj+NvtA-E72-INtBdmAW>EI0*GWnO$3p9 zBl0+5&{5zxM=~Xed^iwGg^&eG3-lL0^J1toD1i|UV@f8YG15xPaz?jUV%V;Q{zk=V z3q|xWV|F%xOGOnAbv`)m@PW3VDyoY0VRr)63r5N+Gjuv8rAivPM`icXsL$QIH#zt8 z68*sm!_k;lv&S=+7Mb*qxU;=Qqb0d^dz<5<613#<`3)|dS)eeEZetFYJ7N*KfWn7| zt*=s)-g=z%L0BmW003K}Y)&E_b)oT2VY~^8UTr8$Mx;`l2&WD$!!}U3Q2MOZm-y<} zf0Nh0{CWQRdw?V*Y%#W|9@ybw=ucR_{6CNHrV)q!+ zyW8lkdvxbpm{y%htHVq>gtMXSjbs9pMuL*zYo$FyFSzpB>-_G&`k(ma*FKFk5J^c~ zmOtuHD;V zsoUaH&pyR__x4a}LXqWMJiEr)d;?($d|hCiq(ANQ@XRvxc7id6I{w!@*IX|G!^pnxaGq6?M8D&YwHaxwUzI=5w#IP=}-82`Bv#C&%|`w;Hs1 z4bnIzD|5d47jNkVpr2;?Eh)_vN38O#j3=`>@ zdO^E0N4FlcG&j$gwRJ>hn5(56<^{`3b1bgRQJ|1cFr17*z1rM3aKePWnHK17lV@Lkk-vJd zPt*{|8r-|F1BGV2wnSQbCWD;JmZ)aJ%2J1~{mkcy9v*P-+&NTv!r^2;CQ>q9jDAVwxFt2SbuxgupWz90Y|=oRHL-Tmp4{NW${E`Rd-zsL3W-(@_SGQZeGNmq$$laL>S0Q=zufYjqJc z`Q|%6;_+909oM?b*dF5_+#wMMq!*g(*A+Gv2y2iUw984+Bwmnda8_V*LFb8QdGd3w zbL(V>4c+*En0n8kOV9g0@4CxVPkB#!`@4M?ODqaOu!s~%(PBhP zv>esM@{E!Xi6&(tDUp+zBz9s&ahzmqkEKNMXrjm&i;^>RJ#f#{G{#%bo@hqali^Y=Kx7>8HT3o|0t>X=H#9WjS><#nm-cQ4*6< zni7O2O;XCbT%NWAVlRpUTF<%$Ph7po`Cgw!BuTX-i8RIrQtW0wL$7)7n{$Vx$`pcTcCXhb*X!di#bhDM)T=dZl)DNc%- zKmE!#Ihh1QhOm}?ugR5*=g3q-E05@{wAepA8!TE zTGo4gq)x$W#*+mb>+4*9>@u6}lvFC*!f<5foGxQG(hFpy*j(-K>|)5h7yg_@l~Byjz!@wGl{IL!S3{>W&v9ZE?DoNvfD-AOnQOX%I3+)H-yoeT7dzc#SX-HnnIO2w5u9 zn8+fm4*!-9PDzx(u|T0iuEk4qJ@-tEq2G^5geU6_aG7L2uldFcU+4H>OiCNQo-EU( ze#vz9Z{P4(8r7``08@O8Us5Ez4IvpR9oB|NaOn)n%4JsVFE>g=xav9?#*l8|c>3Do zT-?}V(8y3-M^P=P76nzQ=rkIf8+4e>PI$Qc7QXYZTyn# z7UJ2D@}hp(BauQ-`{l-NC3U5c1b?8{k0|HC6ycX$Atj+oZ=w{GRmtvXMmN^962+{ZBb7oa!7E3HY_?+F z_tXx5@YO$IQJhc@HknTh`N|W-Zi?Jnu-P(9JDOQ8nU$8g^Hd^C1&q=(ykxw8NMonR z<&S(H|M-9SU-{ruPw*q(|6z~@9Vv##Bih-3?)C-$mQ6=>tDR zoFv56f`*Qn>OixIox}>zv81jg)�V(}xad;VY!Hs9Ivnim|gSoF|eAMwB=YQKV6| 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�QPwY^V_ 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 Ar~m)} literal 0 HcmV?d00001 diff --git a/wiki/imgs/Source_and_destination_pose.png b/wiki/imgs/Source_and_destination_pose.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d56372a9fefdfe8f1fb7539991f007d6ce6a0e GIT binary patch literal 143594 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 ->4mTh7XX3(6!L!dmyvy>~Fgf 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 FT}It(zH_W1*HPp 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%0A4{9$Ek?V*Lzh|cDGR?`Aw4U91k58Q0x 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 FV1l2zD`fxx literal 0 HcmV?d00001 diff --git a/wiki/imgs/pull.txt b/wiki/imgs/pull.txt new file mode 100644 index 0000000..211caae --- /dev/null +++ b/wiki/imgs/pull.txt @@ -0,0 +1,135 @@ +https://web.archive.org//web/20150911044130im_/http://wiki.gimp.org/images/Source_and_destination_pose.png +https://web.archive.org//web/20150911045003im_/http://wiki.gimp.org/images/Depth_of_control_point.png +https://web.archive.org//web/20161024012443im_/http://wiki.gimp.org/thumb.php?f=Gimp-2.9.1-screenshot.png&width=766 +https://web.archive.org//web/20161024014259im_/http://wiki.gimp.org/images/Gimp-print.png +https://web.archive.org//web/20161024020253im_/http://wiki.gimp.org/thumb.php?f=Gimp-curves.png&width=552 +https://web.archive.org//web/20150911043907im_/http://wiki.gimp.org/images/Macosx_screenshot1_thumb.jpg +https://web.archive.org//web/20161024012443im_/http://wiki.gimp.org/thumb.php?f=Gimp-2.9.1-screenshot.png&width=766 +https://web.archive.org//web/20161024012507im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-info.png&width=582 +https://web.archive.org//web/20161024005927im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-text.png&width=582 +https://web.archive.org//web/20150911045003im_/http://wiki.gimp.org/images/Depth_of_control_point.png +https://web.archive.org//web/20161024020248im_/http://wiki.gimp.org/images/Wilber.png +https://web.archive.org//web/20161024020253im_/http://wiki.gimp.org/thumb.php?f=Gimp-curves.png&width=552 +https://web.archive.org//web/20150911222131im_/http://wiki.gimp.org/images/Blur_dialog1.png +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20150911041158im_/http://wiki.gimp.org/images/Dave_Neary.jpg +https://web.archive.org//web/20150911041158im_/http://wiki.gimp.org/images/Dave_Neary.jpg +https://web.archive.org//web/20150911042651im_/http://wiki.gimp.org/images/Oyvind_Kolas.png +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20150911043907im_/http://wiki.gimp.org/images/Macosx_screenshot1_thumb.jpg +https://web.archive.org//web/20150911044918im_/http://wiki.gimp.org/images/Mac_gimp_logo4.png +https://web.archive.org//web/20150911044837im_/http://wiki.gimp.org/images/Gnu-head-sm.jpg +https://web.archive.org//web/20150911044918im_/http://wiki.gimp.org/images/Mac_gimp_logo4.png +https://web.archive.org//web/20150911225138im_/http://wiki.gimp.org/images/People2000-small.jpg +https://web.archive.org//web/20150910163330im_/http://wiki.gimp.org/images/Hello.png +https://web.archive.org//web/20150910163440im_/http://wiki.gimp.org/images/Plug-in-menu.png +https://web.archive.org//web/20150910163420im_/http://wiki.gimp.org/images/GimpImage.png +https://web.archive.org//web/20150910192620im_/http://wiki.gimp.org/images/Glade-tree.png +https://web.archive.org//web/20161024012507im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-info.png&width=582 +https://web.archive.org//web/20150911041158im_/http://wiki.gimp.org/images/Dave_Neary.jpg +https://web.archive.org//web/20150911042651im_/http://wiki.gimp.org/images/Oyvind_Kolas.png +https://web.archive.org//web/20161024020248im_/http://wiki.gimp.org/images/Wilber.png +https://web.archive.org//web/20150911220720im_/http://wiki.gimp.org/images/Somerights20.gif +https://web.archive.org//web/20150910163330im_/http://wiki.gimp.org/images/Hello.png +https://web.archive.org//web/20161024012443im_/http://wiki.gimp.org/thumb.php?f=Gimp-2.9.1-screenshot.png&width=766 +https://web.archive.org//web/20161024014259im_/http://wiki.gimp.org/images/Gimp-print.png +https://web.archive.org//web/20150911221650im_/http://wiki.gimp.org/images/Blur_dialog2.png +https://web.archive.org//web/20150911044130im_/http://wiki.gimp.org/images/Source_and_destination_pose.png +https://web.archive.org//web/20150911045003im_/http://wiki.gimp.org/images/Depth_of_control_point.png +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20150911043907im_/http://wiki.gimp.org/images/Macosx_screenshot1_thumb.jpg +https://web.archive.org//web/20150911044918im_/http://wiki.gimp.org/images/Mac_gimp_logo4.png +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150910163454im_/http://wiki.gimp.org/thumb.php?f=Tiles.png&width=800 +https://web.archive.org//web/20150911222504im_/http://wiki.gimp.org/images/Blur_select.png +https://web.archive.org//web/20150910163420im_/http://wiki.gimp.org/images/GimpImage.png +https://web.archive.org//web/20150911223242im_/http://wiki.gimp.org/thumb.php?f=Plug-in-details.png&width=800 +https://web.archive.org//web/20161024020253im_/http://wiki.gimp.org/thumb.php?f=Gimp-curves.png&width=552 +https://web.archive.org//web/20150911044837im_/http://wiki.gimp.org/images/Gnu-head-sm.jpg +https://web.archive.org//web/20150910163413im_/http://wiki.gimp.org/thumb.php?f=Architecture.png&width=800 +https://web.archive.org//web/20150911222131im_/http://wiki.gimp.org/images/Blur_dialog1.png +https://web.archive.org//web/20150911225138im_/http://wiki.gimp.org/images/People2000-small.jpg +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150910163440im_/http://wiki.gimp.org/images/Plug-in-menu.png +https://web.archive.org//web/20161024005927im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-text.png&width=582 +https://web.archive.org//web/20150911220720im_/http://wiki.gimp.org/images/Somerights20.gif +https://web.archive.org//web/20150910192620im_/http://wiki.gimp.org/images/Glade-tree.png +https://web.archive.org//web/20150911223242im_/http://wiki.gimp.org/thumb.php?f=Plug-in-details.png&width=800 +https://web.archive.org//web/20161024005927im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-text.png&width=582 +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150910163413im_/http://wiki.gimp.org/thumb.php?f=Architecture.png&width=800 +https://web.archive.org//web/20150911225138im_/http://wiki.gimp.org/images/People2000-small.jpg +https://web.archive.org//web/20150911221650im_/http://wiki.gimp.org/images/Blur_dialog2.png +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20161024012507im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-info.png&width=582 +https://web.archive.org//web/20150910192620im_/http://wiki.gimp.org/images/Glade-tree.png +https://web.archive.org//web/20161024012507im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-info.png&width=582 +https://web.archive.org//web/20150911041158im_/http://wiki.gimp.org/images/Dave_Neary.jpg +https://web.archive.org//web/20150911042651im_/http://wiki.gimp.org/images/Oyvind_Kolas.png +https://web.archive.org//web/20161024020248im_/http://wiki.gimp.org/images/Wilber.png +https://web.archive.org//web/20150911220720im_/http://wiki.gimp.org/images/Somerights20.gif +https://web.archive.org//web/20150910163330im_/http://wiki.gimp.org/images/Hello.png +https://web.archive.org//web/20161024012443im_/http://wiki.gimp.org/thumb.php?f=Gimp-2.9.1-screenshot.png&width=766 +https://web.archive.org//web/20161024014259im_/http://wiki.gimp.org/images/Gimp-print.png +https://web.archive.org//web/20150911221650im_/http://wiki.gimp.org/images/Blur_dialog2.png +https://web.archive.org//web/20150911044130im_/http://wiki.gimp.org/images/Source_and_destination_pose.png +https://web.archive.org//web/20150911045003im_/http://wiki.gimp.org/images/Depth_of_control_point.png +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20150911043907im_/http://wiki.gimp.org/images/Macosx_screenshot1_thumb.jpg +https://web.archive.org//web/20150911044918im_/http://wiki.gimp.org/images/Mac_gimp_logo4.png +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150910163454im_/http://wiki.gimp.org/thumb.php?f=Tiles.png&width=800 +https://web.archive.org//web/20150911222504im_/http://wiki.gimp.org/images/Blur_select.png +https://web.archive.org//web/20150910163420im_/http://wiki.gimp.org/images/GimpImage.png +https://web.archive.org//web/20150911223242im_/http://wiki.gimp.org/thumb.php?f=Plug-in-details.png&width=800 +https://web.archive.org//web/20161024020253im_/http://wiki.gimp.org/thumb.php?f=Gimp-curves.png&width=552 +https://web.archive.org//web/20150911044837im_/http://wiki.gimp.org/images/Gnu-head-sm.jpg +https://web.archive.org//web/20150910163413im_/http://wiki.gimp.org/thumb.php?f=Architecture.png&width=800 +https://web.archive.org//web/20150911222131im_/http://wiki.gimp.org/images/Blur_dialog1.png +https://web.archive.org//web/20150911225138im_/http://wiki.gimp.org/images/People2000-small.jpg +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150910163440im_/http://wiki.gimp.org/images/Plug-in-menu.png +https://web.archive.org//web/20161024005927im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-text.png&width=582 +https://web.archive.org//web/20150911042651im_/http://wiki.gimp.org/images/Oyvind_Kolas.png +https://web.archive.org//web/20150911044837im_/http://wiki.gimp.org/images/Gnu-head-sm.jpg +https://web.archive.org//web/20161024014259im_/http://wiki.gimp.org/images/Gimp-print.png +https://web.archive.org//web/20150910192620im_/http://wiki.gimp.org/images/Glade-tree.png +https://web.archive.org//web/20161024012507im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-info.png&width=582 +https://web.archive.org//web/20150911041158im_/http://wiki.gimp.org/images/Dave_Neary.jpg +https://web.archive.org//web/20150911042651im_/http://wiki.gimp.org/images/Oyvind_Kolas.png +https://web.archive.org//web/20161024020248im_/http://wiki.gimp.org/images/Wilber.png +https://web.archive.org//web/20150911220720im_/http://wiki.gimp.org/images/Somerights20.gif +https://web.archive.org//web/20150910163330im_/http://wiki.gimp.org/images/Hello.png +https://web.archive.org//web/20161024012443im_/http://wiki.gimp.org/thumb.php?f=Gimp-2.9.1-screenshot.png&width=766 +https://web.archive.org//web/20161024014259im_/http://wiki.gimp.org/images/Gimp-print.png +https://web.archive.org//web/20150911221650im_/http://wiki.gimp.org/images/Blur_dialog2.png +https://web.archive.org//web/20150911044130im_/http://wiki.gimp.org/images/Source_and_destination_pose.png +https://web.archive.org//web/20150911045003im_/http://wiki.gimp.org/images/Depth_of_control_point.png +https://web.archive.org//web/20150910172908im_/http://wiki.gimp.org/images/People2003-small.png +https://web.archive.org//web/20150911043907im_/http://wiki.gimp.org/images/Macosx_screenshot1_thumb.jpg +https://web.archive.org//web/20150911044918im_/http://wiki.gimp.org/images/Mac_gimp_logo4.png +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150910163454im_/http://wiki.gimp.org/thumb.php?f=Tiles.png&width=800 +https://web.archive.org//web/20150911222504im_/http://wiki.gimp.org/images/Blur_select.png +https://web.archive.org//web/20150910163420im_/http://wiki.gimp.org/images/GimpImage.png +https://web.archive.org//web/20150911223242im_/http://wiki.gimp.org/thumb.php?f=Plug-in-details.png&width=800 +https://web.archive.org//web/20161024020253im_/http://wiki.gimp.org/thumb.php?f=Gimp-curves.png&width=552 +https://web.archive.org//web/20150911044837im_/http://wiki.gimp.org/images/Gnu-head-sm.jpg +https://web.archive.org//web/20150910163413im_/http://wiki.gimp.org/thumb.php?f=Architecture.png&width=800 +https://web.archive.org//web/20150911222131im_/http://wiki.gimp.org/images/Blur_dialog1.png +https://web.archive.org//web/20150911225138im_/http://wiki.gimp.org/images/People2000-small.jpg +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150910163440im_/http://wiki.gimp.org/images/Plug-in-menu.png +https://web.archive.org//web/20161024005927im_/http://wiki.gimp.org/thumb.php?f=Gp-regviewer-script-text.png&width=582 +https://web.archive.org//web/20150911222504im_/http://wiki.gimp.org/images/Blur_select.png +https://web.archive.org//web/20161024020248im_/http://wiki.gimp.org/images/Wilber.png +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150913040938im_/http://wiki.gimp.org/thumb.php?f=People2006.jpg&width=800 +https://web.archive.org//web/20150910163454im_/http://wiki.gimp.org/thumb.php?f=Tiles.png&width=800 +https://web.archive.org//web/20150913044751im_/http://wiki.gimp.org/thumb.php?f=Meetings2006.jpg&width=800 +https://web.archive.org//web/20150911044130im_/http://wiki.gimp.org/images/Source_and_destination_pose.png -- GitLab