From 512900c9b144fe35e7646bba15f482d390b94069 Mon Sep 17 00:00:00 2001 From: Chris Waldon Date: Thu, 17 Mar 2022 10:02:43 -0400 Subject: [PATCH] system: define new Locale type This commit adds a Locale struct that captures language and layout flow direction for the system. This information can be leveraged by text shaping and layout code to make better choices. References: https://todo.sr.ht/~eliasnaur/gio/146 Signed-off-by: Chris Waldon --- io/system/locale.go | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 io/system/locale.go diff --git a/io/system/locale.go b/io/system/locale.go new file mode 100644 index 00000000..7bc75817 --- /dev/null +++ b/io/system/locale.go @@ -0,0 +1,59 @@ +package system + +// Locale provides language information for the current system. +type Locale struct { + // Language is the BCP-47 tag for the primary language of the system. + Language string + // Direction indicates the primary direction of text and layout + // flow for the system. + Direction TextDirection +} + +const ( + axisShift = iota + progressionShift +) + +// TextDirection defines a direction for text flow. +type TextDirection byte + +const ( + // LTR is left-to-right text. + LTR TextDirection = TextDirection(Horizontal<> axisShift) +} + +// Progression returns the way that the text flows relative to the origin. +func (d TextDirection) Progression() TextProgression { + return TextProgression((d & (1 << progressionShift)) >> progressionShift) +} + +// TextAxis defines the layout axis of text. +type TextAxis byte + +const ( + // Horizontal indicates text that flows along the X axis. + Horizontal TextAxis = iota + // Vertical indicates text that flows along the Y axis. + Vertical +) + +// TextProgression indicates how text flows along an axis relative to the +// origin. For these purposes, the origin is defined as the upper-left +// corner of coordinate space. +type TextProgression byte + +const ( + // FromOrigin indicates text that flows along its axis away from the + // origin (upper left corner). + FromOrigin TextProgression = iota + // TowardOrigin indicates text that flows along its axis towards the + // origin (upper left corner). + TowardOrigin +)