380 lines
10 KiB
PostScript
380 lines
10 KiB
PostScript
% $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 <<Font>>
|
|
|
|
exch pop % => <<Font>>
|
|
} 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 <<Font>>
|
|
|
|
dup font-ascender % => Box <<Font>> Ascender
|
|
1 index font-descender % => Box <<Font>> 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 <<Font>>
|
|
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 <<Font>>]
|
|
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 <<Font>>
|
|
setfont % => Text
|
|
show % =>
|
|
} def
|