GIMP 2.99.2-GTK3用户界面工具包

2020-11-07 11:23:08

GIMP 2.99.2标志着向基于GTK3用户界面和工具包的GIMP 3迈出了第一步。

第一个区别将是可视化的,因为你会注意到GIMP看起来更现代一些,它也可以使用一些新的小部件(而不是在GTK2上重新开发它们),以及在各种对话框上的客户端窗口装饰。但审美上的差异远远不是GTK3的主要吸引力。

GTK2的主要问题之一是不支持高像素密度显示器(例如高分辨率的小屏幕或极高分辨率的大屏幕),这一点已经变得越来越普遍,特别是在图形专业人士中。GIMP 2.10附带了部分解决方法,只有在某些有限的情况下才能接受,但不适合密集使用GIMP软件。

我们所说的“输入设备”,主要是指绘制平板电脑或笔式显示器。在GIMP 2中,他们的支持有很多缺点:你必须在启动GIMP之前插入平板电脑,在设置中明确启用每台新设备,更糟糕的是,拔出平板电脑可能会导致软件不稳定(尽管这个问题主要是由GIMP开发者在V2.8版本系列中的GIMP开发者在GTK2上解决的)。

GIMP3(因此是第一个开发版本)带来了热插拔支持,这意味着:启动GIMP,插上你的平板电脑,完成。你已经准备好画画了,带着压力,倾斜,以及一切。

我们还试图通过使输入设备的高级配置更易于设置来改善一般支持。

不久前,我们还试验了对缩放、平移、旋转等触控手势的支持。我们没有完成这项工作,因为我们意识到,与其他一些新功能相比,这并不是优先考虑的。

触控手势非常漂亮和令人敬畏,但有时也会成为一种负担。事实上,许多专业艺术家甚至在使用触控笔时禁用触控敏感度,以防止不需要的输入(如今高端平板电脑通常带有物理开关,在平板电脑设置中也可以禁用这一功能)。考虑到这一点,我们决定不把它作为与其他一些正在进行的工作相比的优先事项。因此,我们不确定特定的手势支持是否会出现在GIMP v3.0中。不过,我们会从任何愿意把它作为优先事项的人那里提供补丁。

状态:需要做一些工作来简化配置对话框,因为对遗留功能的支持要么不再需要,要么可以做得更好。我们可能还想增加对与输入设备相关的特定于Wayland的功能的支持。

在GTK3中,我们还继承了它基于CSS的主题格式。不幸的是,这意味着过去版本中的所有定制主题都将与GIMP 3.0和未来版本不兼容。好的一面是,这种新的主题格式使用了一个非常著名的主题标准。这应该会让GIMP的界面更容易根据你的需求和偏好进行调整。

此外,符号图标主题也得到了更好的支持。它们将遵循主题设置的前景色和背景色。如果你曾经在GIMP 2.10中从深色主题切换到浅色主题,你可能还记得你还必须手动切换符号图标主题。这将不再是必要的,因为符号图标将根据你的主题重新着色。

最后,“黑暗主题”是GTK3的一个核心概念,例如,这意味着即使是窗户装饰也会重新上色,就像你在上面的截图中看到的那样。

此外,同一主题可以同时提供深色和浅色变种,因此主题首选项页面会显示一个“如果可用的话,使用深色主题变种”复选框。类似地,图标主题可以同时暗示符号图标和彩色图标。这就是为什么“图标主题”首选项页面有一个“使用符号图标(如果可用)”开关,这样你就可以选择你喜欢的风格了。

在代码方面,与主题相关的更改基本完成。现在,我们需要一个新的默认主题。目前,GIMP 2.99.2只列出了“系统”主题,它允许GIMP遵循系统范围的GTK主题。这是从2.10的倒退,我们打算在GIMP 3.0中及时修复,重新引入一个带有中性暗/亮变化的默认主题以及一个中性的中灰自定义主题。

系统主题的主要问题是它们涵盖了非常基本的桌面使用案例。同时,先进的图形作品需要中性灰色主题,以避免污染您的色彩感知。这也是GIMP需要默认使用带有象征性图标的中性色主题的主要原因。

彩色主题和图标仍然是一种选择,事实上,我们非常确定社区很快就会推出好看的定制主题。作为一个真正的非开发者,这是为GIMP做贡献的一个很好的方式!

