src/Pure/System/isabelle_fonts.scala
author wenzelm
Thu, 11 Jan 2024 12:37:10 +0100
changeset 79474 c39aed404ffc
parent 77570 98b4a9902582
permissions -rw-r--r--
more uniform treatment of "hyps" within zproof;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
77570
98b4a9902582 tuned headers;
wenzelm
parents: 75393
diff changeset
     1
/*  Title:      Pure/System/isabelle_fonts.scala
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     3
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     4
Fonts from the Isabelle system environment, notably the "Isabelle DejaVu"
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     5
collection.
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     6
*/
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     7
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     8
package isabelle
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     9
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    10
69368
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    11
import java.awt.{Font, GraphicsEnvironment}
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    12
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    13
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    14
object Isabelle_Fonts {
69357
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    15
  /* standard names */
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    16
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    17
  val mono: String = "Isabelle DejaVu Sans Mono"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    18
  val sans: String = "Isabelle DejaVu Sans"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    19
  val serif: String = "Isabelle DejaVu Serif"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    20
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    21
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    22
  /* environment entries */
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    23
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    24
  object Entry {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    25
    object Ordering extends scala.math.Ordering[Entry] {
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    26
      def compare(entry1: Entry, entry2: Entry): Int =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    27
        entry1.family compare entry2.family match {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    28
          case 0 => entry1.style compare entry2.style
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    29
          case ord => ord
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    30
        }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    31
    }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    32
  }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    33
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    34
  sealed case class Entry(path: Path, hidden: Boolean = false) {
69364
91dbade9a5fa proper font file name for HTTP (amending dc9a39c3f75d);
wenzelm
parents: 69363
diff changeset
    35
    lazy val bytes: Bytes = Bytes.read(path)
91dbade9a5fa proper font file name for HTTP (amending dc9a39c3f75d);
wenzelm
parents: 69363
diff changeset
    36
    lazy val font: Font = Font.createFont(Font.TRUETYPE_FONT, path.file)
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    37
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    38
    def family: String = font.getFamily
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    39
    def name: String = font.getFontName
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    40
    def style: Int =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    41
      (if (is_bold) Font.BOLD else 0) +
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    42
      (if (is_italic) Font.ITALIC else 0)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    43
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    44
    // educated guess for style: Font.createFont always produces Font.PLAIN
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    45
    private lazy val name_lowercase = Word.lowercase(name)
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    46
    def is_bold: Boolean =
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    47
      name_lowercase.containsSlice("bold")
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    48
    def is_italic: Boolean =
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    49
      name_lowercase.containsSlice("italic") ||
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    50
      name_lowercase.containsSlice("oblique")
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    51
  }
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    52
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    53
  def make_entries(
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    54
    getenv: String => String = Isabelle_System.getenv_strict(_),
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    55
    hidden: Boolean = false
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    56
  ): List[Entry] = {
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    57
    Path.split(getenv("ISABELLE_FONTS")).map(Entry(_)) :::
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    58
    (if (hidden) Path.split(getenv("ISABELLE_FONTS_HIDDEN")).map(Entry(_, hidden = true)) else Nil)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    59
  }
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    60
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    61
  private lazy val all_fonts: List[Entry] =
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    62
    make_entries(hidden = true).sorted(Entry.Ordering)
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    63
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    64
  def fonts(hidden: Boolean = false): List[Entry] =
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    65
    if (hidden) all_fonts else all_fonts.filter(entry => !entry.hidden)
69368
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    66
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    67
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    68
  /* system init */
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    69
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73340
diff changeset
    70
  def init(): Unit = {
69368
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    71
    val ge = GraphicsEnvironment.getLocalGraphicsEnvironment()
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    72
    for (entry <- fonts()) ge.registerFont(entry.font)
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    73
  }
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    74
}