Font.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. /*
  2. * CDE - Common Desktop Environment
  3. *
  4. * Copyright (c) 1993-2012, The Open Group. All rights reserved.
  5. *
  6. * These libraries and programs are free software; you can
  7. * redistribute them and/or modify them under the terms of the GNU
  8. * Lesser General Public License as published by the Free Software
  9. * Foundation; either version 2 of the License, or (at your option)
  10. * any later version.
  11. *
  12. * These libraries and programs are distributed in the hope that
  13. * they will be useful, but WITHOUT ANY WARRANTY; without even the
  14. * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  15. * PURPOSE. See the GNU Lesser General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with these librararies and programs; if not, write
  20. * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
  21. * Floor, Boston, MA 02110-1301 USA
  22. */
  23. /* $XConsortium: Font.c /main/11 1996/04/13 11:54:17 ageorge $ */
  24. /************************************<+>*************************************
  25. ****************************************************************************
  26. **
  27. ** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
  28. **
  29. ** (c) Copyright 1993, 1994 Hewlett-Packard Company
  30. ** (c) Copyright 1993, 1994 International Business Machines Corp.
  31. ** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
  32. ** (c) Copyright 1993, 1994 Novell, Inc.
  33. **
  34. ****************************************************************************
  35. ************************************<+>*************************************/
  36. /*
  37. * system includes
  38. */
  39. #include <stdlib.h>
  40. #include <X11/Xlib.h>
  41. #include <X11/Xlibint.h>
  42. #include <X11/Xresource.h>
  43. #include <Xm/Xm.h>
  44. /*
  45. * private includes
  46. */
  47. #include "DisplayAreaP.h"
  48. #include "FontI.h"
  49. #include "Lock.h"
  50. /*
  51. * private core engine
  52. */
  53. #include "StringFuncsI.h"
  54. #ifdef NLS16
  55. #endif
  56. /******** Private Function Declarations ********/
  57. /******** End Public Function Declarations ********/
  58. /******************************************************************************
  59. *
  60. * Private variables and defines.
  61. *
  62. *****************************************************************************/
  63. static const char *FontResources[] =
  64. {
  65. /*! The serif proportional family */
  66. /*! medium upright */
  67. "*p.6.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-80-*-*-p-*-iso8859-1",
  68. "*p.8.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-100-*-*-p-*-iso8859-1",
  69. "*p.10.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-120-*-*-p-*-iso8859-1",
  70. "*p.12.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-140-*-*-p-*-iso8859-1",
  71. "*p.14.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-180-*-*-p-*-iso8859-1",
  72. /*! bold upright */
  73. "*p.6.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-80-*-*-p-*-iso8859-1",
  74. "*p.8.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-100-*-*-p-*-iso8859-1",
  75. "*p.10.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-120-*-*-p-*-iso8859-1",
  76. "*p.12.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-140-*-*-p-*-iso8859-1",
  77. "*p.14.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-180-*-*-p-*-iso8859-1",
  78. /*! medium italic */
  79. "*p.6.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-80-*-*-p-*-iso8859-1",
  80. "*p.8.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-100-*-*-p-*-iso8859-1",
  81. "*p.10.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-120-*-*-p-*-iso8859-1",
  82. "*p.12.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-140-*-*-p-*-iso8859-1",
  83. "*p.14.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-180-*-*-p-*-iso8859-1",
  84. /*! bold italic */
  85. "*p.6.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-80-*-*-p-*-iso8859-1",
  86. "*p.8.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-100-*-*-p-*-iso8859-1",
  87. "*p.10.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-120-*-*-p-*-iso8859-1",
  88. "*p.12.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-140-*-*-p-*-iso8859-1",
  89. "*p.14.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-180-*-*-p-*-iso8859-1",
  90. /*! The sans serif proportional family */
  91. /*! medium upright */
  92. "*p.6.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-80-*-*-p-*-iso8859-1",
  93. "*p.8.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-100-*-*-p-*-iso8859-1",
  94. "*p.10.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-120-*-*-p-*-iso8859-1",
  95. "*p.12.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-140-*-*-p-*-iso8859-1",
  96. "*p.14.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-180-*-*-p-*-iso8859-1",
  97. /*!bold upright */
  98. "*p.6.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-80-*-*-p-*-iso8859-1",
  99. "*p.8.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-100-*-*-p-*-iso8859-1",
  100. "*p.10.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-120-*-*-p-*-iso8859-1",
  101. "*p.12.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-140-*-*-p-*-iso8859-1",
  102. "*p.14.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-180-*-*-p-*-iso8859-1",
  103. /*! medium italic */
  104. "*p.6.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-80-*-*-p-*-iso8859-1",
  105. "*p.8.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-100-*-*-p-*-iso8859-1",
  106. "*p.10.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-120-*-*-p-*-iso8859-1",
  107. "*p.12.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-140-*-*-p-*-iso8859-1",
  108. "*p.14.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-180-*-*-p-*-iso8859-1",
  109. /*! bold italic */
  110. "*p.6.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-80-*-*-p-*-iso8859-1",
  111. "*p.8.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-100-*-*-p-*-iso8859-1",
  112. "*p.10.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-120-*-*-p-*-iso8859-1",
  113. "*p.12.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-140-*-*-p-*-iso8859-1",
  114. "*p.14.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-180-*-*-p-*-iso8859-1",
  115. /*! The monospace family - lump serif & sans serif together */
  116. /*! medium upright */
  117. "*m.6.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-80-*-*-m-*-iso8859-1",
  118. "*m.8.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-100-*-*-m-*-iso8859-1",
  119. "*m.10.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-120-*-*-m-*-iso8859-1",
  120. "*m.12.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-140-*-*-m-*-iso8859-1",
  121. "*m.14.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-180-*-*-m-*-iso8859-1",
  122. /*! bold upright */
  123. "*m.6.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-80-*-*-m-*-iso8859-1",
  124. "*m.8.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-100-*-*-m-*-iso8859-1",
  125. "*m.10.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-120-*-*-m-*-iso8859-1",
  126. "*m.12.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-140-*-*-m-*-iso8859-1",
  127. "*m.14.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-180-*-*-m-*-iso8859-1",
  128. /*! medium italic */
  129. "*m.6.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-80-*-*-m-*-iso8859-1",
  130. "*m.8.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-100-*-*-m-*-iso8859-1",
  131. "*m.10.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-120-*-*-m-*-iso8859-1",
  132. "*m.12.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-140-*-*-m-*-iso8859-1",
  133. "*m.14.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-180-*-*-m-*-iso8859-1",
  134. /*! bold italic */
  135. "*m.6.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-80-*-*-m-*-iso8859-1",
  136. "*m.8.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-100-*-*-m-*-iso8859-1",
  137. "*m.10.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-120-*-*-m-*-iso8859-1",
  138. "*m.12.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-140-*-*-m-*-iso8859-1",
  139. "*m.14.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-180-*-*-m-*-iso8859-1",
  140. /*! SYMBOL */
  141. "*6.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-80-*-*-*-*-dtsymbol-1",
  142. "*8.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-100-*-*-*-*-dtsymbol-1",
  143. "*10.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-120-*-*-*-*-dtsymbol-1",
  144. "*12.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-140-*-*-*-*-dtsymbol-1",
  145. "*14.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-180-*-*-*-*-dtsymbol-1",
  146. /* for ISO-8859-2 */
  147. "*.6.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  148. "*.8.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  149. "*.10.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  150. "*.12.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  151. "*.14.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  152. /* for ISO-8859-5 */
  153. "*.6.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  154. "*.8.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  155. "*.10.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  156. "*.12.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  157. "*.14.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  158. /* for ISO-8859-6 */
  159. "*.6.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  160. "*.8.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  161. "*.10.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  162. "*.12.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  163. "*.14.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  164. /* for ISO-8859-7 */
  165. "*.6.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  166. "*.8.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  167. "*.10.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  168. "*.12.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  169. "*.14.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  170. /* for ISO-8859-8 */
  171. "*.6.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  172. "*.8.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  173. "*.10.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  174. "*.12.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  175. "*.14.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  176. /* for ISO-8859-9 */
  177. "*.6.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  178. "*.8.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  179. "*.10.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  180. "*.12.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  181. "*.14.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  182. /* for EUC-KR */
  183. "*.6.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  184. "*.8.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  185. "*.10.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  186. "*.12.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  187. "*.14.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  188. /* for EUC-JP */
  189. "*.6.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  190. "*.8.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  191. "*.10.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  192. "*.12.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  193. "*.14.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  194. /* for EUC-TW */
  195. "*.6.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  196. "*.8.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  197. "*.10.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  198. "*.12.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  199. "*.14.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  200. /* for EUC-CN */
  201. "*.6.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  202. "*.8.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  203. "*.10.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  204. "*.12.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  205. "*.14.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  206. /* for IBM-437 */
  207. "*.6.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  208. "*.8.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  209. "*.10.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  210. "*.12.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  211. "*.14.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  212. /* for IBM-850 */
  213. "*.6.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  214. "*.8.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  215. "*.10.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  216. "*.12.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  217. "*.14.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  218. /* for IBM-856 */
  219. "*.6.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  220. "*.8.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  221. "*.10.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  222. "*.12.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  223. "*.14.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  224. /* for IBM-932 */
  225. "*.6.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  226. "*.8.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  227. "*.10.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  228. "*.12.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  229. "*.14.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  230. /* for IBM-1046 */
  231. "*.6.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  232. "*.8.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  233. "*.10.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  234. "*.12.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  235. "*.14.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  236. /* for UTF-8 */
  237. "*.6.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
  238. "*.8.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
  239. "*.10.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
  240. "*.12.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
  241. "*.14.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
  242. NULL,
  243. };
  244. #define GROW_SIZE 5
  245. static Boolean QuarksInited = FALSE;
  246. static XrmQuark StringFontQuark = 0;
  247. static XrmName DefaultFontQuarks[_DtHelpFontQuarkNumber];
  248. static XrmBinding FontBindings[_DtHelpFontQuarkNumber] =
  249. { XrmBindLoosely, XrmBindLoosely, XrmBindLoosely, XrmBindLoosely,
  250. XrmBindLoosely, XrmBindLoosely, XrmBindLoosely };
  251. static DtHelpDAFSMetrics DefaultMetrics = { FALSE, { 0, 0 } };
  252. static DtHelpDAFontInfo DefFontInfo = { NULL, NULL, NULL, NULL, NULL,
  253. NULL, 0, NULL, 0, 0, 0, 0, 0};
  254. /******************************************************************************
  255. *
  256. * Semi Public variables.
  257. *
  258. *****************************************************************************/
  259. /******************************************************************************
  260. *
  261. * Private Functions
  262. *
  263. *****************************************************************************/
  264. /******************************************************************************
  265. * Function: SaveFontStruct (font_struct)
  266. *
  267. *****************************************************************************/
  268. static int
  269. SaveFontStruct (
  270. XFontStruct *font_struct,
  271. DtHelpDAFontInfo *font_info)
  272. {
  273. int fontIndex;
  274. fontIndex = font_info->struct_cnt++;
  275. if (font_info->struct_cnt >= font_info->max_structs)
  276. {
  277. font_info->max_structs += GROW_SIZE;
  278. if (font_info->font_structs != NULL)
  279. font_info->font_structs = (XFontStruct **) realloc (
  280. ((char *) font_info->font_structs),
  281. (sizeof (XFontStruct *) * font_info->max_structs));
  282. else
  283. font_info->font_structs = (XFontStruct **) malloc (
  284. sizeof (XFontStruct *) * font_info->max_structs);
  285. }
  286. font_info->font_structs[fontIndex] = font_struct;
  287. return (fontIndex);
  288. }
  289. /******************************************************************************
  290. * Function: SaveFontSet (font_set)
  291. *
  292. *****************************************************************************/
  293. static int
  294. SaveFontSet (
  295. XFontSet font_set,
  296. DtHelpDAFontInfo *font_info)
  297. {
  298. int fontIndex = 0;
  299. fontIndex = font_info->set_cnt++;
  300. if (font_info->set_cnt >= font_info->max_sets)
  301. {
  302. font_info->max_sets += GROW_SIZE;
  303. if (font_info->font_sets != NULL)
  304. {
  305. font_info->font_sets = (XFontSet *) realloc (
  306. ((char *) font_info->font_sets),
  307. (sizeof (XFontSet) * font_info->max_sets));
  308. font_info->fs_metrics = (DtHelpDAFSMetrics *) realloc (
  309. ((char *) font_info->fs_metrics),
  310. (sizeof (DtHelpDAFSMetrics) * font_info->max_sets));
  311. }
  312. else
  313. {
  314. font_info->font_sets = (XFontSet *) malloc (
  315. sizeof(XFontSet) * font_info->max_sets);
  316. font_info->fs_metrics = (DtHelpDAFSMetrics *) malloc (
  317. sizeof (DtHelpDAFSMetrics) * font_info->max_sets);
  318. }
  319. }
  320. font_info->font_sets[fontIndex] = font_set;
  321. font_info->fs_metrics[fontIndex] = DefaultMetrics;
  322. /*
  323. * want the font sets to go from -1 to -n because negative numbers
  324. * indicate a font set.
  325. */
  326. fontIndex++;
  327. return (-fontIndex);
  328. }
  329. /******************************************************************************
  330. * Function: LoadFont (char *font_string, int *ret_index)
  331. *
  332. *****************************************************************************/
  333. static short
  334. LoadFont (
  335. Display *dpy,
  336. DtHelpDAFontInfo *font_info,
  337. char *font_string,
  338. long *ret_index)
  339. {
  340. short found = False;
  341. short colon = False;
  342. int len;
  343. char *junk;
  344. char *strPtr;
  345. char **missingFontSet = NULL;
  346. XFontStruct *fontStruct = NULL;
  347. XFontSet fontSet;
  348. strPtr = font_string;
  349. /*
  350. * if working with one byte environment, do it the fast, cheap way.
  351. */
  352. if (MB_CUR_MAX == 1)
  353. {
  354. len = strlen(strPtr);
  355. if (len > 0)
  356. len--;
  357. while (len > 0 && strPtr[len] == ' ')
  358. len--;
  359. if (strPtr[len] == ':')
  360. {
  361. colon = True;
  362. junk = strPtr + len;
  363. }
  364. }
  365. else
  366. {
  367. /*
  368. * Multibyte environment, have to go through the characters one at
  369. * a time.
  370. */
  371. while (*strPtr != '\0')
  372. {
  373. /*
  374. * Process looking for a colon.
  375. */
  376. len = mblen(strPtr, MB_CUR_MAX);
  377. if (len == -1)
  378. len = 1;
  379. else if (len == 1 && *strPtr == ':')
  380. {
  381. colon = True;
  382. junk = strPtr;
  383. }
  384. else if (len != 1 || *strPtr != ' ')
  385. colon = False;
  386. strPtr += len;
  387. }
  388. }
  389. if (colon == False)
  390. {
  391. fontStruct = XLoadQueryFont (dpy, font_string);
  392. if (fontStruct != NULL)
  393. {
  394. *ret_index = SaveFontStruct (fontStruct, font_info);
  395. found = True;
  396. }
  397. }
  398. else
  399. {
  400. *junk = '\0';
  401. fontSet = XCreateFontSet (dpy, font_string, &missingFontSet,
  402. &len, NULL);
  403. if (fontSet != NULL)
  404. {
  405. /*
  406. * want the font sets to go from -1 to -n because 0 is
  407. * the default font.
  408. */
  409. *ret_index = SaveFontSet (fontSet, font_info);
  410. found = True;
  411. }
  412. if (len)
  413. XFreeStringList (missingFontSet);
  414. /*
  415. * restore colon
  416. */
  417. *junk = ':';
  418. }
  419. return found;
  420. }
  421. /******************************************************************************
  422. *
  423. * Semi Public Functions
  424. *
  425. *****************************************************************************/
  426. /******************************************************************************
  427. * Function: int __DtHelpFontIndexGet (Display dpy, XrmQuarkList xrm_list)
  428. *
  429. * Parameters: xrm_list Specifies the quark list for the font desired.
  430. *
  431. * Return Value: 0 if successful, -1 if using default font index.
  432. *
  433. * Purpose: Find the appropriate font to use for a quark set.
  434. *
  435. *****************************************************************************/
  436. int
  437. __DtHelpFontIndexGet (
  438. DtHelpDispAreaStruct *pDAS,
  439. XrmQuarkList xrm_list,
  440. long *ret_idx)
  441. {
  442. int result = -1;
  443. long fontIndex = pDAS->font_info.def_idx;
  444. XrmRepresentation retType;
  445. XrmValue retValue;
  446. char buffer[10];
  447. char *fontSpec;
  448. XrmName xrmList[3];
  449. DtHelpDAFontInfo *fontInfo = &(pDAS->font_info);
  450. Display *dpy = XtDisplay(pDAS->dispWid);
  451. /*
  452. * look in my font data base to see if I've already processed
  453. * this sequence of quarks.
  454. */
  455. if (XrmQGetResource (fontInfo->font_idx_db, xrm_list, xrm_list, &retType,
  456. &retValue))
  457. {
  458. fontIndex = *((int *)retValue.addr);
  459. result = 0;
  460. }
  461. else
  462. {
  463. /*
  464. * Check my parent's data base for an XLFD spec.
  465. */
  466. fontSpec = NULL;
  467. if (XrmQGetResource (XrmGetDatabase(dpy), xrm_list, xrm_list,
  468. &retType, &retValue))
  469. {
  470. fontSpec = ((char *) retValue.addr);
  471. if (LoadFont (dpy, fontInfo, fontSpec, &fontIndex))
  472. result = 0;
  473. }
  474. /*
  475. * If my parent didn't have anything, check my private database.
  476. */
  477. if (result != 0 &&
  478. XrmQGetResource (fontInfo->def_font_db, xrm_list, xrm_list,
  479. &retType, &retValue))
  480. {
  481. fontSpec = ((char *) retValue.addr);
  482. if (LoadFont (dpy, fontInfo, fontSpec, &fontIndex))
  483. result = 0;
  484. }
  485. /*
  486. * if unsuccessful on finding a font for this quark list.
  487. * save out using the default font
  488. */
  489. retValue.size = sizeof (int);
  490. retValue.addr = (XtPointer) &fontIndex;
  491. XrmQPutResource (&(fontInfo->font_idx_db),
  492. ((XrmBindingList) FontBindings),
  493. xrm_list, _DtHelpXrmInt, &retValue);
  494. /*
  495. * remember the character set for this font.
  496. */
  497. sprintf (buffer, "%ld", fontIndex);
  498. retValue.size = sizeof (XrmQuark);
  499. retValue.addr = (XtPointer) &xrm_list[_DT_HELP_FONT_CHAR_SET];
  500. xrmList[0] = XrmStringToQuark (buffer);
  501. xrmList[1] = XrmStringToQuark ("code_set");
  502. xrmList[2] = 0;
  503. XrmQPutResource (&(fontInfo->font_idx_db),
  504. ((XrmBindingList) FontBindings),
  505. xrmList, _DtHelpXrmQuark, &retValue);
  506. /*
  507. * remember the language for this font.
  508. */
  509. retValue.addr = (XtPointer) &xrm_list[_DT_HELP_FONT_LANG_TER];
  510. xrmList[1] = XrmStringToQuark ("language");
  511. XrmQPutResource (&(fontInfo->font_idx_db),
  512. ((XrmBindingList) FontBindings),
  513. xrmList, _DtHelpXrmQuark, &retValue);
  514. }
  515. *ret_idx = fontIndex;
  516. return result;
  517. }
  518. /******************************************************************************
  519. * Function: int __DtHelpFontCharSetQuarkGet (font_index, XrmQuark *ret_quark)
  520. *
  521. * Parameters: font_index Specifies the font in the font table.
  522. * ret_quark Returns the quark specifying the character
  523. * set of the font.
  524. *
  525. * Return Value: Returns 0 if successful, -1 if failed.
  526. *
  527. * Purpose: Gets the character set associated with a font.
  528. *
  529. *****************************************************************************/
  530. int
  531. __DtHelpFontCharSetQuarkGet (
  532. DtHelpDispAreaStruct *pDAS,
  533. long font_index,
  534. XrmQuark *ret_quark )
  535. {
  536. XrmRepresentation retType;
  537. XrmValue retValue;
  538. char buffer[10];
  539. XrmName xrmList[3];
  540. int result = 0;
  541. /*
  542. * quarkize the font index
  543. */
  544. sprintf (buffer, "%ld", font_index);
  545. xrmList[0] = XrmStringToQuark (buffer);
  546. xrmList[1] = XrmStringToQuark ("code_set");
  547. xrmList[2] = 0;
  548. /*
  549. * look in my font data base for the quark.
  550. */
  551. if (XrmQGetResource (pDAS->font_info.font_idx_db, xrmList, xrmList,
  552. &retType, &retValue))
  553. *ret_quark = *((XrmQuark *)retValue.addr);
  554. else
  555. result = -1;
  556. return result;
  557. }
  558. /******************************************************************************
  559. * Function: int __DtHelpFontLangQuarkGet (font_index, XrmQuark *ret_quark)
  560. *
  561. * Parameters: font_index Specifies the font in the font table.
  562. * ret_quark Returns the quark specifying the character
  563. * set of the font.
  564. *
  565. * Return Value: Returns 0 if successful, -1 if failed.
  566. *
  567. * Purpose: Gets the character set associated with a font.
  568. *
  569. *****************************************************************************/
  570. int
  571. __DtHelpFontLangQuarkGet (
  572. DtHelpDispAreaStruct *pDAS,
  573. long font_index,
  574. XrmQuark *ret_quark )
  575. {
  576. XrmRepresentation retType;
  577. XrmValue retValue;
  578. char buffer[10];
  579. XrmName xrmList[3];
  580. int result = 0;
  581. /*
  582. * quarkize the font index
  583. */
  584. sprintf (buffer, "%ld", font_index);
  585. xrmList[0] = XrmStringToQuark (buffer);
  586. xrmList[1] = XrmStringToQuark ("language");
  587. xrmList[2] = 0;
  588. /*
  589. * look in my font data base for the quark.
  590. */
  591. if (XrmQGetResource (pDAS->font_info.font_idx_db, xrmList, xrmList,
  592. &retType, &retValue))
  593. *ret_quark = *((XrmQuark *)retValue.addr);
  594. else
  595. result = -1;
  596. return result;
  597. }
  598. /******************************************************************************
  599. * Function: void _DtHelpCopyDefaultList (xrm_name)
  600. *
  601. * Parameters: xrm_name The quark list to fill out.
  602. *
  603. * Return Value: void
  604. *
  605. * Purpose: Initializes the font data base.
  606. *****************************************************************************/
  607. void
  608. _DtHelpCopyDefaultList (
  609. XrmName *xrm_list)
  610. {
  611. int n;
  612. for (n = 0; n < _DT_HELP_FONT_END + 1; n++)
  613. xrm_list[n] = DefaultFontQuarks[n];
  614. }
  615. /******************************************************************************
  616. * Function: void _DtHelpGetStringQuarks (xrm_name)
  617. *
  618. * Parameters: xrm_name The quark list to fill out.
  619. *
  620. * Return Value: void
  621. *
  622. * Purpose: Initializes the font data base.
  623. *****************************************************************************/
  624. void
  625. _DtHelpGetStringQuarks (
  626. XrmName *xrm_list)
  627. {
  628. _DtHelpCopyDefaultList(xrm_list);
  629. xrm_list[_DT_HELP_FONT_CHAR_SET] = StringFontQuark;
  630. }
  631. /******************************************************************************
  632. * Function: void __DtHelpFontDatabaseInit (dpy, default_font, type, tmp)
  633. *
  634. * Parameters: dpy Specifies the connection to the display server.
  635. * default_font Specifies the base font.
  636. * type Specifies the type of font 'default_font' is.
  637. *
  638. * Return Value: void
  639. *
  640. * Purpose: Initializes the font data base.
  641. *
  642. *****************************************************************************/
  643. void
  644. __DtHelpFontDatabaseInit (
  645. DtHelpDispAreaStruct *pDAS,
  646. XtPointer string_font,
  647. XmFontType type,
  648. XFontStruct *user_font)
  649. {
  650. int n;
  651. int strIdx;
  652. int found = FALSE;
  653. Display *dpy = XtDisplay(pDAS->dispWid);
  654. DtHelpDAFontInfo *fontInfo = &(pDAS->font_info);
  655. XrmValue retValue;
  656. XrmRepresentation retType;
  657. XrmName xrmList[_DtHelpFontQuarkNumber];
  658. /*
  659. * build our default data base
  660. */
  661. *fontInfo = DefFontInfo;
  662. for (n = 0; FontResources[n]; n++)
  663. XrmPutLineResource (&(fontInfo->def_font_db), FontResources[n]);
  664. /*
  665. * build the default quark set.
  666. */
  667. _DtHelpProcessLock();
  668. if (QuarksInited == False)
  669. {
  670. StringFontQuark = XrmStringToQuark ("String");
  671. DefaultFontQuarks[_DT_HELP_FONT_SPACING] = XrmStringToQuark ("p");
  672. DefaultFontQuarks[_DT_HELP_FONT_SIZE] = XrmStringToQuark ("10");
  673. DefaultFontQuarks[_DT_HELP_FONT_ANGLE] = XrmStringToQuark ("roman");
  674. DefaultFontQuarks[_DT_HELP_FONT_WEIGHT] = XrmStringToQuark ("medium");
  675. DefaultFontQuarks[_DT_HELP_FONT_TYPE] =
  676. XrmStringToQuark ("sans_serif");
  677. DefaultFontQuarks[_DT_HELP_FONT_LANG_TER] = XrmStringToQuark ("C");
  678. DefaultFontQuarks[_DT_HELP_FONT_CHAR_SET] =
  679. XrmStringToQuark ("ISO-8859-1");
  680. DefaultFontQuarks[_DT_HELP_FONT_END] = 0;
  681. QuarksInited = True;
  682. }
  683. _DtHelpProcessUnlock();
  684. /*
  685. * if the string_font is null, used the default user's font for strings.
  686. */
  687. if (string_font == NULL)
  688. {
  689. /*
  690. * WARNING...what if the user_font is null? And what type is it?
  691. */
  692. string_font = (XtPointer) user_font;
  693. type = XmFONT_IS_FONT;
  694. }
  695. /*
  696. * save the string font in the lists
  697. */
  698. if (type == XmFONT_IS_FONTSET)
  699. strIdx = SaveFontSet ((XFontSet) string_font, fontInfo);
  700. else
  701. strIdx = SaveFontStruct ((XFontStruct *) string_font, fontInfo);
  702. /*
  703. * Save this idx font for ascii files and strings.
  704. */
  705. _DtHelpGetStringQuarks(xrmList);
  706. retValue.size = sizeof (int);
  707. retValue.addr = (XtPointer) &(strIdx);
  708. XrmQPutResource (&(fontInfo->font_idx_db), ((XrmBindingList) FontBindings),
  709. xrmList, _DtHelpXrmInt, &retValue);
  710. /*
  711. * try to get the default font for help information
  712. * from the parent's database.
  713. */
  714. if (XrmQGetResource (XrmGetDatabase(dpy), DefaultFontQuarks,
  715. DefaultFontQuarks, &retType, &retValue))
  716. found = LoadFont (dpy, fontInfo, ((char *) retValue.addr),
  717. &(fontInfo->def_idx));
  718. /*
  719. * If the XLFD font spec wasn't in the parent's database,
  720. * look at my private database.
  721. */
  722. if (found == False &&
  723. XrmQGetResource (fontInfo->def_font_db,
  724. DefaultFontQuarks, DefaultFontQuarks,
  725. &retType, &retValue))
  726. found = LoadFont (dpy, fontInfo, ((char *) retValue.addr),
  727. &(fontInfo->def_idx));
  728. /*
  729. * If still no luck, use the string font passed in.
  730. */
  731. if (found == False)
  732. fontInfo->def_idx = strIdx;
  733. /*
  734. * Remember we got this font for this quark string.
  735. */
  736. retValue.size = sizeof (int);
  737. retValue.addr = (XtPointer) &(fontInfo->def_idx);
  738. XrmQPutResource (&(fontInfo->font_idx_db), ((XrmBindingList) FontBindings),
  739. DefaultFontQuarks, _DtHelpXrmInt, &retValue);
  740. }
  741. /******************************************************************************
  742. * Function: XFontStruct *__DtHelpFontStructGet (long font_index );
  743. *
  744. * Parameters: font_index Specifies an index into the Font Structure
  745. * List.
  746. *
  747. * Return Value: Returns the font structure.
  748. *
  749. * Purpose:
  750. *
  751. *****************************************************************************/
  752. XFontStruct *
  753. __DtHelpFontStructGet (
  754. DtHelpDAFontInfo font_info,
  755. long font_index)
  756. {
  757. if (font_index > -1 && font_index < font_info.struct_cnt)
  758. return font_info.font_structs[font_index];
  759. return NULL;
  760. }
  761. /******************************************************************************
  762. * Function: XFontSet __DtHelpFontSetGet (long font_index);
  763. *
  764. * Parameters: font_index Specifies an index into the Font Set List.
  765. *
  766. * Return Value: Returns the font structure.
  767. *
  768. * Purpose:
  769. *
  770. *****************************************************************************/
  771. XFontSet
  772. __DtHelpFontSetGet (
  773. DtHelpDAFontInfo font_info,
  774. long font_index)
  775. {
  776. if (font_index < 0)
  777. {
  778. font_index = -font_index;
  779. font_index--;
  780. if (font_index < font_info.set_cnt)
  781. return font_info.font_sets[font_index];
  782. }
  783. return NULL;
  784. }
  785. /******************************************************************************
  786. * Function: long __DtHelpDefaultFontIndexGet ();
  787. *
  788. * Parameters:
  789. *
  790. * Return Value: Returns the index for the default font set/structure.
  791. *
  792. * Purpose:
  793. *
  794. *****************************************************************************/
  795. long
  796. __DtHelpDefaultFontIndexGet (
  797. DtHelpDispAreaStruct *pDAS)
  798. {
  799. return (pDAS->font_info.def_idx);
  800. }
  801. /******************************************************************************
  802. * Function: int __DtHelpFontMetrics (int font_index, int &ret_ascent,
  803. * &ret_descent);
  804. *
  805. * Parameters:
  806. *
  807. * Return Value: Returns the index for the default font set/structure.
  808. *
  809. * Purpose:
  810. *
  811. *****************************************************************************/
  812. void
  813. __DtHelpFontMetrics (
  814. DtHelpDAFontInfo font_info,
  815. long font_index,
  816. _DtCvUnit *ret_ascent,
  817. _DtCvUnit *ret_descent,
  818. _DtCvUnit *ret_char_width,
  819. _DtCvUnit *ret_super,
  820. _DtCvUnit *ret_sub)
  821. {
  822. XFontStruct **fontList;
  823. char **fontNames;
  824. int fontCount;
  825. _DtCvUnit maxAscent = -1;
  826. _DtCvUnit maxDescent = -1;
  827. _DtCvUnit maxCharW = -1;
  828. _DtCvUnit superOffset = 0;
  829. _DtCvUnit subOffset = 0;
  830. int i;
  831. if (font_index < 0)
  832. {
  833. font_index = -font_index;
  834. font_index--;
  835. if (font_index < font_info.set_cnt)
  836. {
  837. if (font_info.fs_metrics[font_index].inited == True)
  838. {
  839. maxAscent = font_info.fs_metrics[font_index].fm.ascent;
  840. maxDescent = font_info.fs_metrics[font_index].fm.descent;
  841. maxCharW = font_info.fs_metrics[font_index].fm.average_width;
  842. }
  843. else /* if (font_info.fs_metrics[font_index].inited == False) */
  844. {
  845. fontCount = XFontsOfFontSet(font_info.font_sets[font_index],
  846. &fontList, &fontNames);
  847. for (i = 0; i < fontCount; i++)
  848. {
  849. if (fontList[i]->ascent > maxAscent)
  850. maxAscent = fontList[i]->ascent;
  851. if (fontList[i]->descent > maxDescent)
  852. maxDescent = fontList[i]->descent;
  853. if (fontList[i]->max_bounds.width > maxCharW)
  854. maxCharW = fontList[i]->max_bounds.width;
  855. }
  856. font_info.fs_metrics[font_index].fm.ascent = maxAscent;
  857. font_info.fs_metrics[font_index].fm.descent = maxDescent;
  858. font_info.fs_metrics[font_index].fm.average_width = maxCharW;
  859. font_info.fs_metrics[font_index].inited = True;
  860. }
  861. }
  862. }
  863. else if (font_index < font_info.struct_cnt)
  864. {
  865. maxAscent = font_info.font_structs[font_index]->ascent;
  866. maxDescent = font_info.font_structs[font_index]->descent;
  867. maxCharW = font_info.font_structs[font_index]->max_bounds.width;
  868. }
  869. superOffset = (maxAscent * 40) / 100 + ((maxAscent % 40) > 19 ? 1 : 0);
  870. subOffset = superOffset;
  871. if (ret_ascent)
  872. *ret_ascent = maxAscent;
  873. if (ret_descent)
  874. *ret_descent = maxDescent;
  875. if (ret_char_width)
  876. *ret_char_width = maxCharW;
  877. if (ret_super)
  878. *ret_super = superOffset;
  879. if (ret_sub)
  880. *ret_sub = subOffset;
  881. }
  882. /******************************************************************************
  883. * Function: int _DtHelpGetExactFontIndex(Display dpy, char *xlfd_spec)
  884. *
  885. * Parameters:
  886. *
  887. * Return Value: 0 if successful, -1 if using default font index.
  888. *
  889. * Purpose: Try to load the specified font.
  890. *
  891. *****************************************************************************/
  892. int
  893. _DtHelpGetExactFontIndex (
  894. DtHelpDispAreaStruct *pDAS,
  895. const char *lang,
  896. const char *char_set,
  897. char *xlfd_spec,
  898. long *ret_idx)
  899. {
  900. int i = 0;
  901. int result = -1;
  902. long fontIndex = pDAS->font_info.def_idx;
  903. char **nameList;
  904. DtHelpDAFontInfo *fontInfo = &(pDAS->font_info);
  905. Display *dpy = XtDisplay(pDAS->dispWid);
  906. /*
  907. * look in my font data base to see if I've already processed
  908. * this xlfd_spec.
  909. */
  910. #ifndef REALLOC_INCR
  911. #define REALLOC_INCR 10
  912. #endif
  913. nameList = fontInfo->exact_fonts;
  914. if (NULL != nameList)
  915. {
  916. for (i = 0; NULL != *nameList && strcmp(*nameList, xlfd_spec); i++)
  917. nameList++;
  918. }
  919. if (NULL != nameList && NULL != *nameList)
  920. {
  921. fontIndex = fontInfo->exact_idx[i];
  922. result = 0;
  923. }
  924. else if (LoadFont(dpy, fontInfo, xlfd_spec, &fontIndex))
  925. {
  926. /*
  927. * make a copy of the font spec
  928. */
  929. xlfd_spec = strdup(xlfd_spec);
  930. if (NULL != xlfd_spec)
  931. {
  932. /*
  933. * now save it away for later tests.
  934. */
  935. fontInfo->exact_fonts = (char **) _DtHelpCeAddPtrToArray(
  936. (void **)fontInfo->exact_fonts,
  937. (void *) xlfd_spec);
  938. if (NULL != fontInfo->exact_fonts)
  939. {
  940. if (NULL == fontInfo->exact_idx)
  941. fontInfo->exact_idx = (int *) malloc(
  942. sizeof(int)*REALLOC_INCR);
  943. else if ((i + 1) % REALLOC_INCR == 0)
  944. fontInfo->exact_idx = (int *) realloc(fontInfo->exact_idx,
  945. sizeof(int) * (i + 1 + REALLOC_INCR));
  946. if (NULL != fontInfo->exact_idx)
  947. {
  948. char buffer[10];
  949. XrmValue retValue;
  950. XrmName xrmList[3];
  951. XrmQuark myQuark;
  952. fontInfo->exact_idx[i] = fontIndex;
  953. result = 0;
  954. /*
  955. * remember the character set for this font.
  956. */
  957. myQuark = XrmStringToQuark(char_set);
  958. sprintf (buffer, "%ld", fontIndex);
  959. retValue.size = sizeof (XrmQuark);
  960. retValue.addr = (XtPointer) &myQuark;
  961. xrmList[0] = XrmStringToQuark (buffer);
  962. xrmList[1] = XrmStringToQuark ("code_set");
  963. xrmList[2] = 0;
  964. XrmQPutResource (&(fontInfo->font_idx_db),
  965. ((XrmBindingList) FontBindings),
  966. xrmList, _DtHelpXrmQuark, &retValue);
  967. /*
  968. * remember the language for this font.
  969. */
  970. myQuark = XrmStringToQuark(lang);
  971. xrmList[1] = XrmStringToQuark ("language");
  972. XrmQPutResource (&(fontInfo->font_idx_db),
  973. ((XrmBindingList) FontBindings),
  974. xrmList, _DtHelpXrmQuark, &retValue);
  975. }
  976. }
  977. }
  978. }
  979. *ret_idx = fontIndex;
  980. return result;
  981. }