sel*_*ler 4 gnome wallpaper unity 12.04 background
设置墙纸时,您可以从tile、zoom、center、scale、fill或span选项中进行选择。他们的意思是什么?
如何规模的选择是不同的变焦和跨度?我在我的任何壁纸上都看不到差异。
要了解各种可用选项的复杂性,值得在源代码中稍微挖掘一下,看看每个选项会发生什么。我会尽我最大的努力把这尽可能简单,但有一个警告——你需要享受一点数学!
让我们获取源代码:
apt-get source gnome-desktop3
cd gnome-desktop*
cd libgnome-desktop
Run Code Online (Sandbox Code Playgroud)
现在使用您最喜欢的文本编辑器打开以下源模块:
gedit gnome-bg.c
Run Code Online (Sandbox Code Playgroud)
有两个关键函数需要检查:
get_scaled_pixbuf
开关(放置){
案例 G_DESKTOP_BACKGROUND_STYLE_SPANNED:
new = pixbuf_scale_to_fit (pixbuf, width, height);
休息;
案例 G_DESKTOP_BACKGROUND_STYLE_ZOOM:
new = pixbuf_scale_to_min (pixbuf, width, height);
休息;
案例 G_DESKTOP_BACKGROUND_STYLE_STRETCHED:
new = gdk_pixbuf_scale_simple(pixbuf,宽度,高度,
GDK_INTERP_BILINEAR);
休息;
案例 G_DESKTOP_BACKGROUND_STYLE_SCALED:
new = pixbuf_scale_to_fit (pixbuf, width, height);
休息;
案例 G_DESKTOP_BACKGROUND_STYLE_CENTERED:
案例 G_DESKTOP_BACKGROUND_STYLE_WALLPAPER:
默认:
new = pixbuf_clip_to_fit (pixbuf, width, height);
休息;
}
和功能:
绘制图像区域
开关(背景->位置){
案例 G_DESKTOP_BACKGROUND_STYLE_WALLPAPER:
pixbuf_tile(缩放,dest);
休息;
案例 G_DESKTOP_BACKGROUND_STYLE_ZOOM:
案例 G_DESKTOP_BACKGROUND_STYLE_CENTERED:
案例 G_DESKTOP_BACKGROUND_STYLE_STRETCHED:
案例 G_DESKTOP_BACKGROUND_STYLE_SCALED:
pixbuf_blend (scaled, dest, 0, 0, w, h, x + area->x, y + area->y, 1.0);
休息;
案例 G_DESKTOP_BACKGROUND_STYLE_SPANNED:
pixbuf_blend (scaled, dest, 0, 0, w, h, x, y, 1.0);
休息;
默认:
g_assert_not_reached();
休息;
}
这由 case 选项描述 G_DESKTOP_BACKGROUND_STYLE_SPANNED
墙纸(pixbuf)首先缩放到要填充的区域(pixbuf_scale_to_fit),即取原始墙纸并扩展其宽度和高度以匹配该区域。
它使用以下算法进行扩展:
因子 = MIN (max_width / src_width, max_height / src_height); new_width = floor (src_width * factor + 0.5); new_height = floor (src_height * factor + 0.5);
src_是壁纸尺寸宽度或高度,而max_是区域尺寸宽度或高度
正如您所看到的,这是一个相当复杂的算法,但基本上它会尝试查看需要扩展的最小维度是多少,然后再通过它计算的相同因子对两个维度进行线性缩放。
此区域是您的显示器或显示器的组合区域。
然后将生成的墙纸 (pixbuf) 与整个区域的桌面背景颜色混合。
这由 case 选项描述 G_DESKTOP_BACKGROUND_STYLE_SCALED
正如您在源代码中看到的,它与SPAN非常相似。它使用与SPAN相同的算法来缩放图片。
然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。
这由 case 选项描述 G_DESKTOP_BACKGROUND_ZOOM
墙纸(pixbuf)首先缩放到要填充的区域(pixbuf_scale_to_min),即取原始墙纸并扩展其宽度和高度以匹配该区域。
它使用以下算法进行扩展:
因子 = MAX (min_width / src_width, min_height / src_height); new_width = floor (src_width * factor + 0.5); new_height = floor (src_height * factor + 0.5);
src_是壁纸尺寸宽度或高度,而max_是区域尺寸宽度或高度*
请注意与前两个选项的细微差别 - 它计算需要扩展的最大维度,然后再按其计算的相同因子线性缩放两个维度。
然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。
这由 case 选项描述 G_DESKTOP_BACKGROUND_STRETCHED
墙纸 (pixbuf) 在宽度方向和高度方向都扩展到该区域 - 因此如果您的墙纸不是墙纸的确切尺寸,您可能会失真
然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。
这由 case 选项描述 G_DESKTOP_BACKGROUND_CENTRED
如果墙纸 (pixbuf) 过大而不适合该区域,即宽度减少到区域宽度,高度减少到区域高度,则实际上将其剪裁到大小。
然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。然后将生成的图像绘制到监视器整个区域的中心。
这由 case 选项描述 G_DESKTOP_BACKGROUND_WALLPAPER
墙纸 (pixbuf) 与中心选项类似。
然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。生成的图像从一个角开始重复复制,用每个图像填充整个区域,即在宽度方向和高度方向平铺。
这将很难看到,但是......
抱歉,我无法提供瓷砖以外的样品,但图像在很大程度上取决于您的显示器。如果您使用尺寸严重不足且纵横比不佳的图像进行测试,您应该能够轻松地看到有效的选项。