Масштабирование Clutter CairoTexture при перерисовке

Я использую python-clutter 1.0

Мой вопрос в форме вызова

Напишите код, позволяющий увеличивать актор CairoTexture нажатием клавиши пошагово, чтобы на каждом этапе актор можно было перерисовать (cairo), чтобы изображение оставалось в высоком разрешении, но по-прежнему масштабировалось должным образом, без изменения размера актера.

Подумайте о чем-то вроде Inkscape и о том, как вы можете масштабировать векторы; как векторы остаются чистыми при любом увеличении. Поместите путь (скажем, набор команд cairo line_to) на актор CairoTexture, а затем позвольте тому же трюку произойти.

Подробнее

Я нацелен на небольшой редактор SVG, который использует группы актеров. Каждый актер посвящен одному пути. Я «масштабирую» с помощью SomeGroup.set_depth(z), а затем увеличиваю/уменьшаю z. Пока все в порядке. Однако чем ближе актер(ы) подходит к камере, тем сильнее растягивается текстура, чтобы соответствовать их новому кажущемуся размеру.

Кажется, я не могу найти способ заставить Clutter сделать и то, и другое:

  1. Оставьте фактический размер актера неизменным (то есть то, с чего он начинался).
  2. Замените его базовую поверхность на более крупные (при увеличении), на которые затем я могу перерисовать путь (и использовать матрицу Каира для масштабирования контекста).

Если я использую set_size или set_surface_size, актер становится больше, что не предназначено. Я только хочу, чтобы поверхность (базовые данные) стала больше.

(Я не уверен в терминологии для этого, возможно, mipmapping?)

Другими словами: полигон становится больше, увеличьте размер его массива текстур, чтобы он мог отображаться на больший полигон.

Я даже пытался обойти беспорядок, сохранив вторую поверхность (используя pycairo), которую я воссоздал до видимого размера актера (get_transformed_size), а затем я использовал беспорядок set_from_rgb_data и навел его на свою вторую поверхность, заставив изменение размера поверхности, но не размеров актера.

Проблема с этим заключается в том, что а) беспорядок игнорирует новый размер и рисует только старую ширину/высоту и б) вещи RGBA против ARGB32 вызывают плавление цвета.

Я открыт для любых альтернативных идей, надеюсь, я стою в лесу и скучаю по всем деревьям!

\d


person Donn    schedule 04.07.2010    source источник


Ответы (1)


Что ж, несмотря на все мои тесты и взломы, это все время было прямо у меня под носом.

Благодаря Нилу в списке беспорядок, вот сенсация:

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

person Donn    schedule 06.07.2010