Files
luos/gulliver/thirdparty/html2ps_pdf/postscript/box.frame.ps

237 lines
7.7 KiB
PostScript
Executable File

/box-frame-create { % =>
box-container-create
dup box-frame-setup-methods
dup /box-frame add-type
} def
/box-frame-reflow { % => Context Parent This
% If frame contains no boxes (for example, the src link is broken)
% we just return - no further processing will be done
dup get-content length 0 gt {
% First box contained in a frame should always fill all its height
dup get-height
1 index get-content 0 get put-full-height
0 3 index context-push-collapsed-margin
dup get-uid 3 index context-push-container-uid
2 index 1 index
box-container-reflow-content
2 index context-pop-collapsed-margin
2 index context-pop-container-uid
} if
pop pop pop
} def
/box-frame-setup-methods { % => Box
dup /Methods get
dup /reflow {box-frame-reflow} put
pop pop
} def
/box-frameset-create {
box-container-create
dup box-frameset-setup-methods
dup /rows 1 put
dup /cols 1 put
dup /box-frameset add-type
} def
/box-frameset-guess-lengths { % => Height Lengths Frameset
% Initialization
[] % => Height Lengths Frameset Values
2 index { % => Height Lengths Frameset Values Length
pop 0 exch array-append % => Height Lengths Frameset Values'
} forall
% First pass: fixed-width columns
0 1 2 index length 1 sub { % => Height Lengths Frameset Values I
3 index 1 index get
dup /type get % => Height Lengths Frameset Values I Length Type
{
dup /percentage eq {
pop
/value get % => Height Lengths Frameset Values I Value
5 index mul
100 div % => Height Lengths Frameset Values I Value
2 index 2 index 2 index put
pop
exit
} if
dup /constant eq {
pop
/value get px % => Height Lengths Frameset Values I Value
2 index 2 index 2 index put
pop
exit
} if
pop pop exit
} loop % => Height Lengths Frameset Values I
pop % => Height Lengths Frameset Values
} for % => Height Lengths Frameset Values
% Second pass: relative-width columns
3 index 1 index sum sub % => Height Lengths Frameset Values Rest
0 % => Height Lengths Frameset Values Rest Parts
4 index
{ % => Height Lengths Frameset Values Rest Parts Value
dup /type get /fraction eq { % => Height Lengths Frameset Values Rest Parts Value
/value get add % => Height Lengths Frameset Values Rest Parts
} { % => Height Lengths Frameset Values Rest Parts Value
pop
} ifelse % => Height Lengths Frameset Values Rest Parts
} forall
dup 0 gt {
div % => Height Lengths Frameset Values PartSize
0 1 5 index length 1 sub { % => Height Lengths Frameset Values PartSize I
4 index 1 index get
dup /type get /fraction eq { % => Height Lengths Frameset Values PartSize I Length
/value get % => Height Lengths Frameset Values PartSize I Parts
2 index mul % => Height Lengths Frameset Values PartSize I Len
3 index exch
2 index exch put % => Height Lengths Frameset Values PartSize I
} {
pop
} ifelse % => Height Lengths Frameset Values PartSize I
pop
} for % => Height Lengths Frameset Values PartSize
pop
} { pop pop } ifelse % => Height Lengths Frameset Values
% Fix over/underconstrained framesets
dup sum % => Height Lengths Frameset Values Width
dup 0 gt {
4 index exch div % => Height Lengths Frameset Values Koeff
0 1 3 index length 1 sub { % => Height Lengths Frameset Values Koeff I
2 index 1 index get
2 index mul % => Height Lengths Frameset Values Koeff I Value'
3 index exch
2 index exch put % => Height Lengths Frameset Values Koeff I
pop
} for % => Height Lengths Frameset Values Koeff
pop
} {
pop
} ifelse
exch pop
exch pop
exch pop
} def
/box-frameset-put-cols { % => Value Box
exch /cols exch put
} def
/box-frameset-put-rows {
exch /rows exch put
} def
/box-frameset-reflow { % => Context Parent Box
2 index context-get-viewport % => Context Parent Box Viewport
% Frameset always fill all available space in viewport
dup flow-viewport-get-left
2 index get-extra-left add
2 index put-left
dup flow-viewport-get-top
2 index get-extra-top sub
2 index put-top
dup flow-viewport-get-width
2 index put-full-width
dup flow-viewport-get-height
2 index put-full-height
pop % => Context Parent Box
% Parse layout-colntrol values
dup get-height
1 index /rows get
2 index
box-frameset-guess-lengths % => Context Parent Box RowSizes
1 index /get-width call-method
2 index /cols get
3 index
box-frameset-guess-lengths % => Context Parent Box RowSizes ColSizes
% Now reflow all frames in frameset
0 0 % => Context Parent Box RowSizes ColSizes CurCol CurRow
4 index get-content { % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
% Had we run out of cols/rows ?
1 index 5 index length ge {
pop
exit
} if % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
% Guess frame size and position
5 index get-left % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Left
4 index 0 % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Left ColsSizes 0
5 index getinterval sum % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Left ColOfs
add
1 index get-extra-left add % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Left
1 index put-left % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
5 index get-top % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Top
5 index 0
4 index getinterval sum % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Top RowOfs
sub
1 index get-extra-top sub
1 index put-top % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
3 index 3 index get
1 index put-full-width % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
dup /get-width call-method wc-create-constant
1 index put-width-constraint
4 index 2 index get
1 index put-full-height % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
% Reflow frame contents
dup flow-viewport-create % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame Viewport'
8 index context-push-viewport % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
7 index
6 index
2 index /reflow call-method % => Context Parent Box RowSizes ColSizes CurCol CurRow Frame
7 index context-pop-viewport
% Move to the nex frame position
3 2 roll 1 add 3 1 roll % => Context Parent Box RowSizes ColSizes CurCol' CurRow Frame
2 index 4 index length ge {
3 2 roll pop 0 3 1 roll
exch 1 add exch
} if
pop
} forall % => Context Parent Box RowSizes ColSizes CurCol CurRow
pop pop pop pop
pop pop pop
} def
/box-frameset-setup-methods {
dup /Methods get
dup /reflow {box-frameset-reflow} put
pop pop
} def