Para entender as complexidades das várias opções disponíveis, vale a pena apenas explorar o código-fonte para ver o que acontece com cada opção. Vou tentar o meu melhor para colocar isso é simplesmente possível, mas com a ressalva - você precisa aproveitar um pouco de matemática!
Vamos pegar o código-fonte:
apt-get source gnome-desktop3
cd gnome-desktop*
cd libgnome-desktop
Agora, abra o seguinte módulo de origem com seu editor de texto favorito:
gedit gnome-bg.c
Existem duas funções principais a serem examinadas:
get_scaled_pixbuf
switch (placement) { case G_DESKTOP_BACKGROUND_STYLE_SPANNED: new = pixbuf_scale_to_fit (pixbuf, width, height); break; case G_DESKTOP_BACKGROUND_STYLE_ZOOM: new = pixbuf_scale_to_min (pixbuf, width, height); break; case G_DESKTOP_BACKGROUND_STYLE_STRETCHED: new = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR); break; case G_DESKTOP_BACKGROUND_STYLE_SCALED: new = pixbuf_scale_to_fit (pixbuf, width, height); break; case G_DESKTOP_BACKGROUND_STYLE_CENTERED: case G_DESKTOP_BACKGROUND_STYLE_WALLPAPER: default: new = pixbuf_clip_to_fit (pixbuf, width, height); break; }
e a função:
draw_image_area
switch (bg->placement) { case G_DESKTOP_BACKGROUND_STYLE_WALLPAPER: pixbuf_tile (scaled, dest); break; case G_DESKTOP_BACKGROUND_STYLE_ZOOM: case G_DESKTOP_BACKGROUND_STYLE_CENTERED: case G_DESKTOP_BACKGROUND_STYLE_STRETCHED: case G_DESKTOP_BACKGROUND_STYLE_SCALED: pixbuf_blend (scaled, dest, 0, 0, w, h, x + area->x, y + area->y, 1.0); break; case G_DESKTOP_BACKGROUND_STYLE_SPANNED: pixbuf_blend (scaled, dest, 0, 0, w, h, x, y, 1.0); break; default: g_assert_not_reached (); break; }
- Vamos primeiro olhar para a opção SPAN
Isso é descrito pela opção case G_DESKTOP_BACKGROUND_STYLE_SPANNED
O papel de parede (pixbuf) é primeiro dimensionado para a área a ser preenchida (pixbuf_scale_to_fit), ou seja, pegue o papel de parede original e expanda sua largura e altura para corresponder à área.
Ele usa o seguinte algoritmo para expandir:
factor = 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 _ é a largura ou altura da dimensão do papel de parede, enquanto que max _ é a largura ou altura da dimensão da área
Algum algoritmo complicado, como você pode ver, mas basicamente ele tenta ver qual é a dimensão mínima que precisa ser expandida antes de dimensionar ambas as dimensões linearmente pelo mesmo fator que calculou.
Esta área é a área combinada do seu monitor ou monitores.
O papel de parede resultante (pixbuf) é então misturado com a cor de fundo da área de trabalho para toda a área.
- Vamos ver a opção SCALE
Isso é descrito pela opção case G_DESKTOP_BACKGROUND_STYLE_SCALED
Como você pode ver no código-fonte, é muito parecido com SPAN . Ele usa o mesmo algoritmo para dimensionar a imagem como SPAN .
O papel de parede resultante (pixbuf) é então misturado com a cor de fundo da área de trabalho para a área da porta de exibição, ou seja, não a área combinada de todos os monitores, mas a área de cada monitor individualmente.
- Vamos ver a opção Zoom
Isso é descrito pela opção case G_DESKTOP_BACKGROUND_ZOOM
O papel de parede (pixbuf) é primeiro dimensionado para a área a ser preenchida (pixbuf_scale_to_min), ou seja, pegue o papel de parede original e expanda sua largura e altura para corresponder à área.
Ele usa o seguinte algoritmo para expandir:
factor = 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 _ é a largura ou altura da dimensão do papel de parede, enquanto max _ é a largura ou altura da dimensão da área *
Observe a diferença sutil que as duas opções anteriores - ele calcula a dimensão máxima que precisa ser expandida antes de dimensionar ambas as dimensões linearmente pelo mesmo fator calculado.
O papel de parede resultante (pixbuf) é então misturado com a cor de fundo da área de trabalho para a área da porta de exibição, ou seja, não a área combinada de todos os monitores, mas a área de cada monitor individualmente.
- Vamos ver a opção STRETCH
Isso é descrito pela opção case G_DESKTOP_BACKGROUND_STRETCHED
O papel de parede (pixbuf) é expandido tanto na largura como na altura em relação à área - assim você pode obter uma distorção se o papel de parede não tiver as dimensões exatas do papel de parede
O papel de parede resultante (pixbuf) é então misturado com a cor de fundo da área de trabalho para a área da porta de exibição, ou seja, não a área combinada de todos os monitores, mas a área de cada monitor individualmente.
- Vamos ver a opção CENTER
Isso é descrito pela opção case G_DESKTOP_BACKGROUND_CENTRED
O papel de parede (pixbuf) é realmente recortado para tamanho se for muito grande para caber na área, ou seja, a largura é reduzida para a largura da área e a altura é reduzida para a altura da área.
O papel de parede resultante (pixbuf) é então misturado com a cor de fundo da área de trabalho para a área da porta de exibição, ou seja, não a área combinada de todos os monitores, mas a área de cada monitor individualmente. A imagem resultante é então desenhada para o centro da área total do monitor.
- Vamos ver a opção TILE
Isso é descrito pela opção case G_DESKTOP_BACKGROUND_WALLPAPER
O papel de parede (pixbuf) é similarmente recortado como a opção Center .
O papel de parede resultante (pixbuf) é então misturado com a cor de fundo da área de trabalho para a área da porta de exibição, ou seja, não a área combinada de todos os monitores, mas a área de cada monitor individualmente. A imagem resultante é copiada repetidamente, iniciando em um canto, preenchendo a área total com cada imagem, ou seja, lado a lado em largura e em altura.