Added small icons to default theme
This commit is contained in:
parent
ae6cf128f8
commit
1e8bb56b7c
Binary file not shown.
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.8 KiB |
@ -16,6 +16,9 @@ import "git.tebibyte.media/sashakoshka/tomo/artist/patterns"
|
|||||||
var defaultAtlasBytes []byte
|
var defaultAtlasBytes []byte
|
||||||
var defaultAtlas canvas.Canvas
|
var defaultAtlas canvas.Canvas
|
||||||
var defaultTextures [14][9]artist.Pattern
|
var defaultTextures [14][9]artist.Pattern
|
||||||
|
//go:embed assets/wintergreen-icons-small.png
|
||||||
|
var defaultIconsSmallAtlasBytes []byte
|
||||||
|
var defaultIconsSmall [640]binaryIcon
|
||||||
|
|
||||||
func atlasCell (col, row int, border artist.Inset) {
|
func atlasCell (col, row int, border artist.Inset) {
|
||||||
bounds := image.Rect(0, 0, 16, 16).Add(image.Pt(col, row).Mul(16))
|
bounds := image.Rect(0, 0, 16, 16).Add(image.Pt(col, row).Mul(16))
|
||||||
@ -31,6 +34,51 @@ func atlasCol (col int, border artist.Inset) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type binaryIcon struct {
|
||||||
|
data []bool
|
||||||
|
stride int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (icon binaryIcon) Draw (destination canvas.Canvas, color color.RGBA, at image.Point) {
|
||||||
|
bounds := icon.Bounds().Add(at).Intersect(destination.Bounds())
|
||||||
|
point := image.Point { }
|
||||||
|
data, stride := destination.Buffer()
|
||||||
|
|
||||||
|
for point.Y = bounds.Min.Y; point.Y < bounds.Max.Y; point.Y ++ {
|
||||||
|
for point.X = bounds.Min.X; point.X < bounds.Max.X; point.X ++ {
|
||||||
|
srcPoint := point.Sub(at)
|
||||||
|
srcIndex := srcPoint.X + srcPoint.Y * icon.stride
|
||||||
|
dstIndex := point.X + point.Y * stride
|
||||||
|
if icon.data[srcIndex] {
|
||||||
|
data[dstIndex] = color
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (icon binaryIcon) Bounds () image.Rectangle {
|
||||||
|
return image.Rect(0, 0, icon.stride, len(icon.data) / icon.stride)
|
||||||
|
}
|
||||||
|
|
||||||
|
func binaryIconFrom (source image.Image, clip image.Rectangle) (icon binaryIcon) {
|
||||||
|
bounds := source.Bounds().Intersect(clip)
|
||||||
|
if bounds.Empty() { return }
|
||||||
|
|
||||||
|
icon.stride = bounds.Dx()
|
||||||
|
icon.data = make([]bool, bounds.Dx() * bounds.Dy())
|
||||||
|
|
||||||
|
point := image.Point { }
|
||||||
|
dstIndex := 0
|
||||||
|
for point.Y = bounds.Min.Y; point.Y < bounds.Max.Y; point.Y ++ {
|
||||||
|
for point.X = bounds.Min.X; point.X < bounds.Max.X; point.X ++ {
|
||||||
|
r, g, b, a := source.At(point.X, point.Y).RGBA()
|
||||||
|
if a > 0x8000 && (r + g + b) / 3 < 0x8000 {
|
||||||
|
icon.data[dstIndex] = true
|
||||||
|
}
|
||||||
|
dstIndex ++
|
||||||
|
}}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func init () {
|
func init () {
|
||||||
defaultAtlasImage, _, _ := image.Decode(bytes.NewReader(defaultAtlasBytes))
|
defaultAtlasImage, _, _ := image.Decode(bytes.NewReader(defaultAtlasBytes))
|
||||||
defaultAtlas = canvas.FromImage(defaultAtlasImage)
|
defaultAtlas = canvas.FromImage(defaultAtlasImage)
|
||||||
@ -64,6 +112,20 @@ func init () {
|
|||||||
atlasCol(11, artist.Inset { 3, 3, 5, 3 })
|
atlasCol(11, artist.Inset { 3, 3, 5, 3 })
|
||||||
// PatternRaised: fun.sharpKey
|
// PatternRaised: fun.sharpKey
|
||||||
atlasCol(12, artist.Inset { 3, 3, 4, 3 })
|
atlasCol(12, artist.Inset { 3, 3, 4, 3 })
|
||||||
|
|
||||||
|
// set up small icons
|
||||||
|
defaultIconsSmallAtlasImage, _, _ := image.Decode (
|
||||||
|
bytes.NewReader(defaultIconsSmallAtlasBytes))
|
||||||
|
bounds := defaultIconsSmallAtlasImage.Bounds()
|
||||||
|
point := image.Point { }
|
||||||
|
iconIndex := 0
|
||||||
|
for point.Y = bounds.Min.Y; point.Y < bounds.Max.Y; point.Y += 16 {
|
||||||
|
for point.X = bounds.Min.X; point.X < bounds.Max.X; point.X += 16 {
|
||||||
|
defaultIconsSmall[iconIndex] = binaryIconFrom (
|
||||||
|
defaultIconsSmallAtlasImage,
|
||||||
|
image.Rect(0, 0, 16, 16).Add(point))
|
||||||
|
iconIndex ++
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default is the default theme.
|
// Default is the default theme.
|
||||||
@ -84,9 +146,17 @@ func (Default) FontFace (style FontStyle, size FontSize, c Case) font.Face {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Icon returns an icon from the default set corresponding to the given name.
|
// Icon returns an icon from the default set corresponding to the given name.
|
||||||
func (Default) Icon (string, IconSize, Case) artist.Icon {
|
func (Default) Icon (id Icon, size IconSize, c Case) artist.Icon {
|
||||||
|
if size == IconSizeLarge {
|
||||||
// TODO
|
// TODO
|
||||||
return nil
|
return nil
|
||||||
|
} else {
|
||||||
|
if id < 0 || int(id) >= len(defaultIconsSmall) {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return defaultIconsSmall[id]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MimeIcon returns an icon from the default set corresponding to the given mime.
|
// MimeIcon returns an icon from the default set corresponding to the given mime.
|
||||||
|
@ -78,10 +78,11 @@ type Icon int; const (
|
|||||||
IconLibraries
|
IconLibraries
|
||||||
IconDownloads
|
IconDownloads
|
||||||
IconRepositories
|
IconRepositories
|
||||||
IconSettings
|
IconSettings)
|
||||||
|
|
||||||
|
const (
|
||||||
// Object icons
|
// Object icons
|
||||||
IconFile = iota + 0x80
|
IconFile Icon = iota + 0x80
|
||||||
IconDirectory
|
IconDirectory
|
||||||
IconPopulatedDirectory
|
IconPopulatedDirectory
|
||||||
|
|
||||||
@ -127,8 +128,9 @@ type Icon int; const (
|
|||||||
IconParallelPort
|
IconParallelPort
|
||||||
IconSerialPort
|
IconSerialPort
|
||||||
IconPS2Port
|
IconPS2Port
|
||||||
IconMonitorPort
|
IconMonitorPort)
|
||||||
|
|
||||||
|
const (
|
||||||
// Action icons
|
// Action icons
|
||||||
IconOpen = iota + 0x100
|
IconOpen = iota + 0x100
|
||||||
IconSave
|
IconSave
|
||||||
@ -166,17 +168,18 @@ type Icon int; const (
|
|||||||
IconHistory
|
IconHistory
|
||||||
|
|
||||||
IconYes
|
IconYes
|
||||||
IconNo
|
IconNo)
|
||||||
|
|
||||||
|
const (
|
||||||
// Status icons
|
// Status icons
|
||||||
IconInformation = iota + 0x180
|
IconInformation = iota + 0x180
|
||||||
IconQuestion
|
IconQuestion
|
||||||
IconWarning
|
IconWarning
|
||||||
IconError
|
IconError)
|
||||||
|
|
||||||
|
const (
|
||||||
// Tool icons
|
// Tool icons
|
||||||
|
)
|
||||||
)
|
|
||||||
|
|
||||||
// Hints specifies rendering hints for a particular pattern. Elements can take
|
// Hints specifies rendering hints for a particular pattern. Elements can take
|
||||||
// these into account in order to gain extra performance.
|
// these into account in order to gain extra performance.
|
||||||
@ -197,7 +200,7 @@ type Theme interface {
|
|||||||
FontFace (FontStyle, FontSize, Case) font.Face
|
FontFace (FontStyle, FontSize, Case) font.Face
|
||||||
|
|
||||||
// Icon returns an appropriate icon given an icon name, size, and case.
|
// Icon returns an appropriate icon given an icon name, size, and case.
|
||||||
Icon (string, IconSize, Case) artist.Icon
|
Icon (Icon, IconSize, Case) artist.Icon
|
||||||
|
|
||||||
// Icon returns an appropriate icon given a file mime type, size, and,
|
// Icon returns an appropriate icon given a file mime type, size, and,
|
||||||
// case.
|
// case.
|
||||||
|
@ -21,9 +21,9 @@ func (wrapped Wrapped) FontFace (style FontStyle, size FontSize) font.Face {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Icon returns an appropriate icon given an icon name.
|
// Icon returns an appropriate icon given an icon name.
|
||||||
func (wrapped Wrapped) Icon (name string, size IconSize) artist.Icon {
|
func (wrapped Wrapped) Icon (id Icon, size IconSize) artist.Icon {
|
||||||
real := wrapped.ensure()
|
real := wrapped.ensure()
|
||||||
return real.Icon(name, size, wrapped.Case)
|
return real.Icon(id, size, wrapped.Case)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MimeIcon returns an appropriate icon given file mime type.
|
// MimeIcon returns an appropriate icon given file mime type.
|
||||||
|
Reference in New Issue
Block a user