% $Header: /cvsroot/html2ps/postscript/box.text.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $
/box-text-create { % =>
box-generic-inline-create
% setup box-specific properties
dup /Text () put
dup /Encoding ISOLatin1Encoding put
% setup inherited method references
dup box-text-setup-methods
dup /box-text add-type
} def
/box-text-draw-overline { % => Text Box
newpath
% Get the thickness of the font underline
0
currentfont
font-underline-thick % => Text Box UThick
setlinewidth % => Text Box
% Get the position of the font underline
currentfont
font-overline-pos % => Text Box UPos
1 index get-left
2 index get-top
3 index get-default-baseline
sub % => Text Box UPos X Y'
% Note that UPos is negative
2 index add % => Text Box UPos X Y'
moveto
1 index /get-width call-method
0
rlineto
stroke % => Text Box UPos
pop pop pop
} def
/box-text-draw-line-through { % => Text Box
newpath
% Get the line thickness
0
currentfont
font-underline-thick % => Text Box UThick
setlinewidth % => Text Box
% Get the position of the font underline
currentfont
font-line-through-pos % => Text Box UPos
1 index get-left
2 index get-top
3 index get-default-baseline
sub % => Text Box UPos X Y'
% Note that UPos is negative
2 index add % => Text Box UPos X Y'
moveto
1 index /get-width call-method
0
rlineto
stroke % => Text Box UPos
pop pop pop
} def
/box-text-draw-underline { % => Text Box
newpath
% Get the line thickness
0
currentfont
font-underline-thick % => Text Box UThick
setlinewidth % => Text Box
% Get the position of the font underline
currentfont
font-underline-pos % => Text Box UPos
1 index get-left
2 index get-top
3 index get-default-baseline
sub % => Text Box UPos X Y'
% Note that UPos is negative
2 index add % => Text Box UPos X Y'
moveto
1 index /get-width call-method
0
rlineto
stroke % => Text Box UPos
pop pop pop
} def
/box-text-find-font { % => Box
dup /font-size get-css-value
1 index
/font-family get-css-value % => Box FontSize FontFamily
exch scalefont % => Box <>
exch pop % => <>
} def
/box-text-get-min-width { % => Context This
dup get-full-width
exch pop
exch pop
} def
/box-text-get-max-width { % => Context This
dup get-full-width
exch pop
exch pop
} def
/box-text-reflow { % => Context Parent This
% Check if we need a line break here (possilble several times in a row, if we
% have a long word and a floating box intersecting with this word
% To prevent infinite loop, we'll use a limit of 100 sequental line feeds
0 % => Content Parent This 0(LFs)
{
1 add % => Context Parent This LFs'
3 index
3 index
3 index
/maybe-line-break
call-method % => Context Parent This LFs Flag
1 index 100 ge
or {
exit
} if
} loop % => Context Parent This LFs
pop % => Context Parent This
% Determine the baseline position and height of the text-box using line-height CSS property
dup box-generic-apply-line-height
% set default baseline
dup get-default-baseline
1 index put-baseline
% append current box to parent line box
dup 2 index
box-container-append-line % => Context Parent This
% Determine coordinates of upper-left _margin_ corner
1 index 1 index
box-generic-guess-corner % => Context Parent This
% Offset parent current X coordinate
dup get-full-width
2 index get-current-x
add % => Context Parent This CX'
2 index put-current-x % => Context Parent This
% Extends parents height
dup get-bottom-margin % => Context Parent This BM
2 index
box-generic-extend-height % => Context Parent This
% Update the value of current collapsed margin; pure text (non-span)
% boxes always have zero margin
2 index context-pop-collapsed-margin
0 3 index context-push-collapsed-margin
% Clear the stack
pop pop pop
} def
/box-text-setup { % => Box
% select the font used to render current text box
dup box-text-find-font % => Box <>
dup font-ascender % => Box <> Ascender
1 index font-descender % => Box <> Ascender Descender
3 2 roll
setfont % => Box Ascender Descender
1 index 3 index put-default-baseline
add
% 1 index /font-size get-css-value min
1 index put-height % => Box
% determine the width of the current text box
dup get-text stringwidth % => Box SX __
pop % => Box SX
1 index put-width % => Box
pop
} def
/box-text-setup-methods { % => Box
% Setup method references
dup get-box-dict /Methods get % => Box Methods
dup /get-min-width {box-text-get-min-width} put
dup /get-max-width {box-text-get-max-width} put
dup /reflow {box-text-reflow} put
dup /show {box-text-show} put
pop pop
} def
/box-text-show { % => Viewport Box
% Check if current text box will be cut-off by the page edge
% Get Y coordinate of the top edge of the box
dup get-top-margin % => Viewport Box Top
% Get Y coordinate of the bottom edge of the box
1 index get-bottom-margin % => Viewport Box Top Bottom
1 index
4 index viewport-get-bottom
gt % => Viewport Box Top Bottom TopInside
1 index
5 index viewport-get-bottom
gt % => Viewport Box Top Bottom TopInside BottomInside
2 copy
not and % => Viewport Box Top Bottom TopInside BottomInside TopInside&&!BottomInside
{ % => Viewport Box Top Bottom TopInside BottomInside
% If yes, do not draw current text box at all; add an required value
% to the viewport page offset to make the text box fully visible on the next page
5 index
viewport-get-offset-delta % => Viewport Box Top Bottom TopInside BottomInside OD
4 index
7 index viewport-get-bottom
sub % => Viewport Box Top Bottom TopInside BottomInside OD ODNew
max % => Viewport Box Top Bottom TopInside BottomInside OD'
6 index
viewport-put-offset-delta % => Viewport Box Top Bottom TopInside BottomInside
pop pop
} { % => Viewport Box Top Bottom TopInside BottomInside
or not { % => Viewport Box Top Bottom
} { % => Viewport Box Top Bottom
% draw generic box
3 index 3 index
box-generic-show
2 index get-left
3 index get-top
4 index get-default-baseline
sub
moveto
2 index get-text % => Viewport Box Top Bottom Text
3 index
box-text-find-font % => Viewport Box Top Bottom Text <>
setfont
show % => Viewport Box Top Bottom
% draw text decoration
2 index /text-decoration get-css-value
3 index get-text % => Viewport Box Top Bottom Decoration Text
% underline
1 index /underline get { % => Viewport Box Top Bottom Decoration Text
dup
5 index % => Viewport Box Top Bottom Decoration Text Text Box
box-text-draw-underline % => Viewport Box Top Bottom Decoration Text
} if
% overline
1 index /overline get { % => Viewport Box Top Bottom Decoration Text
dup
5 index % => Viewport Box Top Bottom Decoration Text Text Box
box-text-draw-overline % => Viewport Box Top Bottom Decoration Text
} if
% line-through
1 index /line-through get { % => Viewport Box Top Bottom Decoration Text
dup
5 index % => Viewport Box Top Bottom Decoration Text Text Box
box-text-draw-line-through % => Viewport Box Top Bottom Decoration Text
} if
pop pop
} ifelse
} ifelse % => Viewport Box Top Bottom
pop pop pop pop
} def
/get-encoding {
/Encoding get
} def
/get-text { % => Box
/Text get
} def
/put-encoding { % => Encoding Box
exch
/Encoding
exch
put
} def
/put-text { % => Text Box
exch
/Text
exch
put
} def
%%%%%%%%%%%%%%%%%%%%
/show-enc-text-box {
% Check if this box will be cut on the bottom edge of the page (i.e. bottom < 0)
dup get-bottom bmargin gt {
show-enc-text-box-force
} {
% do not display this box; also, store the additional offset to show this text on the next page
/vdelta vdelta 2 index get-top bmargin sub max def
pop
} ifelse
} def
/show-enc-text-box-force { % => Box
show-generic-box % => Box
currentpoint
2 index get-content % => Box X Y Content
aload pop
show-enc-text
moveto
dup get-text-decoration % => Box Decor
dup /Underline known {
currentpoint
3 index get-content % => Box Decor X Y [Text <>]
aload pop pop
draw-underline
moveto
} if
dup /Overline known {
currentpoint
3 index get-content
aload pop pop
draw-overline
moveto
} if
dup /Line-Through known {
currentpoint
3 index get-content
aload pop pop
draw-line-through
moveto
} if
pop % => Box
} def
/show-enc-text { % => Text <>
setfont % => Text
show % =>
} def