Масштабирование CairoTexture в беспорядке при повторном рисовании - PullRequest
2 голосов
/ 04 июля 2010

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

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

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

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

Подробнее

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

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

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

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

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

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

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

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

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

\ d

1 Ответ

2 голосов
/ 06 июля 2010

Ну, несмотря на все мои тесты и хаки, все это время было у меня под носом.

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

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

...