font.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /* Copyright 2001-2003 by Norbert Freudemann, David Frese */
  2. #include "xlib.h"
  3. s48_ref_t scx_Load_Font(s48_call_t call, s48_ref_t display, s48_ref_t font_name) {
  4. Font f;
  5. f = XLoadFont(scx_extract_display(call, display),
  6. s48_extract_string(call, font_name));
  7. return scx_enter_font(call, f);
  8. }
  9. s48_ref_t scx_Unload_Font(s48_call_t call, s48_ref_t display, s48_ref_t font)
  10. {
  11. XUnloadFont(scx_extract_display(call, display),
  12. scx_extract_font(call, font));
  13. return s48_unspecific_2(call);
  14. }
  15. s48_ref_t scx_Query_Font(s48_call_t call, s48_ref_t display, s48_ref_t font)
  16. {
  17. XFontStruct* fs;
  18. fs = XQueryFont(scx_extract_display(call, display),
  19. scx_extract_font(call, font));
  20. if (fs == NULL)
  21. return s48_false_2(call);
  22. else
  23. return scx_enter_fontstruct(call, fs);
  24. }
  25. s48_ref_t scx_Load_Query_Font(s48_call_t call, s48_ref_t display,
  26. s48_ref_t font_name) {
  27. XFontStruct* fs;
  28. fs = XLoadQueryFont(scx_extract_display(call, display),
  29. s48_extract_string(call, font_name));
  30. if (fs == NULL) {
  31. return s48_false_2(call);
  32. }
  33. else {
  34. return scx_enter_fontstruct(call, fs);
  35. }
  36. }
  37. s48_ref_t scx_Free_Font(s48_call_t call, s48_ref_t display,
  38. s48_ref_t fontstruct) {
  39. XFreeFont(scx_extract_display(call, display),
  40. scx_extract_fontstruct(call, fontstruct));
  41. return s48_unspecific_2(call);
  42. }
  43. s48_ref_t scx_List_Fonts(s48_call_t call, s48_ref_t display,
  44. s48_ref_t pattern, s48_ref_t max) {
  45. s48_ref_t res = s48_null_2(call);
  46. int i, count;
  47. char** fonts;
  48. fonts = XListFonts(scx_extract_display(call, display),
  49. s48_extract_string(call, pattern),
  50. s48_extract_long_2(call, max), &count);
  51. for (i = count; i > 0; i--)
  52. res = s48_cons_2(call, s48_enter_string(call, fonts[i-1]), res);
  53. XFreeFontNames(fonts);
  54. return res;
  55. }
  56. s48_ref_t scx_List_Fonts_With_Info(s48_call_t call, s48_ref_t display,
  57. s48_ref_t pattern, s48_ref_t max) {
  58. s48_ref_t res = s48_null_2(call), cell = s48_null_2(call);
  59. int i, count;
  60. char** fonts;
  61. XFontStruct* infos;
  62. fonts = XListFontsWithInfo(scx_extract_display(call, display),
  63. s48_extract_string(call, pattern),
  64. s48_extract_long_2(call, max), &count,
  65. &infos);
  66. for (i = count; i > 0; i--) {
  67. cell = scx_enter_fontstruct(call, &infos[i-1]);
  68. cell = s48_cons_2(call, s48_enter_string(call, fonts[i-1]), cell);
  69. res = s48_cons_2(call, cell, res);
  70. }
  71. XFreeFontNames(fonts); /* FontStructs have to be freed later */
  72. return res;
  73. }
  74. s48_ref_t scx_Set_Font_Path(s48_call_t call, s48_ref_t display, s48_ref_t dirs) {
  75. int i, n = s48_extract_long_2(call, s48_length_2(call, dirs));
  76. char* sa[n];
  77. s48_ref_t l = dirs;
  78. for (i = 0; i < n; i++) {
  79. s48_ref_t temp = l;
  80. sa[i] = s48_extract_string(call, s48_car_2(call, l));
  81. l = s48_cdr_2(call, l);
  82. s48_free_local_ref(call, temp);
  83. }
  84. XSetFontPath(scx_extract_display(call, display), sa, n);
  85. return s48_unspecific_2(call);
  86. }
  87. s48_ref_t scx_Get_Font_Path(s48_call_t call, s48_ref_t display) {
  88. int n, i;
  89. char** sa;
  90. s48_ref_t res = s48_null_2(call);
  91. sa = XGetFontPath(scx_extract_display(call, display), &n);
  92. for (i = n; i > 0; i--)
  93. res = s48_cons_2(call, s48_enter_string(call, sa[i]), res);
  94. XFreeFontPath(sa);
  95. return res;
  96. }
  97. /* TODO:
  98. s48_ref_t scx_Font_Properties(s48_call_t call, s48_ref_t Xfontstruct) {
  99. s48_ref_t v, t = S48_FALSE;
  100. int i,n;
  101. XFontStruct* fs = scx_extract_fontstruct(Xfontstruct);
  102. XFontProp* p;
  103. S48_DECLARE_GC_PROTECT(2);
  104. n = fs->n_properties;
  105. v = s48_make_vector(n, S48_FALSE);
  106. S48_GC_PROTECT_2(v, t);
  107. for (i = 0; i < n; i++) {
  108. p = fs->properties+i;
  109. t = scx_enter_atom(p->name);
  110. t = s48_cons(t, s48_enter_integer(p->card32));
  111. S48_VECTOR_SET(v, i, t);
  112. }
  113. S48_GC_UNPROTECT();
  114. return v;
  115. }
  116. s48_ref_t scx_Font_Property(s48_call_t call, s48_ref_t Xfontstruct, s48_ref_t Xatom) {
  117. unsigned long val;
  118. if (XGetFontProperty(scx_extract_fontstruct(Xfontstruct),
  119. scx_extract_atom(Xatom),
  120. &val))
  121. return s48_enter_integer(val);
  122. else
  123. return S48_FALSE;
  124. }
  125. s48_ref_t scx_Font_Info(s48_call_t call, s48_ref_t Xfontstruct) {
  126. XFontStruct* fs = scx_extract_fontstruct(Xfontstruct);
  127. s48_ref_t v = s48_make_vector(9, S48_FALSE);
  128. S48_DECLARE_GC_PROTECT(1);
  129. S48_GC_PROTECT_1(v);
  130. S48_VECTOR_SET(v, 0, s48_enter_fixnum(fs->direction));
  131. S48_VECTOR_SET(v, 1, s48_enter_fixnum(fs->min_char_or_byte2));
  132. S48_VECTOR_SET(v, 2, s48_enter_fixnum(fs->max_char_or_byte2));
  133. S48_VECTOR_SET(v, 3, s48_enter_fixnum(fs->min_byte1));
  134. S48_VECTOR_SET(v, 4, s48_enter_fixnum(fs->max_byte1));
  135. S48_VECTOR_SET(v, 5, S48_ENTER_BOOLEAN(fs->all_chars_exist));
  136. S48_VECTOR_SET(v, 6, s48_enter_fixnum(fs->default_char));
  137. S48_VECTOR_SET(v, 7, s48_enter_fixnum(fs->ascent));
  138. S48_VECTOR_SET(v, 8, s48_enter_fixnum(fs->descent));
  139. S48_GC_UNPROTECT();
  140. return v;
  141. }
  142. s48_ref_t scx_Char_Info(s48_call_t call, s48_ref_t Xfontstruct, s48_ref_t index) {
  143. // index must be an integer, #f for 'min or #t for 'max
  144. XCharStruct* cp;
  145. XFontStruct* p = scx_extract_fontstruct(Xfontstruct);
  146. s48_ref_t v = S48_FALSE;
  147. S48_DECLARE_GC_PROTECT(1);
  148. if (S48_FALSE_P(index))
  149. cp = &p->min_bounds;
  150. else if (S48_TRUE_P(index))
  151. cp = &p->max_bounds;
  152. else
  153. cp = &(p->per_char[s48_extract_integer(index)]); // calculated in scheme
  154. v = s48_make_vector(6, S48_FALSE);
  155. S48_GC_PROTECT_1(v);
  156. S48_VECTOR_SET(v, 0, s48_enter_fixnum(cp->lbearing));
  157. S48_VECTOR_SET(v, 1, s48_enter_fixnum(cp->rbearing));
  158. S48_VECTOR_SET(v, 2, s48_enter_fixnum(cp->width));
  159. S48_VECTOR_SET(v, 3, s48_enter_fixnum(cp->ascent));
  160. S48_VECTOR_SET(v, 4, s48_enter_fixnum(cp->descent));
  161. S48_VECTOR_SET(v, 5, s48_enter_fixnum(cp->attributes));
  162. S48_GC_UNPROTECT();
  163. return v;
  164. }
  165. */
  166. void scx_init_font(void) {
  167. S48_EXPORT_FUNCTION(scx_Load_Font);
  168. S48_EXPORT_FUNCTION(scx_Unload_Font);
  169. S48_EXPORT_FUNCTION(scx_Query_Font);
  170. S48_EXPORT_FUNCTION(scx_Load_Query_Font);
  171. S48_EXPORT_FUNCTION(scx_Free_Font);
  172. S48_EXPORT_FUNCTION(scx_List_Fonts);
  173. S48_EXPORT_FUNCTION(scx_List_Fonts_With_Info);
  174. S48_EXPORT_FUNCTION(scx_Set_Font_Path);
  175. S48_EXPORT_FUNCTION(scx_Get_Font_Path);
  176. }