通常情况下,GTK3的端口应该会免费为我们提供Linux上的Wayland支持,而且大多数情况下确实是这样。不幸的是,已经有一些关于在Wayland上运行的GIMP的错误报告。其中一些显然是发布GIMP 3的拦截器(比如各种奇怪的图形用户界面错误或巨大的内存泄漏)。其他的没有那么严重,但仍然有点尴尬,比如HiDPI显示屏上的闪屏被打破,因为Wayland没有正确地报告缩放比例。

在这些问题得到解决之前,我们认为我们不能安全地声称我们提供了适当的Wayland支持。无论是GIMP、GTK还是技术堆栈的其他相关部分,我们都将感谢所有能够解决这一问题的补丁。如果你有兴趣帮忙,这里有一个与韦兰相关的错误清单。

适当的Wayland支持也意味着我们需要通过所谓的门户重新实现一些功能。我们已经为截图插件做了这件事(使用Freedesktop、GNOME和KDE门户),还有一些正在进行的修复屏幕颜色选择的工作(已经在KDE中工作,还不能在GNOME和Freedesktop门户上工作)。

至于文件门户,这在GIMP 3.0中可能不会发生,因为我们仍然需要GTK文件对话框的一些功能,但它可能会在稍后进行计划中的重新设计以改进导出流程。

由于增加了多层选择,现在管理一个有数十层和数百层的复杂项目要方便得多。与核心团队合作的动画电影导演Aryeom自2015年以来一直要求这样做,所以ZeMarmot项目最终实现了这一点。这是另一个成功的艺术家和开发者紧密合作的例子:每一项功能都是经过讨论后精心设计的,并在生产中进行了测试。

可停靠的层现在完全支持多选,使用通常用于多项选择的交互(按住Shift键并单击以选择一系列层,按住Ctrl键并单击以选择或取消选择不连续的层)。组织操作现在适用于所有选定的层,即您可以移动、重新排序、删除、复制、合并(以及更多…)。一次选择所有选定的层。

现在,多个工具还可以在多个选定的层上使用。对于实例所有变换工具(移动、旋转、缩放、透视、统一变换…)。将变换所有选定的层(除了带有“链”图标的现有层链接)。你也可以一次裁剪几个层,或者复制-粘贴合并层的投影。现在,即使是拾色器工具也可以从几个层中选取合并的颜色(某种局部的“合并样本”,而不必隐藏不需要的层)。

这些只是几个例子,因为这种更改会影响很大一部分代码库:活动层的概念在每个操作中都很突出。您可以在详细的开发报告中阅读更多关于这方面的内容。

GIMP中的一些特性仍然需要单一的层,需要在最终发布之前进行修复。我们有可能在工作的时候无意中弄坏了一些东西,这就是为什么我们要发布更多的开发版本,这一点很重要。此外,我们可能很快就会将多项选择扩展到路径和通道。

最后,绘制和GEGL操作(过滤器)仍然仅限于单层。增加一次在几个层上绘制或运行像素操作的能力可能需要一些额外的接口规范和设计,以防止出现极慢的操作或取消长期运行的进程等不良后果。

我们不得不打破插件API来引入许多改进,尽管我们特别注意不要在不必要的地方破坏东西。

将一个单文件插件从GIMP 2.10移植到GIMP 3通常需要5到30分钟。我们正在编写一个移植文档,该文档将与GIMP第三版一起发布。

如果您是插件开发人员,您可以采取的第一步是确保不使用任何不推荐使用的函数。我们编制了一个删除函数和替换函数的列表。您已经可以在以GIMP 2.10.x版本为目标的情况下完成端口的这一部分。

在值得注意的更改中,我们从对象ID转移到了realObjects。特别是在GIMP 3中,GimpImage、GimpItem、GimpDrawable、GimpLayer、GimpVectors、GimpChannel和GimpPDB都是对象(其他类别的对象已经存在,或者以后可能会添加)。

它通过让类型化的对象的类可以容易地被验证来带来更安全的编程,因此更好的错误消息(对于ID,基本上是整数,由于不正确的ID而产生奇怪的错误并不常见,并且跟踪错误的错误并不总是容易的)。

此外,对象编程还意味着类继承。通常,GimpLayer也是GimpDrawable,本身就是GimpItem。这意味着您可以使用父类中的任何方法,并轻松测试类的所有权。

非C语言的结果是,它使绑定能够使API适应它们自己的对象模型。因此,在Python3中复制名为forInstance img的GimpImage可以使用非常强势的API img2=img.Duplate()来完成。

