2010-07-04 4 views
2

J'utilise python désencombrer 1.0Zooming dans une image de fond CairoTexture tout en redessinant

Ma question sous la forme d'un défi

code d'écriture pour permettre de zoomer jusqu'à un acteur CairoTexture, en appuyant sur une clé, dans des étapes telles qu'à chaque l'acteur peut être redessiné (par le caire) de sorte que l'image reste en haute résolution mais continue à évoluer comme prévu, sans en redimensionnant l'acteur. Pensez à quelque chose comme Inkscape et comment vous pouvez zoomer sur les vecteurs; comment les vecteurs restent propres à tout grossissement. Mettez un chemin (tas de commandes de cairo line_to, disons) sur un acteur de CairoTexture et laissez le même tour se produire.

Plus de détails

Je visais un petit éditeur de SVG qui utilise des groupes d'acteurs. Chaque acteur est consacré à un seul chemin. Je 'zoome' en utilisant SomeGroup.set_depth(z) et ensuite z plus grand/plus petit. Tout va bien jusqu'à présent. Cependant, plus le (s) acteur (s) s'approche de la caméra, plus la texture est étirée pour s'adapter à leur nouvelle taille apparente.

Je ne peux pas sembler trouver un moyen d'obtenir l'image de fond de faire les deux: (.-À-dire ce qu'il a commencé comme)

  1. Laisser la taille réelle de l'acteur statique
  2. sa surface sous-jacente de swap pour les plus grands (sur zoom) que je peux ensuite redessiner le chemin sur (et utiliser une matrice caire pour effectuer la mise à l'échelle du contexte.)

Si je set_size ou set_surface_size, l'acteur obtient plus ce qui n'est pas prévu. Je veux seulement que ce soit surface (données sous-jacentes) pour être plus grand.

(je ne suis pas sûr de la terminologie pour cela, mipmapping peut-être?)

Mettez une autre manière: un polygone devient plus grande, augmenter la taille de son tableau de textures afin de pouvoir la carte sur le polygone plus .

J'ai même essayé une fin courir autour de l'encombrement en gardant une seconde surface (à l'aide pycairo) que je Recréer la taille apparente de l'acteur (get_transformed_size), puis-je utiliser set_from_rgb_data de l'encombrement et la pointe vers mon deuxième surface, forçant une redimensionnement de la surface mais pas des dimensions de l'acteur. Le problème avec ceci est que a) le désordre ignore la nouvelle taille et dessine seulement dans l'ancienne largeur/hauteur et b) le genre RGBA vs ARGB32 provoque une fusion de couleur.

Je suis ouvert à toutes les idées alternatives, j'espère que je suis debout dans les bois manquant tous les arbres!

\ d

Répondre

2

Eh bien, en dépit de tous mes tests et hacks, il était juste sous mon nez tout au long.

Merci à Neil sur la liste fouillis projet, voici le scoop:

CT = SomeCairoTextureActor() 

# record the old height, once: 
old_width, old_height = CT.get_size() 

Start a loop: 
# Do stuff to the depth of CT (or it's parent) 
... 

# Get the apparent width and height (absolute size in pixels) 
appr_w,appr_h = CT.get_transformed_size() 

# Make the new surface to the new size 
CT.set_surface_size(appr_w, appr_h) 

# Crunch the actor back down to old size 
# but leave the texture surface something other! 
CT.set_size(old_width, old_height) 

loop back again 

La taille de la surface et la taille de l'acteur ne doivent pas être les mêmes. La taille de surface est juste par défaut la taille préférée de l'acteur . Vous pouvez remplacer la taille préférée par en réglant la taille sur l'acteur. Si la taille de l'acteur est différente de la taille de la surface puis la texture sera écrasée pour s'adapter à la taille de l'acteur (ce que je pense est ce que vous voulez).

Bien de mettre ce petit mystère au lit. Merci liste de fouillis!

\ d