% $Header: /cvsroot/html2ps/postscript/box.block.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $
/box-block-create {
box-container-create
% Setup method references
dup box-block-setup-methods
dup /box-block add-type
} def
/box-block-reflow { % => Content Parent This
dup /position get-css-value
{
dup /static eq { pop 3 copy /reflow-static call-method exit } if
dup /relative eq { pop 3 copy /reflow-relative call-method exit } if
dup /absolute eq { pop dup 3 index context-add-absolute-positioned exit } if
dup /fixed eq { pop dup 3 index context-add-fixed-positioned exit } if
} loop
pop pop pop % =>
} def % =>
/box-block-reflow-absolute { % => Context This
% Calculate actual box position relative to the containing block
dup box-generic-get-containing-block
% => Context This CBlock
dup containing-block-left % => Context This CBlock CBLeft
2 index /left get-css-value add % => Context This CBlock Left
2 index put-left % => COntext This CBlock
% TODO: top percentage values
dup containing-block-top
2 index /top get-css-value
/value get sub % => Context This CBlock Top
2 index get-extra-top sub % => Context This CBlock Top
2 index put-top % => Context This CBlock
% As sometimes left/right values may not be set, we need to use the "fit" width here
% if no width constraints been set, it will not be modified by the code below
2 index 2 index /get-max-width
call-method % => Context This CBlock MW
2 index put-full-width % => Context This CBlock
% Update the width, as it should be calculated based upon containing block width, not real parent
dup containing-block-right
1 index containing-block-left
sub % => Context This CBlock CBWidth
2 index /get-width call-method % => Context This CBlock CBWidth W
3 index get-width-constraint
wc-apply % => Context This CBlock W'
2 index put-full-width % => Context This CBlock
% And remove any width constraint after this, as they could refer to parent widths
wc-create-none % => Context This CBlock WCNone
2 index put-width-constraint % => Context This CBlock
2 index 2 index
box-container-reflow-content % => Context This CBlock
pop pop pop
} def
/box-block-reflow-fixed { % => Context This
0 1 index put-left
0 1 index put-top
% As sometimes left/right values may not be set, we need to use the "fit" width here
% if no width constraints been set, it will not be modified by the code below
1 index
1 index /get-max-width
call-method
1 index put-full-width % => Context This
dup /get-width call-method
dup
2 index get-width-constraint
wc-apply
1 index put-full-width % => Context This
wc-create-none 1 index
put-width-constraint % => Context This
2 copy
box-container-reflow-content
pop pop
} def
/box-block-reflow-relative { % => Context Parent This
% CSS 2.1:
% Once a box has been laid out according to the normal flow or floated, it may be shifted relative
% to this position. This is called relative positioning. Offsetting a box (B1) in this way has no
% effect on the box (B2) that follows: B2 is given a position as if B1 were not offset and B2 is
% not re-positioned after B1's offset is applied. This implies that relative positioning may cause boxes
% to overlap. However, if relative positioning causes an 'overflow:auto' box to have overflow, the UA must
% allow the user to access this content, which, through the creation of scrollbars, may affect layout.
3 copy
box-block-reflow-static
% Note that percentage values are ignored for relative positioning
% Check if top value is percentage
dup /top get-css-value /percentage get {
0
} {
dup /top get-css-value /value get
} ifelse % => Context Parent This Top
neg
2 index /left get-css-value % => Context Parent This Top Left
2 index /offset call-method % => Context Parent This
pop pop pop
} def
/box-block-reflow-static { % => Context Parent This
dup /float get-css-value
/none eq {
3 copy /reflow-static-normal call-method
} {
3 copy /reflow-static-float call-method
} ifelse
pop pop pop
} def
/box-block-reflow-static-normal { % => Context Parent This
1 index /null ne {
% By default, child block box will fill all available parent width;
% note that actual width will be smaller because of non-zero padding, border and margins
1 index /get-width call-method
1 index put-full-width
% calculate margin values if thy have been set as a percentage
1 index 1 index box-generic-calc-percentage-margins
% calculate width value if it had been set as percentage
2 index 2 index 2 index box-generic-calc-percentage-width
% calculate 'auto' values of width and margins
% unline tables, DIV width is either constrained by some CSS rules or
% expanded to the parent width; thus, we can calculate 'auto' margin
% values immediately
1 index 1 index box-generic-calc-auto-width-margins
3 copy box-generic-collapse-margin % => Context Parent This Y
% At this moment we have top parent/child collapsed margin at the top of context object
% margin stack
% Apply 'clear' property
3 index exch 2 index % => Context Parent This Context Y This
box-generic-apply-clear % => Context Parent This Y
% Store calculated Y coordinate as current Y in the parent box
2 index put-current-y % => Context Parent This
% Terminate current parent line-box
2 index
2 index
box-container-close-line
% And add current box to the parent's line-box (alone)
dup 2 index box-container-append-line
% Note that top margin already used above during margin collapsing
1 index get-current-y
1 index get-border-top-width sub
1 index get-padding-top sub % => Context Parent This Y
2 index get-left
2 index get-extra-left add % => Context Parent This Y X
2 index box-generic-move-to % => Context Parent This
} if
% Reflow contents
2 index 1 index % => Context Parent This Context This
box-container-reflow-content % => Context Parent This
% After reflow_content we should have the top stack value replaced by the value
% of last child bottom collapsed margin
dup box-container-get-first /null ne {
2 index context-get-collapsed-margin
} {
0
} ifelse
1 index get-margin-bottom
max % => Context Parent This max(cm,bm)
3 index context-pop-collapsed-margin
3 index context-pop-collapsed-margin
3 index context-push-collapsed-margin
% => Context Parent This
1 index /null ne {
% Extend parent's height to fit current box
1 index get-uid
3 index context-container-uid eq {
dup get-bottom-margin
2 index box-generic-extend-height
} {
dup get-bottom-border
2 index box-generic-extend-height
} ifelse % => Context Parent This
2 index 2 index
box-container-close-line
% Then shift current flow position to the current box margin edge
dup get-bottom-border
3 index context-get-collapsed-margin sub
2 index put-current-y
} if % => Context Parent This
3 copy
box-generic-check-page-break-after
pop pop pop
} def
/box-block-setup-methods { % => Box
dup get-box-dict /Methods get % => Box Methods
dup /reflow {box-block-reflow} put
dup /reflow-absolute {box-block-reflow-absolute} put
dup /reflow-relative {box-block-reflow-relative} put
dup /reflow-static {box-block-reflow-static} put
dup /reflow-static-normal {box-block-reflow-static-normal} put
pop pop
} def
/box-block-show-fixed { % => Viewport Box
1 index viewport-get-left
1 index /left get-css-value add % => Viewport Box Left
2 index viewport-get-top
2 index /top get-css-value
/value get sub % => Viewport Box Left Top
exch
2 index box-generic-move-to % => Viewport Box
2 copy /show call-method
pop pop
} def