/collects/racket/draw/private/font-dir.rkt

http://github.com/gmarceau/PLT · Racket · 115 lines · 95 code · 20 blank · 0 comment · 24 complexity · a970407f1573d3b89e5442d29a49fe94 MD5 · raw file

  1. #lang racket/base
  2. (require racket/class
  3. "syntax.rkt"
  4. "font-syms.rkt")
  5. (provide font-name-directory<%>
  6. the-font-name-directory
  7. get-family-builtin-face)
  8. (define font-name-directory%
  9. (class object%
  10. (define table (make-hash))
  11. (define reverse-table (make-hash))
  12. (define ps-table (make-hash))
  13. (define screen-table (make-hash))
  14. (define/private (intern val)
  15. (hash-ref table val (lambda ()
  16. (let ([n (add1 (hash-count table))])
  17. (hash-set! table val n)
  18. (hash-set! reverse-table n val)
  19. n))))
  20. (for-each (lambda (s) (intern s))
  21. '(default decorative roman script
  22. swiss modern symbol system))
  23. (def/public (find-family-default-font-id [family-symbol? family])
  24. (intern family))
  25. (def/public (find-or-create-font-id [string? name]
  26. [family-symbol? family])
  27. (intern (cons name family)))
  28. (def/public (get-face-name [exact-integer? id])
  29. (let ([v (hash-ref reverse-table id #f)])
  30. (and v (pair? v) (car v))))
  31. (def/public (get-family [exact-integer? id])
  32. (let ([v (hash-ref reverse-table id #f)])
  33. (or (and (pair? v) (cdr v))
  34. (and (symbol? v) v)
  35. 'default)))
  36. (def/public (get-font-id [string? name]
  37. [family-symbol? family])
  38. (hash-ref table (cons string family) 0))
  39. (define/private (default-font s)
  40. (case s
  41. [(modern) (case (system-type)
  42. [(windows macosx) "Courier New"]
  43. [else "Monospace"])]
  44. [(roman) (case (system-type)
  45. [(windows) "Times New Roman"]
  46. [(macosx) "Times"]
  47. [else "Serif"])]
  48. [(decorative swiss) (case (system-type)
  49. [(windows) "Arial"]
  50. [else "Helvetica"])]
  51. [(script) (case (system-type)
  52. [(macosx) "Apple Chancery"]
  53. [else "Chancery"])]
  54. [(symbol) "Symbol"]
  55. [else (case (system-type)
  56. [(windows) "Tahoma"]
  57. [(macosx) "Lucida Grande"]
  58. [else "Sans"])]))
  59. (def/public (get-post-script-name [exact-integer? id]
  60. [weight-symbol? w]
  61. [style-symbol? s])
  62. (let ([s (or (hash-ref ps-table (list id w s) #f)
  63. (hash-ref reverse-table id #f))])
  64. (cond
  65. [(pair? s) (car s)]
  66. [(symbol? s) (default-font s)]
  67. [else "Serif"])))
  68. (def/public (get-screen-name [exact-integer? id]
  69. [weight-symbol? w]
  70. [style-symbol? s])
  71. (let ([s (or (hash-ref screen-table (list id w s) #f)
  72. (hash-ref reverse-table id #f))])
  73. (cond
  74. [(pair? s) (car s)]
  75. [(symbol? s) (default-font s)]
  76. [else "Serif"])))
  77. (def/public (set-post-script-name [exact-integer? id]
  78. [weight-symbol? w]
  79. [style-symbol? s]
  80. [string? name])
  81. (hash-set! ps-table (list id w s) name))
  82. (def/public (set-screen-name [exact-integer? id]
  83. [weight-symbol? w]
  84. [style-symbol? s]
  85. [string? name])
  86. (hash-set! screen-table (list id w s) name))
  87. (super-new)))
  88. (define font-name-directory<%>
  89. (class->interface font-name-directory%))
  90. (define the-font-name-directory (new font-name-directory%))
  91. (define (get-family-builtin-face family)
  92. (unless (memq family '(default decorative roman script swiss modern system symbol))
  93. (raise-type-error 'get-family-builtin-face "family symbol" family))
  94. (let ([id (send the-font-name-directory find-family-default-font-id family)])
  95. (send the-font-name-directory get-screen-name id 'normal 'normal)))