2

我正在使用 python-clutter 1.0

我的问题是挑战的形式

编写代码以允许通过按键放大到 CairoTexture 演员,在步骤中,可以(通过 cairo)重新绘制每个演员,以便图像保持高分辨率但仍按预期缩放,无需重新调整演员的大小。

想想 Inkscape 之类的东西,以及如何放大矢量;矢量如何在任何放大倍率下保持干净。将一条路径(例如一组 cairoline_to命令)放在 CairoTexture actor 上,然后让相同的技巧发生。

更多详情

我的目标是使用一组演员的小型 SVG 编辑器。每个演员都致力于一条道路。我通过使用“缩放”SomeGroup.set_depth(z)然后使 z 更大/更小。到目前为止一切都很好。然而,演员离相机越近,纹理被拉伸得越多以适应他们新的外观尺寸。

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

  1. 让演员的实际尺寸保持不变(即开始时的尺寸。)
  2. 将其底层表面换成较大的表面(放大时),然后我可以将路径重新绘制到上面(并使用 cairo 矩阵来执行上下文的缩放。)

如果我使用set_sizeor set_surface_size,演员会变,这是不希望的。我只希望它的表面(基础数据)变得更大。

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

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

我什至尝试过通过保持第二个表面(使用 pycairo)来结束混乱,将其重新创建为演员的表观大小(get_transformed_size),然后我使用混乱set_from_rgb_data并将其指向我的第二个表面,强制重新表面的大小,但不是演员的尺寸。

这样做的问题是a)混乱忽略了新的尺寸,只吸收了旧的宽度/高度,b)RGBA 与 ARGB32 的东西会导致颜色崩溃。

我对任何替代想法持开放态度,我希望我站在树林里想念所有的树!

\d

4

1 回答 1

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

表面尺寸和演员的尺寸不必相同。默认情况下,表面尺寸只是actor的首选尺寸。您可以通过设置演员的大小来覆盖首选大小。如果演员的尺寸与表面尺寸不同,那么纹理将被挤压以适合演员的尺寸(我认为这是你想要的)。

很高兴把这个小谜团放在床上。感谢杂乱清单!

\d

于 2010-07-06T09:39:42.133 回答