26 个版本 (3 个稳定版)

2.0.0-beta2024 年 8 月 2 日
1.0.2 2024 年 4 月 9 日
1.0.1 2024 年 3 月 30 日
1.0.0-alpha2023 年 12 月 29 日
0.1.0-alpha.42023 年 7 月 27 日

#42配置

Download history 126/week @ 2024-05-04 182/week @ 2024-05-11 260/week @ 2024-05-18 216/week @ 2024-05-25 164/week @ 2024-06-01 125/week @ 2024-06-08 198/week @ 2024-06-15 73/week @ 2024-06-22 82/week @ 2024-06-29 212/week @ 2024-07-06 55/week @ 2024-07-13 119/week @ 2024-07-20 141/week @ 2024-07-27 342/week @ 2024-08-03 360/week @ 2024-08-10 284/week @ 2024-08-17

1,143 每月下载量

MPL-2.0 OR LGPL-2.1-or-later

145KB
3.5K SLoC

甘氨酸

甘氨酸允许将图像解码为 gdk::Texture 并提取图像元数据。解码发生在沙盒化的模块化 图像加载器 中。

示例

let file = gio::File::for_path("image.jpg");
let image = Loader::new(file).load().await?;

let height = image.info().height;
let texture = image.next_frame().await?.texture;

局限性

甘氨酸基于 memfds、unix 套接字和 linux 命名空间等技术。它目前仅在 Linux 上运行。可以通过不使用沙盒机制来将其用于其他类 Unix 系统。目前没有计划支持 Windows,并且可能不可行。

图像加载器配置

加载器配置从 XDG_DATA_DIRSXDG_DATA_HOME 读取。位置通常是

<data-dir>/share/glycin/<compat-version>+/conf.d/<loader-name>.conf

例如

<data-dir>/share/glycin/0+/conf.d/glyicn-image-rs.conf

配置是 glib KeyFiles 形式的

[loader:image/png]
Exec = /usr/libexec/glycin/1+/glycin-image-rs

其中 loader 之后的部分是 MIME 类型,而 Exec 的值可以是任何可执行路径。

现有兼容性版本

并非每个库的新主要版本都需要与加载器破坏兼容性。如果 glycin 版本 X 破坏了兼容性,则新的兼容性版本将称为 X+。只有 glycin X 和更新的版本将与 X+ 兼容,直到使用新的兼容性版本。每个兼容性版本的 API 定义可在 docs/ 中找到。以下是一些当前存在的兼容性版本

兼容性版本 兼容性
0+ glycin 0.x
1+ 甘氨酸 1.x, lib甘氨酸 1.x

支持的图像格式

以下特性由loaders目录中提供的甘氨酸加载器支持。

格式 解码器 ICC CICP EXIF XMP 动画
AVIF heif libheif-rs + libheif (C++)
BMP image-rs image-rs
DDS image-rs image-rs
farbfeld 无MIME类型 image-rs
QOI image-rs image-rs
GIF image-rs image-rs
HEIC heif libheif-rs + libheif (C++)
ICO image-rs image-rs
JPEG image-rs image-rs
JPEG XL jxl jpegxl-rs + libjxl (C++)
OpenEXR image-rs image-rs
PNG image-rs image-rs
PNM image-rs image-rs
SVG image-rs librsvg + gio/cairo (C)
TGA image-rs image-rs
TIFF image-rs image-rs
WEBP image-rs image-rs
符号 含义
支持
格式支持但尚未实现
此格式不可用

沙箱和内部机制

甘氨酸为每个图像文件启动一个进程。甘氨酸与加载器之间的通信通过Unix套接字上的对等点对点D-Bus进行。

甘氨酸在Flatpak内外都支持沙箱机制。在Flatpak外部,使用以下机制:通过bwrap启动图像加载器二进制文件。bubblewrap配置仅允许与宿主系统的最小交互。仅挂载必要的文件系统部分,并且只提供读访问权限。没有直接的网络访问。不将环境变量传递到沙箱中。在派生进程之前,通过调用setrlimit限制内存使用,并通过seccomp过滤器将系统调用限制为允许列表。

在Flatpak内部,使用flatpak-spawn --sandbox命令。这以类似直接调用bwrap的方式限制对文件系统的访问。通过将加载器调用包装在prlimit命令中来限制内存使用。不对现有的Flatpak seccomp规则应用额外的seccomp过滤器。

通过Unix套接字将GFile内容流式传输到加载器。这样,加载器可以加载需要网络访问的内容,而它们自己不直接拥有网络访问权限。例如,SVG格式在它们的配置中将ExposeBaseDir = true选项设置为true。这将导致将原始图像文件的目录挂载到沙箱中,以包括来自那里的外部图像文件。对于flatpak-spawn沙箱,ExposeBaseDir选项没有效果,因为它们不支持此功能。

加载器通过甘氨酸密封的memfd提供纹理数据,然后将其作为mmap提供给GDK。对于动画和SVG,沙箱进程保持活动状态,直到需要新的帧或瓦片。

有关如何实现加载器的信息,请参阅glycin-utils文档

构建和测试

  • -Dloaders选项允许仅构建某些加载器。
  • -Dtest_skip_ext选项允许在测试期间跳过某些图像文件扩展名。如果x265不可用,可能需要选项-Dtest_skip_ext=heic
  • 运行集成测试需要安装甘氨酸加载器。默认情况下,meson test 会创建一个单独的安装环境,测试将在该环境中运行。通过设置 -Dtest_skip_install=true,可以将此行为更改,需要在运行测试之前手动调用 meson install
  • glycin 库中有一个示例,glycin-render,它将加载作为参数传递的图像并将其渲染为当前目录中的 PNG 文件 output.png

打包

分发需要将加载器二进制文件及其配置独立于应用程序打包。加载器通过 meson 构建并安装。

应用程序将依赖于 glycin 库来使用已安装的二进制加载器。

Packaging Status

许可证

SPDX-License-Identifier: MPL-2.0 OR LGPL-2.1-or-later

依赖项

~16–28MB
~481K SLoC