TextLayout.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:14k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1996 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: TextLayout.3,v 1.5 1999/04/21 21:53:22 rjohnson Exp $
  8. '" 
  9. .so man.macros
  10. .TH Tk_ComputeTextLayout 3 8.1 Tk "Tk Library Procedures"
  11. .BS
  12. .SH NAME
  13. Tk_ComputeTextLayout, Tk_FreeTextLayout, Tk_DrawTextLayout, Tk_UnderlineTextLayout, Tk_PointToChar, Tk_CharBbox, Tk_DistanceToTextLayout, Tk_IntersectTextLayout, Tk_TextLayoutToPostscript - routines to measure and display single-font, multi-line, justified text.
  14. .SH SYNOPSIS
  15. .nf
  16. fB#include <tk.h>fR
  17. .sp
  18. Tk_TextLayout
  19. fBTk_ComputeTextLayout(fItkfont, string, numChars, wrapLength, justify, flags, widthPtr, heightPtrfB)fR
  20. .sp
  21. void
  22. fBTk_FreeTextLayout(fIlayoutfB)fR
  23. .sp
  24. void
  25. fBTk_DrawTextLayout(fIdisplay, drawable, gc, layout, x, y, firstChar, lastCharfB)fR
  26. .sp
  27. void
  28. fBTk_UnderlineTextLayout(fIdisplay, drawable, gc, layout, x, y, underlinefB)fR
  29. .sp
  30. int
  31. fBTk_PointToChar(fIlayout, x, yfB)fR
  32. .sp
  33. int
  34. fBTk_CharBbox(fIlayout, index, xPtr, yPtr, widthPtr, heightPtrfB)fR
  35. .sp
  36. int
  37. fBTk_DistanceToTextLayout(fIlayout, x, yfB)fR
  38. .sp
  39. int
  40. fBTk_IntersectTextLayout(fIlayout, x, y, width, heightfB)fR
  41. .sp
  42. void
  43. fBTk_TextLayoutToPostscript(fIinterp, layoutfB)fR
  44. .SH ARGUMENTS
  45. .AS Tk_TextLayout "*xPtr, *yPtr"
  46. .AP Tk_Font tkfont in
  47. Font to use when constructing and displaying a text layout.  The
  48. fItkfontfR must remain valid for the lifetime of the text layout.  Must
  49. have been returned by a previous call to fBTk_GetFontfR.
  50. .AP "const char" *string in
  51. Potentially multi-line string whose dimensions are to be computed and
  52. stored in the text layout.  The fIstringfR must remain valid for the
  53. lifetime of the text layout.  
  54. .AP int numChars in
  55. The number of characters to consider from fIstringfR.  If
  56. fInumCharsfR is less than 0, then assumes fIstringfR is null
  57. .VS 8.1
  58. terminated and uses fBTcl_NumUtfCharsfR to determine the length of
  59. fIstringfR.
  60. .VE
  61. .AP int wrapLength in
  62. Longest permissible line length, in pixels.  Lines in fIstringfR will
  63. automatically be broken at word boundaries and wrapped when they reach
  64. this length.  If fIwrapLengthfR is too small for even a single
  65. character to fit on a line, it will be expanded to allow one character to
  66. fit on each line.  If fIwrapLengthfR is <= 0, there is no automatic
  67. wrapping; lines will get as long as they need to be and only wrap if a
  68. newline/return character is encountered.
  69. .AP Tk_Justify justify in
  70. How to justify the lines in a multi-line text layout.  Possible values
  71. are TK_JUSTIFY_LEFT, TK_JUSTIFY_CENTER, or TK_JUSTIFY_RIGHT.  If the text
  72. layout only occupies a single line, then fIjustifyfR is irrelevant.  
  73. .AP int flags in
  74. Various flag bits OR-ed together.  TK_IGNORE_TABS means that tab characters
  75. should not be expanded to the next tab stop.  TK_IGNORE_NEWLINES means that
  76. newline/return characters should not cause a line break.  If either tabs or
  77. newlines/returns are ignored, then they will be treated as regular
  78. characters, being measured and displayed in a platform-dependent manner as
  79. described in fBTk_MeasureCharsfR, and will not have any special behaviors.
  80. .AP int *widthPtr out
  81. If non-NULL, filled with either the width, in pixels, of the widest
  82. line in the text layout, or the width, in pixels, of the bounding box for the 
  83. character specified by fIindexfR.
  84. .AP int *heightPtr out
  85. If non-NULL, filled with either the total height, in pixels, of all
  86. the lines in the text layout, or the height, in pixels, of the bounding
  87. box for the character specified by fIindexfR.
  88. .AP Tk_TextLayout layout in
  89. A token that represents the cached layout information about the single-font,
  90. multi-line, justified piece of text.  This token is returned by
  91. fBTk_ComputeTextLayoutfR.
  92. .AP Display *display in
  93. Display on which to draw.
  94. .AP Drawable drawable in
  95. Window or pixmap in which to draw.
  96. .AP GC gc in
  97. Graphics context to use for drawing text layout.  The font selected in
  98. this GC must correspond to the fItkfontfR used when constructing the
  99. text layout.
  100. .AP int "x, y" in
  101. Point, in pixels, at which to place the upper-left hand corner of the
  102. text layout when it is being drawn, or the coordinates of a point (with
  103. respect to the upper-left hand corner of the text layout) to check
  104. against the text layout.
  105. .AP int firstChar in
  106. The index of the first character to draw from the given text layout.  
  107. The number 0 means to draw from the beginning.
  108. .AP int lastChar in
  109. The index of the last character up to which to draw.  The character
  110. specified by fIlastCharfR itself will not be drawn.  A number less
  111. than 0 means to draw all characters in the text layout.
  112. .AP int underline in
  113. Index of the single character to underline in the text layout, or a number
  114. less than 0 for no underline.
  115. .AP int index in
  116. The index of the character whose bounding box is desired.  The bounding
  117. box is computed with respect to the upper-left hand corner of the text layout.
  118. .AP int "*xPtr, *yPtr" out
  119. Filled with the upper-left hand corner, in pixels, of the bounding box
  120. for the character specified by fIindexfR.  Either or both fIxPtrfR
  121. and fIyPtrfR may be NULL, in which case the corresponding value
  122. is not calculated.
  123. .AP int "width, height" in
  124. Specifies the width and height, in pixels, of the rectangular area to 
  125. compare for intersection against the text layout.
  126. .AP Tcl_Interp *interp out
  127. Postscript code that will print the text layout is appended to
  128. fIinterp->resultfR.
  129. .BE
  130. .SH DESCRIPTION
  131. .PP
  132. These routines are for measuring and displaying single-font, multi-line,
  133. justified text.  To measure and display simple single-font, single-line
  134. strings, refer to the documentation for fBTk_MeasureCharsfR.  There is
  135. no programming interface in the core of Tk that supports multi-font,
  136. multi-line text; support for that behavior must be built on top of
  137. simpler layers.  
  138. .VS 8.1
  139. Note that unlike the lower level text display routines, the functions
  140. described here all operate on character-oriented lengths and indices
  141. rather than byte-oriented values.  See the description of
  142. fBTcl_UtfAtIndexfR for more details on converting between character
  143. and byte offsets.
  144. .VE 8.1
  145. .PP
  146. The routines described here are built on top of the programming interface
  147. described in the fBTk_MeasureCharsfR documentation.  Tab characters and
  148. newline/return characters may be treated specially by these procedures,
  149. but all other characters are passed through to the lower level.
  150. .PP
  151. fBTk_ComputeTextLayoutfR computes the layout information needed to
  152. display a single-font, multi-line, justified fIstringfR of text and
  153. returns a Tk_TextLayout token that holds this information.  This token is
  154. used in subsequent calls to procedures such as fBTk_DrawTextLayoutfR,
  155. fBTk_DistanceToTextLayoutfR, and fBTk_FreeTextLayoutfR.  The
  156. fIstringfR and fItkfontfR used when computing the layout must remain
  157. valid for the lifetime of this token.  
  158. .PP
  159. fBTk_FreeTextLayoutfR is called to release the storage associated with
  160. fIlayoutfR when it is no longer needed.  A fIlayoutfR should not be used
  161. in any other text layout procedures once it has been released. 
  162. .PP
  163. fBTk_DrawTextLayoutfR uses the information in fIlayoutfR to display a
  164. single-font, multi-line, justified string of text at the specified location.
  165. .PP
  166. fBTk_UnderlineTextLayoutfR uses the information in fIlayoutfR to
  167. display an underline below an individual character.  This procedure does
  168. not draw the text, just the underline.  To produce natively underlined
  169. text, an underlined font should be constructed and used.  All characters,
  170. including tabs, newline/return characters, and spaces at the ends of
  171. lines, can be underlined using this method.  However, the underline will
  172. never be drawn outside of the computed width of fIlayoutfR; the
  173. underline will stop at the edge for any character that would extend
  174. partially outside of fIlayoutfR, and the underline will not be visible
  175. at all for any character that would be located completely outside of the
  176. layout.
  177. .PP
  178. fBTk_PointToCharfR uses the information in fIlayoutfR to determine the
  179. character closest to the given point.  The point is specified with respect
  180. to the upper-left hand corner of the fIlayoutfR, which is considered to be
  181. located at (0, 0).  Any point whose fIyfR-value is less that 0 will be
  182. considered closest to the first character in the text layout; any point
  183. whose fIyfR-value is greater than the height of the text layout will be
  184. considered closest to the last character in the text layout.  Any point
  185. whose fIxfR-value is less than 0 will be considered closest to the first
  186. character on that line; any point whose fIxfR-value is greater than the
  187. width of the text layout will be considered closest to the last character on
  188. that line.  The return value is the index of the character that was closest
  189. to the point.  Given a fIlayoutfR with no characters, the value 0 will
  190. always be returned, referring to a hypothetical zero-width placeholder
  191. character.  
  192. .PP
  193. fBTk_CharBboxfR uses the information in fIlayoutfR to return the
  194. bounding box for the character specified by fIindexfR.  The width of the
  195. bounding box is the advance width of the character, and does not include any
  196. left or right bearing.  Any character that extends partially outside of 
  197. fIlayoutfR is considered to be truncated at the edge.  Any character
  198. that would be located completely outside of fIlayoutfR is considered to
  199. be zero-width and pegged against the edge.  The height of the bounding
  200. box is the line height for this font, extending from the top of the
  201. ascent to the bottom of the descent; information about the actual height
  202. of individual letters is not available.  For measurement purposes, a
  203. fIlayoutfR that contains no characters is considered to contain a
  204. single zero-width placeholder character at index 0.  If fIindexfR was
  205. not a valid character index, the return value is 0 and fI*xPtrfR,
  206. fI*yPtrfR, fI*widthPtrfR, and fI*heightPtrfR are unmodified.
  207. Otherwise, if fIindexfR did specify a valid, the return value is
  208. non-zero, and fI*xPtrfR, fI*yPtrfR, fI*widthPtrfR, and
  209. fI*heightPtrfR are filled with the bounding box information for the
  210. character.  If any of fIxPtrfR, fIyPtrfR, fIwidthPtrfR, or
  211. fIheightPtrfR are NULL, the corresponding value is not calculated or
  212. stored.
  213. .PP
  214. fBTk_DistanceToTextLayoutfR computes the shortest distance in pixels from
  215. the given point (fIx, yfR) to the characters in fIlayoutfR.
  216. Newline/return characters and non-displaying space characters that occur at
  217. the end of individual lines in the text layout are ignored for hit detection
  218. purposes, but tab characters are not.  The return value is 0 if the point
  219. actually hits the fIlayoutfR.  If the point didn't hit the fIlayoutfR
  220. then the return value is the distance in pixels from the point to the
  221. fIlayoutfR.
  222. .PP
  223. fBTk_IntersectTextLayoutfR determines whether a fIlayoutfR lies
  224. entirely inside, entirely outside, or overlaps a given rectangle.
  225. Newline/return characters and non-displaying space characters that occur
  226. at the end of individual lines in the fIlayoutfR are ignored for
  227. intersection calculations.  The return value is -1 if the fIlayoutfR is
  228. entirely outside of the rectangle, 0 if it overlaps, and 1 if it is
  229. entirely inside of the rectangle.
  230. .PP
  231. fBTk_TextLayoutToPostscriptfR outputs code consisting of a Postscript
  232. array of strings that represent the individual lines in fIlayoutfR.  It
  233. is the responsibility of the caller to take the Postscript array of
  234. strings and add some Postscript function operate on the array to render
  235. each of the lines.  The code that represents the Postscript array of
  236. strings is appended to fIinterp->resultfR.
  237. .PP
  238. .SH DISPLAY MODEL
  239. When measuring a text layout, space characters that occur at the end of a
  240. line are ignored.  The space characters still exist and the insertion point
  241. can be positioned amongst them, but their additional width is ignored when
  242. justifying lines or returning the total width of a text layout.  All
  243. end-of-line space characters are considered to be attached to the right edge
  244. of the line; this behavior is logical for left-justified text and reasonable
  245. for center-justified text, but not very useful when editing right-justified
  246. text.  Spaces are considered variable width characters; the first space that
  247. extends past the edge of the text layout is clipped to the edge, and any
  248. subsequent spaces on the line are considered zero width and pegged against
  249. the edge.  Space characters that occur in the middle of a line of text are
  250. not suppressed and occupy their normal space width.
  251. .PP
  252. Tab characters are not ignored for measurement calculations.  If wrapping
  253. is turned on and there are enough tabs on a line, the next tab will wrap
  254. to the beginning of the next line.  There are some possible strange
  255. interactions between tabs and justification; tab positions are calculated
  256. and the line length computed in a left-justified world, and then the
  257. whole resulting line is shifted so it is centered or right-justified,
  258. causing the tab columns not to align any more.
  259. .PP
  260. When wrapping is turned on, lines may wrap at word breaks (space or tab
  261. characters) or newline/returns.  A dash or hyphen character in the middle
  262. of a word is not considered a word break.  fBTk_ComputeTextLayoutfR
  263. always attempts to place at least one word on each line.  If it cannot
  264. because the fIwrapLengthfR is too small, the word will be broken and as
  265. much as fits placed on the line and the rest on subsequent line(s).  If
  266. fIwrapLengthfR is so small that not even one character can fit on a
  267. given line, the fIwrapLengthfR is ignored for that line and one
  268. character will be placed on the line anyhow.  When wrapping is turned
  269. off, only newline/return characters may cause a line break.  
  270. .PP
  271. When a text layout has been created using an underlined fItkfontfR,
  272. then any space characters that occur at the end of individual lines,
  273. newlines/returns, and tabs will not be displayed underlined when 
  274. fBTk_DrawTextLayoutfR is called, because those characters are never
  275. actually drawn - they are merely placeholders maintained in the
  276. fIlayoutfR.  
  277. .SH KEYWORDS
  278. font