Плавная анимация PostScript - PullRequest
       17

Плавная анимация PostScript

6 голосов
/ 06 декабря 2011

Я бы хотел плавно запускать анимации в PostScript. Чтобы увидеть, что я хочу, позвольте мне переключиться на PostScript напрямую. Звоните ghostscript, и

200 dup scale .5 setgray 0 0 3 3 rectfill

Теперь у нас есть серый квадрат.

0 setgray 0 1 3 1 rectfill

С черной полосой. Теперь мы заполним эту полосу, один раз белым и чёрный подряд:

{1 setgray 0 1 3 1 rectfill 0 setgray 0 1 3 1 rectfill} loop

Теперь вы увидите мерцание черно-белых прямоугольников, которые меньше, чем оригинальная черная полоса. В идеале мы бы увидели оригинальный серый квадрат. Или почти. Где я могу получить такую ​​функциональность сегодня?

Чтобы увидеть более интересную анимационную последовательность в поисках магии квадраты размером 5:

wget http://www.complang.tuwien.ac.at/ulrich/gupu/l5.eps.gz
zcat l5.eps.gz | ghostscript -

Пару лет назад я попытался решить эти проблемы. Но это никогда не входило в ghostscript или Xfree. Увидеть эта страница . Может быть, есть идеи получше?

Редактировать: После прочтения ответов, позвольте мне прояснить одну проблему здесь. По сути, в этом вопросе есть две независимые проблемы:

  • Как смотреть анимацию с уровня языка? Я считаю, что лучший способ - это просматривать каждый кадр как одну страницу. С copypage постепенные изменения могут быть реализованы с минимальными усилиями. К сожалению, эта семантика copypage присутствует только на уровне 1 и 2. На уровне 3 значение copypage изменилось на showpage. Я сделал - много лет назад - небольшую модификацию ghostscript , чтобы отложить все видимые изменения до copypage или showpage. Таким образом, один XCopyArea, содержащий измененную область, выполняется локально на сервере (то есть на дисплее).

  • Как следует синхронизировать реальные изменения на визуальном дисплее, чтобы избежать артефактов, которых нет в описанной графике? Нерегулярное мерцание, которое вы видите, не является привилегией PostScript, похоже, оно присутствует в любой системе с двойной буферизацией, которую я видел до сих пор. Просто попробуйте запрограммировать это в любой системе, которую считаете нужной.

Дальнейшее редактирование:

Чтобы получить правильный уровень языка, то есть до уровня 1 или 2 (для ghostscript):

systemdict /.setlanguagelevel known {2 .setlanguagelevel} if

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

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Мы рассмотрели некоторые из этих проблем в этой теме на comp.lang.postscript .

С момента выпуска стандарта уровня 2 Postscript является языком для сбора мусора. Вы можете отключить сбор пользовательских объектов с фрагментом -2 vmreclaim, но это мало что дает. Вы можете отключить сборку мусора ghostscript ALL , вызвав опцию -dNOGC. Это должно помочь предотвратить срыв и разбрызгивание частей изображения.

Ghostscript имеет нестандартный оператор под названием flushpage , который синхронизирует рендеринг с исполнением. Это помогает убедиться, что все видно до того, как оно исчезнет.

- flushpage -
On displays, flushes any buffered output, so that it is guaranteed to
show up on the screen; on printers, has no effect

А для контроля времени нет лучшего способа, чем простое ожидание занятости.


/smallpause {
    /flushpage where{pop flushpage}if
    50 sleep } def
/pagepause {
    /flushpage where{pop flushpage}if
    1000 sleep } def

/sleep {
    usertime add {
        10 {
            1 100000 div pop %busy
            .1 sin 257 cos atan pop %busy busy
        } repeat
        dup usertime le {exit}if
    } loop pop
} def 

Ограждения where вокруг флеш-страницы позволяют отправлять один и тот же код переводчикам, кроме ghostscript (например, на принтер).

Если бы у вас был настоящий сервер Display Postscript, вы могли бы использовать оператор wait вместо занято-ожидания.

3 голосов
/ 06 декабря 2011

Хотя мне нравится (и голосовал против) @ luserdroog ответ, я не верю, что Postscript следует использовать для анимации таким способом - я бы предпочел использовать некоторый язык, который может запускать виджеты или элементы отображения, предназначенные для отображения в реальном времени.и взаимодействие с пользователем - это не относится к postscript или ghostscript.

Я думаю, что было бы неплохо, однако, использовать postscript для анимации в целях рендеринга - просто рендеринг страницы после каждой модификации изображения и использованиевнешняя программа для сборки различных страниц в виде кадров анимации.Возможно даже использование postscript в качестве движка рендеринга, когда процесс на другом языке вызывает ghostscript для рендеринга каждого кадра в реальном времени.Хорошим и простым в использовании мультимедийным фреймворком для этого может быть, например, язык Python с модулем Pygame.

Вот краткий пример использования "чистого python + pygame".

#! /usr/bin/env python
# coding: utf-8

import pygame

size = 640,480 #(in pixels)

# multiplying factor so that the whole image is 5 units across
factor = size[0] / 5.0

# Inits pygame drawing window
screen = pygame.display.set_mode(size)

# Rectangle drawing function that scales drawing using the factor above
def draw_rect(color, rect):
    new_rect = [int (r * factor) for r in rect]
    return pygame.draw.rect(screen, color, new_rect)

def main():
    draw_rect((128,128,128), (0, 0, 3, 3))
    colors = ((255,255,255), (0,0,0))
    color_index = 0
    while True:
        draw_rect(colors[color_index], (0, 1, 3, 1))
        pygame.display.flip()
        color_index = 1 - color_index
        pygame.time.delay(50) # in miliseconds

try:
    main()
finally:
    pygame.quit()

Чтобы выполнить это, вы должны иметь Python и Pygame (от http://pygame.org - для этого в большинстве систем Linux есть готовые пакеты)

API рисования Pygame:намного беднее, чем postscript - если вам нужно больше, чем прямоугольники (например, бези, масштабирование, вращение и сдвиг системы координат и т. д.), лучше всего использовать Cairo + python + некоторую библиотеку отображения (которая может быть pygame, GTK +или QT).Cairo - это библиотека 2D-чертежей, которая наследуется от PostScript.- или, как я уже говорил выше, для управления внешним процессом ghostscript с помощью Python, который генерирует сжатый файл образа rle для stdout или ramdrive, и это изображение читается и отображается кадр за кадром с помощью python + pygame.

Другой вариант - использовать HTML5 Canvas и делать все в Javascript, доступном для просмотра в браузере.Canvas в HTML5 также наследует способ создания PostScript.

...