重新绘制时放大到 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_sizeset_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 的当前宽度和高度

jscanvas画图放大是文字不变

HTML5 Canvas元素绘制地图,已绘制出地图,并且地图可放大缩小,怎样实现鼠标移动到一幢楼时显示楼的名称

Qwt 仅重新绘制特定区域

使用 Cairo 绘制杂乱纹理

QGraphicsView 放大或移动时不绘制行项目?