重新绘制时放大到 Clutter CairoTexture
Posted
技术标签:
【中文标题】重新绘制时放大到 Clutter CairoTexture【英文标题】:Zooming into a Clutter CairoTexture while re-drawing 【发布时间】:2010-07-04 19:56:56 【问题描述】:我正在使用 python-clutter 1.0
我的问题以挑战的形式提出
编写代码以允许通过按键放大到 CairoTexture 演员,在步骤中可以(通过 cairo)重新绘制每个演员,以便图像保持高分辨率但仍按预期缩放, 没有重新调整演员的大小。
想想 Inkscape 之类的东西,以及如何放大矢量;矢量如何在任何放大倍率下保持干净。将一条路径(例如,一堆 cairo line_to
命令)放到 CairoTexture actor 上,然后让相同的技巧发生。
更多细节
我的目标是使用一组演员的小型 SVG 编辑器。每个演员都致力于一条道路。我通过使用SomeGroup.set_depth(z)
'缩放',然后使 z 更大/更小。到目前为止一切都很好。然而,演员离相机越近,纹理被拉伸得越多以适应他们新的外观尺寸。
我似乎找不到让 Clutter 两者兼得的方法:
-
让演员的实际尺寸保持不变(即它开始时的大小。)
将其底层表面换成较大的表面(放大时),然后我可以在其上重新绘制路径(并使用 cairo 矩阵来执行上下文的缩放。)
如果我使用set_size
或set_surface_size
,演员会变大,这不是本意。我只希望它的表面(基础数据)变得更大。
(我不确定这个术语,也许是 mipmapping?)
换句话说:多边形越来越大,增加它的纹理数组的大小,以便它可以映射到更大的多边形上。
我什至通过保持第二个表面(使用 pycairo)来尝试结束混乱,我重新创建到演员的表观大小(get_transformed_size
),然后我使用混乱的set_from_rgb_data
并指出它在我的第二个表面,强制重新调整表面的大小,而不是演员的尺寸。
这样做的问题是 a) 杂乱会忽略新的尺寸,只吸收旧的宽度/高度,b) RGBA 与 ARGB32 的东西会导致颜色崩溃。
我对任何替代想法持开放态度,我希望我站在树林里想念所有的树!
\d
【问题讨论】:
【参考方案1】:好吧,尽管我进行了所有的测试和破解,但它一直就在我的眼皮底下。
感谢 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
表面尺寸和尺寸 演员不必相同。这 表面尺寸只是默认情况下 演员的首选尺寸。你可以 只需覆盖首选大小 设置演员的大小。如果 演员的大小与 表面尺寸然后纹理将 被压扁以适应演员的大小 (我认为这是你想要的)。
很高兴把这个小谜团放在床上。感谢杂乱清单!
\d
【讨论】:
以上是关于重新绘制时放大到 Clutter CairoTexture的主要内容,如果未能解决你的问题,请参考以下文章
获取 Embed Clutter Stage 的当前宽度和高度