Как я могу собрать операции PostScript во время выполнения, чтобы выполнить их позже? - PullRequest
1 голос
/ 10 июня 2019

В некотором коде, который выводит данные, я перебираю образцы и пытаюсь связать данные с кривыми, создавая метки (линии плюс текст) на лету. Таким образом, я создаю два не связанных пути параллельно. Оба элемента используют разные графические атрибуты и преобразованные системы координат, поэтому я использую gsave ... grestore в партии, возможно, создавая неэффективный код.

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

Возможно, cvx может помочь, но мне интересно, как предотвратить выполнение операторов при добавлении их в массив (я ожидаю, что [ moveto ] извлечет два элемента из стека до выполнения ]). [ /moveto ] справится?

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

Например, часть кода маркировки (некрасиво, потому что все еще работает) выглядит так:

            gsave
                currentpoint translate la rotate
                0 rlineto
                %% add a tick mark if it's far enough from the last one (or if it is important)
                mlx x mly y distance lw 2 mul gt
                m lm gt or
                { %if
                    /mlx x def
                    /mly y def
                    currentpoint
                    lw setlinewidth     % label len
                    stroke
                    (Helvetica) findfont fs scalefont setfont
                    moveto              % label
                    180 rotate
                    dup stringwidth pop neg fs 3 div sub fs -2.5 div
                    rmoveto
                    %% add a text label if it looks like there is room (or if it is important)
                    tlx x tly y distance fs 1.2 mul gt
                    m lm gt or
                    { %ifelse
                        show
                        /tlx x def
                        /tly y def
                    }
                    { pop } ifelse
                    /lm m def
                } { pop }
                ifelse
            grestore

1 Ответ

1 голос
/ 10 июня 2019

Для первой части, /moveto cvx даст вам имя исполняемого файла, которое не будет выполнено сразу, но оно будет выполнено позже, если вы поместите его в исполняемый массив и exec его.Если вы просто выполните /moveto, тогда имя будет буквальным именем, и оно не будет выполнено позже с exec.

Для другой части - сбор фрагментов в массив, при этом все еще используя стек для выполнения,Один простой способ - поместить mark в стек и бросить все, что находится за отметкой, чтобы справиться с этим позже.Например,

mark

%... do stuff with stack

1 2 3 counttomark 1 add 3 roll  % save 3 numbers behind mark

%... do stuff with stack

cleartomark                  % discard working area
count array astore           % make array from stack contents
...