状态:目标端口基本完成。我们还想使用对象信令,这是一个正在进行的工作,最终应该允许直接连接对象上的信号处理程序,以便管理来自核心应用程序的事件(这在GIMP 2中是不可能的,除了通过常规的轮询)。

API中的另一个变化是路径现在被作为GFile处理,这意味着使用Glib/GIO API。

虽然它看起来有点麻烦(因为它增加了创建和管理GFile的额外步骤),但它允许更健壮的文件处理。尤其是,您不必关心路径字符编码(当开发人员假设每个人都使用与他们自己相同的编码时,这是一个真正的问题),因此会导致路径中断和代码不可移植。此外,我们不必处理有关文件夹分离或文件系统符号的操作系统差异。使用GFile使内部表示透明,文件处理更加健壮。

第二大优势是,这意味着所有这些API都能获得任何已安装的GIO模块的能力,特别是从远程位置加载或保存(甚至可能通过HTTPS这样的安全通道)。这打开了广泛的可能性。

GIMP的文件处理的GIO移植已经在GIMP的核心代码中完成了,从GIMP 2.10的初始版本开始。我们现在为插件开发者带来了GIMP 3.0版的优势。

通过GObject自检进行的语言绑定也拥有对GLib/GIO API的完全访问权限,因此它们已经能够毫无问题地从路径或URI创建GFile。然而,传统的手动绑定(如script-fu(Plan))不具备GFile访问权限。我们正在做这件事(补丁已经存在,但需要重新审核)。

在声明插件的API中进行了一些重大更改,现在可以通过对GimpPlugIn类进行子类化并覆盖一些方法来列出和记录创建的插件过程来实现这一点。我们制作了一个比前一个更干净、更显式的API,这应该会帮助插件开发人员。

现在处理插件过程参数的方式也已经标准化,特别是使用了config GObject属性。作为一种通用逻辑,这更容易处理。特别是,相同的配置对象允许我们生成许多功能。例如,它将帮助那些不想自己修补GTK或其他工具包的插件按需生成对话框。它还简化和标准化了后续呼叫或相同处理程序的衣物保存。

最终,这也是未来录制/宏特性的基础工作的一部分(GIMP 3.0中不太可能出现,但这是实现这一特性的基础工作的一部分),因为我们将能够可靠地保存在运行插件时使用的参数。

状态:虽然这个API的主要部分已经完成了,但在发布之前还需要做更多的事情,特别是我们还在对表示的参数进行修修补补。

我们已经通过GObjectIntrospect自省了完整的API。这意味着GIMP API应该在广泛的语言绑定中完全可用。到目前为止,我们只测试了几个,所以我们可以确认GIMP现在可以使用以下命令(当然,除了C和C++之外):

与GIMP过去的脚本化方式不同的主要区别之一是,现在不再需要定制的层API,这一点值得注意的是,在使用Python2时,GIMP是可脚本化的。

此外,GIMP 2绑定通常是围绕PDB协议进行的,PDB协议只是完整的C libgimp API的一个子集。新的绑定是内置的libgimp本身。因此,Python3、Javascript、Luaor Vala(或任何未来反思过的绑定)中的插件将具有与C插件相同的可能性。对于GIMP插件开发者来说,这是一个光明的新世界!

另一个结果是,除了语言特性之外,所有这些语言的API基本上是相同的。例如,如果在C语言中找到一个可绘制的和一个选择的交叉点是:

另一个很好的例子是如何处理带有额外长度参数的C类型数组。不出所料,如果目标语言具有适当的结构,则长度参数不会存在于绑定中。例如,虽然您可以使用以下命令从脚本复制多个可绘制内容:

/*其中@Drawables是可绘制文件的C数组,@num_Drawables*表示该数组的大小。*/gimp_edit_copy(num_Drawables,Drawables);

这可以在Python 3中按如下方式完成(删除num_Drawables并将C数组替换为一个Python列表):

这些绑定现在不仅可以访问完整的GIMP API,而且还可以访问更多作为GIMP依赖项的自省API。例如,一个插件可以访问完整的Glib/GIO、GTK、Pango、cairo API以及Babl和GEGL API(为了更容易的像素操作和对大量现有操作的访问)。这是以前的Python2绑定的主要限制之一,它不能使用GEGL操作像素。

