Spaces:
Sleeping
Sleeping
| % $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 |