You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.2 KiB
Go

1 year ago
package xlsx
import (
"fmt"
"strconv"
)
type theme struct {
colors []string
}
func newTheme(themeXml xlsxTheme) *theme {
clrMap := map[string]string{}
clrSchemes := themeXml.ThemeElements.ClrScheme.Children
for _, scheme := range clrSchemes {
var rgbColor string
if scheme.SysClr != nil {
rgbColor = scheme.SysClr.LastClr
} else {
rgbColor = scheme.SrgbClr.Val
}
clrMap[scheme.XMLName.Local] = rgbColor
}
colors := []string{clrMap["lt1"], clrMap["dk1"], clrMap["lt2"], clrMap["dk2"], clrMap["accent1"],
clrMap["accent2"], clrMap["accent3"], clrMap["accent4"], clrMap["accent5"],
clrMap["accent6"], clrMap["hlink"], clrMap["folHlink"]}
return &theme{colors}
}
func (t *theme) themeColor(index int64, tint float64) string {
baseColor := t.colors[index]
if tint == 0 {
return "FF" + baseColor
} else {
r, _ := strconv.ParseInt(baseColor[0:2], 16, 64)
g, _ := strconv.ParseInt(baseColor[2:4], 16, 64)
b, _ := strconv.ParseInt(baseColor[4:6], 16, 64)
h, s, l := RGBToHSL(uint8(r), uint8(g), uint8(b))
if tint < 0 {
l *= (1 + tint)
} else {
l = l*(1-tint) + (1 - (1 - tint))
}
br, bg, bb := HSLToRGB(h, s, l)
return fmt.Sprintf("FF%02X%02X%02X", br, bg, bb)
}
}