2024-07-28 23:50:51 -06:00
|
|
|
package tss
|
|
|
|
|
|
|
|
import "os"
|
|
|
|
import "git.tebibyte.media/tomo/tomo/event"
|
2024-08-10 20:20:34 -06:00
|
|
|
import "git.tebibyte.media/tomo/backend/style"
|
2024-07-28 23:50:51 -06:00
|
|
|
|
2024-07-29 13:13:02 -06:00
|
|
|
type Sheet struct {
|
2024-08-12 17:13:25 -06:00
|
|
|
Path string
|
2024-07-29 13:13:02 -06:00
|
|
|
Variables map[string] ValueList
|
|
|
|
Rules []Rule
|
|
|
|
flat bool
|
2024-07-28 23:50:51 -06:00
|
|
|
}
|
|
|
|
|
2024-07-29 13:13:02 -06:00
|
|
|
type Rule struct {
|
|
|
|
Selector Selector
|
|
|
|
Attrs map[string] []ValueList
|
|
|
|
}
|
|
|
|
|
|
|
|
type Selector struct {
|
|
|
|
Package string
|
|
|
|
Object string
|
|
|
|
Tags []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type ValueList []Value
|
|
|
|
|
|
|
|
type Value interface {
|
|
|
|
value ()
|
|
|
|
}
|
|
|
|
|
|
|
|
type ValueNumber int
|
|
|
|
func (ValueNumber) value () { }
|
|
|
|
|
|
|
|
type ValueColor uint32
|
|
|
|
func (ValueColor) value () { }
|
|
|
|
func (value ValueColor) RGBA () (r, g, b, a uint32) {
|
|
|
|
// extract components
|
|
|
|
bits := uint32(value)
|
2024-07-29 13:45:17 -06:00
|
|
|
r = (bits & 0xFF000000) >> 24
|
|
|
|
g = (bits & 0x00FF0000) >> 16
|
|
|
|
b = (bits & 0x0000FF00) >> 8
|
|
|
|
a = (bits & 0x000000FF)
|
2024-07-29 13:13:02 -06:00
|
|
|
// extend to 16 bits per channel
|
|
|
|
r = r << 8 | r
|
|
|
|
g = g << 8 | g
|
|
|
|
b = b << 8 | b
|
|
|
|
a = a << 8 | a
|
|
|
|
// alpha premultiply
|
2024-07-29 13:45:17 -06:00
|
|
|
r = (r * a) / 0xFFFF
|
|
|
|
g = (g * a) / 0xFFFF
|
|
|
|
b = (b * a) / 0xFFFF
|
2024-07-29 13:13:02 -06:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
type ValueString string
|
|
|
|
func (ValueString) value () { }
|
|
|
|
|
|
|
|
type ValueKeyword string
|
|
|
|
func (ValueKeyword) value () { }
|
|
|
|
|
|
|
|
type ValueVariable string
|
|
|
|
func (ValueVariable) value () { }
|
|
|
|
|
|
|
|
type ValueCut struct { }
|
|
|
|
func (ValueCut) value () { }
|
|
|
|
|
|
|
|
// LoadFile loads the stylesheet from the specified file. This may return a
|
|
|
|
// parse.Error, so use parse.Format to print it.
|
2024-08-10 20:20:34 -06:00
|
|
|
func LoadFile (name string) (*style.Style, event.Cookie, error) {
|
2024-07-28 23:50:51 -06:00
|
|
|
// TODO check cache for gobbed sheet. if the cache is nonexistent or
|
|
|
|
// invalid, then open/load/cache.
|
2024-07-29 13:13:02 -06:00
|
|
|
|
2024-07-28 23:50:51 -06:00
|
|
|
file, err := os.Open(name)
|
|
|
|
if err != nil { return nil, nil, err }
|
|
|
|
defer file.Close()
|
2024-07-29 13:13:02 -06:00
|
|
|
|
|
|
|
sheet, err := Parse(Lex(name, file))
|
|
|
|
if err != nil { return nil, nil, err }
|
2024-08-12 17:13:25 -06:00
|
|
|
sheet.Path = name
|
2024-07-29 13:13:02 -06:00
|
|
|
return BuildStyle(sheet)
|
2024-07-28 23:50:51 -06:00
|
|
|
}
|