% $Header: /cvsroot/html2ps/postscript/height.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $
/hc-apply { % => Box RawHeight HC
dup /constant get /null ne {
1 index % => Box RawHeight HC RawHeight
3 index % => Box RawHeight HC RawHeight Box
2 index /constant get % => Box RawHeight HC RawHeight Box Constant
hc-fix-value % => Box RawHeight HC H
} {
2 index % => Box RawHeight HC Box
2 index % => Box RawHeight HC Box RawHeight
2 index % => Box RawHeight HC Box RawHeight HC
hc-apply-max % => Box RawHeight HC H0
3 index exch % => Box RawHeight HC Box H0
2 index
hc-apply-min % => Box RawHeight HC H1
} ifelse % => Box RawHeight HC H
exch pop
exch pop
exch pop
} def
/hc-apply-max { % => Box Value HC
dup /max get /null eq {
1 index
} {
1 index
3 index % => Box Value HC Value Box
2 index /max get % => Box Value HC Value Box HC
hc-fix-value % => Box Value HC H
2 index min % => Box Value HC H
} ifelse % => Box Value HC H
exch pop
exch pop
exch pop
} def
/hc-apply-min { % => Box Value HC
dup /min get /null eq {
1 index
} {
1 index
3 index % => Box Value HC Value Box
2 index /min get % => Box Value HC Value Box HC
hc-fix-value % => Box Value HC H
2 index max % => Box Value HC H
} ifelse % => Box Value HC H
exch pop
exch pop
exch pop
} def
/hc-create { % => Max Min Constant
<< >>
dup /max 5 index put
dup /min 4 index put
dup /constant 3 index put
exch pop
exch pop
exch pop
} def
/hc-fix-value { % => Default Box Value
% A percentage or immediate value?
dup /percentage get { % => Default Box Value
% CSS 2.1: The percentage is calculated with respect to the height of the generated box's containing block.
% If the height of the containing block is not specified explicitly (i.e., it depends on content height),
% and this element is not absolutely positioned, the value is interpreted like 'auto'.
% Check if parent exists
1 index get-parent dup
/null ne { % => Default Box Value Parent
dup get-height-constraint % => Default Box Value Parent ParentHC
3 index get-parent /box-table-cell is-a not
1 index /constant get /null eq and
1 index /min get /null eq and
1 index /max get /null eq and {
% if parent does not constrained height, return null - no height constraint can be applied
pop pop 2 index
} { % => Default Box Value Parent ParentHC
3 index get-parent /box-table-cell is-a {
3 index get-parent
/row get % => Default Box Value Parent ParentHC Row
% Note that unlike pure PHP DOM tree, we have box-table-row as a direct parent of the cell here
4 index get-parent
get-parent
get-parent % => Default Box Value Parent ParentHC Row Table
box-table-get-rhc % => Default Box Value Parent ParentHC RHC
dup hc-is-null {
pop 4 index
} {
4 index exch % => Default Box Value Parent ParentHC Box RHC
1 index get-parent
get-height exch % => Default Box Value Parent ParentHC Box BaseHeight RHC
hc-apply % => Default Box Value Parent ParentHC H
} ifelse
exch pop
exch pop % => Default Box Value H
} {
pop
get-height % => Default Box Value ParentH
1 index /value get
mul 100 div % => Default Box Value H
} ifelse
} ifelse
} { % => Default Box Value
/null
} ifelse % => Default Box Value H
} { % => Default Box Value
dup /value get
} ifelse % => Default Box Value H
exch pop
exch pop
exch pop
} def
/hc-is-constant { % => HC
/constant get /null ne
} def
/hc-is-null { % => HC
dup /min get /null eq
1 index /max get /null eq and
1 index /constant get /null eq and
exch pop
} def
/hc-is-percentage { % => HC
dup /min get /null ne {
dup /min get /percentage get not
} { true } ifelse
1 index /max get /null ne {
1 index /max get /percentage get not
} { true } ifelse and
1 index /constant get /null ne {
1 index /constant get /percentage get not
} { true } ifelse and
not
exch pop
} def
%%%%%%%%%%%%%
/is-height-constrained { % => Box
dup get-box-dict % => Box Dict
/Height get
dup /Constrained get % => Box HDict /Constrained
1 index /Min get 0 gt % => Box HDict /Constrained /ConstrainedMin
or
exch pop
exch pop
} def
/get-min-height {
dup get-box-dict % => Box Dict
/Height get
dup /MinPercentage get { % => Box HeightDict
% Percentage height can be applied only if parent's height is explicitly height to the constant length
1 index get-box-dict
/Parent get % => Box HeightDict Parent
get-box-dict
/Height get % => Box HeightDict ParentHeightDict
dup /Constrained get { % => Box HeightDict ParentHeightDict
/ConstraintPercentage
get not { % => Box HeightDict
/Min get
1 index exch
get-parent-height-fraction
} { % => Box HeightDict
pop 0
} ifelse
} { % => Box HeightDict ParentHeightDict
pop pop 0
} ifelse
} {
/Min get
} ifelse
exch pop
} def
/find-containing-block-height { % => Box
% Check if the parent box have constrained height
dup get-box-dict % => Box Dict
dup /Parent known {
/Parent get % => Box Parent
get-box-dict % => Box ParentDict
/Height get % => Box ParentHeightDict
dup /Constrained get % => Box ParentHeightDict ParentConstrained
exch % => Box ParentConstrained ParentHeightDict
/ConstraintPercentage get
not % => Box ParentConstrained !ParentPercentageConstrained
and
{
get-box-dict /Parent get
get-height
} {
% Box parent is not height-constrained, proceed to its parent
get-box-dict /Parent get
find-containing-block-height
} ifelse
} {
pop pop 0
} ifelse
} def
/calc-auto-height-margins { % => Box
dup get-real-height % => Box RH
1 index get-min-height % => Box RH MH
max % => Box H1
1 index get-max-height
min % => Box H
exch pop
} def