 I'm from Gagel, the non-destructive high-bit depth image processing engine that Guild 2.10 later is using. And the first time a little bit about me, I come from Norway, which has mountains, sometimes winter, and I like to stay in a cabin in the forest in the mountains there. And I've been programming for quite a long while. This is part of my student work back in 2002, when I was experimenting with graphics. This was before the Golden Gibb. And it was an initial attempt at looking different ways of doing color correction for video. And in good tradition with procrastinating hackers and software developers, I also brought my own UI to look at. And looking back on it now, I also suspect that I did not draw uppercase characters for this Bitmap font. You'll see that actually everything is lowercase, and it's probably because I never really drew the characters. So this is 2002. And in this project I was doing here, I also wrote the GIMP plug-in, which is how I got involved with the GIMP developers. And for people who are familiar with the GIMP splash screens in history, this is how GIMP started back then, what the book like. And this is the times when the resolution on your computers, you're actually doing pixel art. You're signing individual pixel-by-pixel empty areas and doing hacks for the world. So things have moved on since then. And I was not happy about GIMP at this time. It was quite good, but there was loads and loads of room for improvement. And having decided to spend time on doing that is why I'm going to care today talking. Already back in 2002, a plan had been in place for a couple of years to replace the engine inside GIMP with the graph or load-based system. That is where you have black boxes that you connect with pipes, some boxes load images, other things to learn. And this is much more common now, but the idea was put in place by a Hollywood studio called Ruderman Hughes, already back in 1999-2000. That this is how they would want to do high-picture and non-destructive editing in GIMP. And they have already been working on something they call film GIMP, which became a scene of paint. But they said, no, no, this is too messy and too many hacks to maintain. So you have to create graph-based system. This is Imageflow, which is one UI that exists for gaggle in front of it. There are other experiments. This is an experiment that I'm going to discontinue, which was a video editor I was working on a couple of years ago on top of gaggle. And I'm working on small different UIs on top of gaggle to improve gaggle and make gaggle ready for GIMP. Because there's this chicken and egg problem going on in that the features of gaggle need to be ready and working before GIMP is interested in actually adopting them and integrating them. And to actually make features stable and suitable for adoption, they have been tested already. And that's why there's a need for other things to use. Thankfully, all the data, in addition to Imageflow, has been using Gaggle lately. So that gives more users and validates that the APIs can do things that I didn't think of the first and second, but maybe only the fourth time was considered how APIs will be used. Yet another application that is using Gaggle internally is GNOME Photos. And the history of the project can be seen here, in a sense. This is kind of a burned-on chart, very simple. How long code that has been added in the years has survived. So there's something going on in the beginning. The original code for rhythm and use not much of it exists. It's just tied a little band here. So at some point it started to get rid of some code and then not much surviving. There has been a year-on-year growth of the amount of code. And there's quite a few contributors. Each different color, for example, band here, is a different person who has to commit in Gaggle over time. And this big pink area is mine. And it is shrinking, though it's sometimes growing. But the overall code base is also growing. Gaggle itself has 400,000 lines of code now. And it contains many plugins that have been ported from GIMP. That used to be only 8-bit, but it didn't work that well. There had been no move to work inside one of these black boxes as a node. We have then preserved that code and contributions also in GIMP. And this is one of the challenges with GIMP as well, is that GIMP, because it has had even more contributors than Gaggle over time, it is troublesome if things keep on contributing in the past stops working. So Mitch and the core team of GIMP try very, very hard to make scripts continue working and things that used to work to continue working. And this also makes it move so much slowly forward. We're going to talk about Gaggle, which this is an overview of all the operations which are in Gaggle. It is quite a few, it's many plugins that people recognize from GIMP, but all of these are separate small individual filters with their own bugs, or similar as well, so often have to work out. And I'm going to skip this one. This is the old way tests used to be done in Gaggle, also when we didn't have a UI or a real testing. We wrote these XML files quite long, and the very useful thing to have providers as a testing part of you is that each time they add new code and change code in Gaggle, we checked that these scary large documents produce the same pixel bar pixel all over, we checked some of it. But for testing and debugging, opening up the text editor and editing the XML file like this and having the result, that is like the difference between using Inkscape for creating graphics and editing SVGs in the text editor and reloading the web browser. And the reloading in a web browser and editing in a text editor SVG, it kind of works, but you have a very long feedback process. And why was this? Not the hit I wanted to? I don't know the screen. So what I'm showing now is the new, simpler way of reading up a graph with only Gaggle and doing it from the command bar. This example would actually just load the JPEG and spit out a pink, not extremely interesting. If it adds two dashes and then put the name of a node in Gaggle, then we start doing kind of like a graph-based processing. So now we have rigged up that we load the JPEG, pass it through the threshold, and we say load.png. And if we then start adding another command behind it and then a word that is the name of the parameter equals, we can start building up a successive chain of commands. Convert to mosaic. And one can do more complicated things. So what I've done here is I've took the original image, I've passed it through the mosaic filter, and then I've passed it through an over-operation, which is a filter that puts another image on top of parts of the image. And the image I'm putting over it goes in on the auxiliary input on the overload, and it is the original image but I've scaled it down half on each side and put it on top of the original image. This way of bringing things up has worked quite well and some of the core contributors to Geggle, this is the preferred way of expressing bug reports as well, saying that if I set the environmental variables to, say, I have one core or four treks, I get a different result from running this command and all that fits in the actual bug report and there's no attachments or text or similar. And this is also something that people can use in scripts rather than using Python bindings or something like that. Syntax that is used in this thing also is available inside GIMP as a filter called Geggle Graph, and I'm just going to remove everything here. So if I just write threshold, I'm sorry that the font pair is quite small, then I'm writing the exact same syntax that was showing on the command line earlier, so no one is going to get in a lie editor here. But threshold, value, and I get this eq billboard telling me that something is wrong, such as this, no such operation, as a value equals 0.5 or 3, 2, and one thing I quite enjoy, as an example of things that can be rigged up, and I'm going to show the same thing I did with this auxiliary input and more complex graph, is if I say it equals foo, so that I say that you saved foo, you want to do a threshold, but instead of doing it with a fixed value, we want to do a threshold where we re-input the original image, and then we do a Gaussian blur, I should have used a smaller image for this, but so what this ends up doing, let's see if I can get all of it to show on the same part in the text editor there, what this ends up doing is that instead of blurring the fixed value of 0.5 in the whole image, we create a version of the image, which is the blur of the image, so we have the average of every single pixel, or neighborhood of each pixel, so this is kind of a local adaptive thresholding, so the threshold depends on which colors are actually in that part of the image, so it would work out, and yeah, this image is quite large, so the default setting is of mosaic, and mosaic used to work in the old pixel-tushing, the pixel-arch days of GEM, we don't actually see the filter, so if we zoom in, we end up seeing what this is doing, but okay, all of GEM is done, and here's an example of one bug report from one of the big QA contributors to GEMP and GEDO, Massimo, and this is not in the UI, this is just an email I have received, but he's just saying that these commands produce different results with eight threads or one thread, and he also identifies where the actual problem is, but this is a lot more helpful than the way we used to do things. Getting used to having a UI before as well. So this is a screenshot of how that used to work, at some point this is how it used to look when we had also spiral curves possible to edit directly, it had both the Sierra handles and other parts of curves. It all happens that the program I'm actually using for a presentation here is also the GEDO binary. It's an image viewer, I've been doing a little bit of zooming in and out, but I could also write threshold value equals 0.5 and then we get something similar to what we had and I can open up and look at I've got a slide for all four kinds of looking at the screen. So I'm going to do basically what we did and again threshold connect this over there and do a Gaussian blur so with the large radius shrinking radius we have this very very high pass threshold going on. I'm going to skip the thing I'll play with there and see if I return to it in my coming examples. Now I'm going to do another example on top of this and show a way to do something else. So to command some typing they apply to the active node so if I have cropped focus there I can say width equals 4000 and height equals 3300 but the cropped tool also has its own on UI control handles as does this linear gradient so I can adjust where those endpoints are. This is very very experimental and the way that these on canvas control tools work is I'm going to open up the linear gradient each time this ghetto image viewer editor UI is re-rendering its frame it interprets also this whole file I'm going to be very evil and just remove the endpoints so we cannot edit one side of the gradient and the UI even updates live so changing the source code changes what the UI is doing I don't have to recompile or do any of those parts and that is interesting and the UI's I have here this is a tiny little self-contained file which only is manipulating one node and I do think that we could do the same thing in GIMP so that we end up having this tiny small Lua scripts that provide the interactive vector editing on the canvas that are only manipulating a small part of the graph or let's see I'm running out of time so I'm going to write the signature I was going to talk about space invasion which is the adding of the new RGB spaces to GIMP I'm going to skip through there a bit and show another fun thing in this image viewer the image viewer also can do PDFs then I get another type of way of paging up and down in addition to the size of this how much time I have left about a minute thanks for coming CMYK is coming CMYK is actually done in Babel and in Degel and that's the thing that I haven't started working on in GIMP but the other part of the space invasion is still ongoing as we're speaking and another quality testing contributor to GIMP is Elle Stone I used to have a bit of a strange relationship but no, we have turned Elle Stone into a sea developer and she's committing git patches and she's implementing the architecture and that was planned but was hastened in the past but no, it's becoming very very clear and we think we know what we're doing I think I'll skip a bit ahead here and show that Gable can do video as well and this whole presentation that I've run here today the way I've done it is to actually override the order of the files in the folder as well and I allowed files to occur multiple times so instead of seeing this folder as the case you just put your files, actually an edit decision list or a playlist I haven't had the data here for dealing with inner node points or clips etc so the killing of this GCAT video editor it was all of that function I just moved into this video editor I think we have to stop here