src/Pure/System/isabelle_fonts.scala
author wenzelm
Mon, 05 Oct 2020 22:07:25 +0200
changeset 72376 04bce3478688
parent 69374 ab66951166f3
child 73340 0ffcad1f6130
permissions -rw-r--r--
clarified signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/isabelle_system.scala
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
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    14
object Isabelle_Fonts
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    15
{
69357
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    16
  /* standard names */
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    17
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    18
  val mono: String = "Isabelle DejaVu Sans Mono"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    19
  val sans: String = "Isabelle DejaVu Sans"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    20
  val serif: String = "Isabelle DejaVu Serif"
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    21
acd0d72c560b clarified signature;
wenzelm
parents: 69355
diff changeset
    22
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    23
  /* environment entries */
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    24
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    25
  object Entry
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    26
  {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    27
    object Ordering extends scala.math.Ordering[Entry]
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    28
    {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    29
      def compare(entry1: Entry, entry2: Entry): Int =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    30
        entry1.family compare entry2.family match {
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    31
          case 0 => entry1.style compare entry2.style
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    32
          case ord => ord
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    33
        }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    34
    }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    35
  }
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    36
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    37
  sealed case class Entry(path: Path, hidden: Boolean = false)
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    38
  {
69364
91dbade9a5fa proper font file name for HTTP (amending dc9a39c3f75d);
wenzelm
parents: 69363
diff changeset
    39
    lazy val bytes: Bytes = Bytes.read(path)
91dbade9a5fa proper font file name for HTTP (amending dc9a39c3f75d);
wenzelm
parents: 69363
diff changeset
    40
    lazy val font: Font = Font.createFont(Font.TRUETYPE_FONT, path.file)
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    41
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    42
    def family: String = font.getFamily
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    43
    def name: String = font.getFontName
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    44
    def style: Int =
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    45
      (if (is_bold) Font.BOLD else 0) +
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    46
      (if (is_italic) Font.ITALIC else 0)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    47
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    48
    // educated guess for style: Font.createFont always produces Font.PLAIN
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    49
    private lazy val name_lowercase = Word.lowercase(name)
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    50
    def is_bold: Boolean =
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    51
      name_lowercase.containsSlice("bold")
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    52
    def is_italic: Boolean =
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    53
      name_lowercase.containsSlice("italic") ||
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    54
      name_lowercase.containsSlice("oblique")
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    55
  }
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    56
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    57
  def make_entries(
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    58
    getenv: String => String = Isabelle_System.getenv_strict(_),
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    59
    hidden: Boolean = false): List[Entry] =
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    60
  {
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    61
    Path.split(getenv("ISABELLE_FONTS")).map(Entry(_)) :::
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    62
    (if (hidden) Path.split(getenv("ISABELLE_FONTS_HIDDEN")).map(Entry(_, hidden = true)) else Nil)
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    63
  }
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    64
69363
0675481ce575 clarified order;
wenzelm
parents: 69360
diff changeset
    65
  private lazy val all_fonts: List[Entry] =
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    66
    make_entries(hidden = true).sorted(Entry.Ordering)
69360
dc9a39c3f75d more explicit Isabelle_Fonts.Entry;
wenzelm
parents: 69357
diff changeset
    67
69374
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    68
  def fonts(hidden: Boolean = false): List[Entry] =
ab66951166f3 clarified "hidden" terminology;
wenzelm
parents: 69368
diff changeset
    69
    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
    70
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    71
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    72
  /* system init */
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    73
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    74
  def init()
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    75
  {
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    76
    val ge = GraphicsEnvironment.getLocalGraphicsEnvironment()
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    77
    for (entry <- fonts()) ge.registerFont(entry.font)
6f360600eabc clarified signature: fonts are not dependent on GUI;
wenzelm
parents: 69364
diff changeset
    78
  }
69355
cdc2de88d657 clarified modules;
wenzelm
parents:
diff changeset
    79
}