现状:有些人对以前的Python2绑定提供的便利感到遗憾,比如自动创建对话框。THIS目前正在工作(一些对话框生成的雏形甚至已经在2.99.2版本之后进入了开发分支),因此应该可以在下一个开发版本中使用。最好的部分是这样的API将在主API上完成,因此对所有绑定都可用,而不仅仅是Python或模式。这是自省API与手动维护的绑定相比的最大优势之一:我们将在主API中提供它们,以便每个开发人员都可以享受它们,无论您喜欢哪种语言,而不是在每个可用绑定中重新实现好的特性。

最后,SCRIPT-FU不是被反思的绑定之一(虽然据说有GObject Introspecting方案绑定,但我们还没有测试任何绑定),并且主要作为它自己的扩展工作。然而,一些关于API更改的问题已经被提出(例如,无法像前面讨论的那样创建GFile),这些问题必须在最终稳定发布之前得到解决。

对于每种经过测试的绑定语言,我们都创建了一个名为“Goat Exercise”的插件,这是一个创建插件的演示。你可以称它为“GIMP Hello World!”

每个Goat练习用它自己的语言做完全相同的事情:它创建一个带有标签、按钮和文本视图(GTK+和GLib/GIO演示)的对话框;其中一个按钮触发一个过滤器来修改Active Layer(GEGL演示和GIMP API演示);所有这一切都同时在文本视图中显示它自己的源代码(便于从GIMP中检查代码),并使用一个按钮将您发送到存储库文件(如果您更喜欢签出最新版本,

这些插件非常重要,因为我们计划用GIMP 3来改善插件生态系统。它们是“自我记录演示插件”的第一步(同时做一些比光秃秃的“Hello和World”更令人兴奋的事情)。

状态:山羊练习的当前代码并不总是使用最新的API更新,因为它是一个移动的目标。这些将在发布之前进行更新。

我们已经开始在GIMP3中写下一些关于插件开发的文档,并将逐步开始发布一些指南。希望我们甚至能够重新推出我们的开发者网站,这个网站多年来一直在慢慢衰败。我们希望GIMP 3能让GIMP插件生态系统重新焕发生机!

扩展名是一种新的文件格式,它只是数据(画笔、闪屏、图案、动态…)的包装器。或与元数据关联的插件(名称、描述、屏幕截图、版本、Requirements…)。目标是允许插件开发人员发布他们在存储库上的工作,任何人都可以在GIMP中搜索第三方插件、安装/卸载、启用/禁用和更新它们。

菜单编辑&>管理扩展会显示基本对话框。特别是在“系统扩展”选项卡中,您会注意到一个“官方DemoPlug-in”,这是我们的第一个扩展。事实上,它捆绑了我们前面谈到的所有GoatExercise插件。如果关闭,重新启动后(现在必须重新启动GIMP才能看到效果),菜单类别Filters>;Development&>GoatExercises消失了。

在我们做了更多的工作之后,我们将继续讨论这个特性。特别是,我们将提供有关如何创建扩展的文档。这绝对是插件和资源创建者应该期待的东西,因为它将有助于与其他人分享他们的创作。

现状:在GIMP方面还有更多的工作要做,特别是在与存储库的通信方面,在官方存储库和扩展网站方面还有更多的工作要做。

“太空入侵”是这项工作的内部代号,最初于2018年开始,其目标是在核心像素处理过程中适当地支持色彩空间。在GIMP 2.10系列中,尽管核心色彩管理支持,但配置文件有时会在操作过程中丢失,并且只有在最终结果时才重新引入,这可能会在某些情况下导致错误的值。

任何有兴趣进一步了解这个问题的人都可以阅读öyvind Kolçs的帖子,特别是GEGL0.4.6的详细相关版本说明,他很好地解释了这一点。

这项工作的一些改进已经被逐步报告到各种GIMP 2.10.x版本中,但是GIMP 3.0应该是我们希望100%正确的最终版本。

现状:在这个主题上,开发分支比2.10系列要先进得多,但还需要做更多的工作。GIMP的各个方面仍然主要预期或显示仅限sRGB的值。

GIMP 3现在有一个渲染缓存,可以保存缩放、色彩管理、显示过滤器和外壳蒙版(用于模糊选择等工具)的结果。与GTK2版本的GIMP相比,这带来了更快的用户体验。

现在,在首选项->;显示中也有缩放质量设置。当设置为快速时,GIMP将从下一个更大的mipmap级别进行最近邻内插,而不是线性或框过滤。这对绘画和所有更新都有轻微而持久的推动作用。我们有几个想法可以进一步改善这一点,比如高质量的重新定位。

.