重新绘制时缩放成Clutter CairoTexture

时间:2010-07-04 19:56:56

标签: python zoom cairo scaletransform clutter

我正在使用python-clutter 1.0

以挑战的形式提出的问题

编写代码以允许通过按键来放大到CairoTexture actor,步骤使得每个actor都可以重新绘制(通过cairo),以便图像保持高分辨率但仍按预期进行缩放, 没有重新调整演员的大小。

想想像Inkscape这样的东西,以及如何放大矢量;矢量如何在任何放大倍数下保持清洁。将一条路径(一堆cairo line_to命令)放到CairoTexture actor上然后允许同样的技巧发生。

更多细节

我的目标是一个使用演员组的小型SVG编辑器。每个演员都致力于一条道路。我使用SomeGroup.set_depth(z)缩放'然后使z更大/更小。到目前为止都很好。然而,演员越接近相​​机,纹理就越拉伸以适应新的表观尺寸。

我似乎无法找到让Clutter同时做到这两点的方法:

  1. 将演员的实际大小保持静态(即它开始的大小。)
  2. 将较大的表面(在放大时)换出其下面的表面,然后我可以重新绘制路径(并使用cairo矩阵来执行上下文的缩放。)
  3. 如果我使用set_sizeset_surface_size,则演员会获得更大的,这不是意图。我只希望它的 surface (基础数据)变得更大。

    (我不确定这个术语,也许是mipmapping?)

    换句话说:多边形越来越大,增加了纹理数组的大小,以便它可以映射到更大的多边形。

    我甚至尝试通过保持第二个表面(使用pycairo)来重复创建一个表面大小(get_transformed_size),然后我使用杂乱的set_from_rgb_data。并指向它在我的第二个表面,强制重新调整表面大小但不是演员的尺寸。

    这个问题是:a)杂乱忽略了新的尺寸,只能画入旧的宽度/高度,而b)RGBA与ARGB32之类的东西会导致颜色崩溃。

    我对任何其他想法持开放态度,我希望我站在树林里错过所有树木!

    \ d

1 个答案:

答案 0 :(得分:2)

好吧,尽管我所有的测试和黑客,它一直在我的鼻子底下。

感谢Neil在杂乱的项目列表中,这里是独家新闻:

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
  

表面尺寸和尺寸   演员不必一样。该   表面尺寸只是默认的   演员的首选大小。您可以   用just覆盖首选大小   在actor上设置大小。如果   演员的大小不同   表面尺寸然后纹理将   被压扁以适应演员的大小   (我认为这就是你想要的)。

很高兴把这个小小的神秘感放到床上。谢谢杂乱的名单!

\ d