diff --git a/documentTypes.plist b/documentTypes.plist index 1794a21..87de39d 100644 --- a/documentTypes.plist +++ b/documentTypes.plist @@ -170,4 +170,31 @@ LSTypeIsPackage + + CFBundleTypeExtensions + + webp + WEBP + + CFBundleTypeIconFile + webp.icns + CFBundleTypeMIMETypes + + image/webp + + CFBundleTypeName + WebP Image + CFBundleTypeOSTypes + + WEBP + + CFBundleTypeRole + Viewer + LSItemContentTypes + + org.webmproject.webp + + LSTypeIsPackage + + \ No newline at end of file diff --git a/filetypes/filetypes.go b/filetypes/filetypes.go index 9bbf12f..58cd5eb 100644 --- a/filetypes/filetypes.go +++ b/filetypes/filetypes.go @@ -71,6 +71,15 @@ var Valid = []FileDescription{ OSTypes: []string{"TIFF"}, ItemContentTypes: "public.tiff", }, + { + TkTypeName: "WEBP", + MacExtensions: []string{"webp", "WEBP"}, + IconFile: "webp.icns", + MIMETypes: []string{"image/webp"}, + TypeName: "WebP Image", + OSTypes: []string{"WEBP"}, + ItemContentTypes: "org.webmproject.webp", + }, } func GetTkTypes(fds []FileDescription) []tk.FileType { @@ -86,7 +95,3 @@ func GetTkTypes(fds []FileDescription) []tk.FileType { } return fts } - -func main() { - fmt.Println("test") -} diff --git a/go.mod b/go.mod index d058756..832d493 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.24.2 require ( github.com/disintegration/imaging v1.6.2 + golang.org/x/image v0.27.0 modernc.org/tk9.0 v0.70.2-0.20250508084556-20db091eb764 ) @@ -11,6 +12,7 @@ require ( git.yetaga.in/alazyreader/appify v0.0.0-20250503185351-c56d5058ecd7 // indirect github.com/JackMordaunt/icns v1.0.0 // indirect github.com/adrg/xdg v0.5.3 // indirect + github.com/dblezek/tga v0.0.0-20150626111426-80720cbc1017 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.8.2 // indirect github.com/evilsocket/islazy v1.11.0 // indirect @@ -22,7 +24,6 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/image v0.26.0 // indirect golang.org/x/net v0.39.0 // indirect golang.org/x/sys v0.32.0 // indirect modernc.org/fileutil v1.3.1 // indirect diff --git a/go.sum b/go.sum index da9ad6b..45e9693 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dblezek/tga v0.0.0-20150626111426-80720cbc1017 h1:awJfkE1xXsPK+yOi1JfFBYCrSBkZXWbOgEFL6dmYeUA= +github.com/dblezek/tga v0.0.0-20150626111426-80720cbc1017/go.mod h1:47yJHzYP/+2SCHY45B0eyR1QaecoOhkTTpS7UasE0DY= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -39,8 +41,8 @@ github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8 golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.26.0 h1:4XjIFEZWQmCZi6Wv8BoxsDhRU3RVnLX04dToTDAEPlY= -golang.org/x/image v0.26.0/go.mod h1:lcxbMFAovzpnJxzXS3nyL83K27tmqtKzIJpctK8YO5c= +golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w= +golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= @@ -55,11 +57,10 @@ golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.26.0 h1:QMYvbVduUGH0rrO+5mqF/PSPPRZNpRtg2CLELy7vUpA= -modernc.org/cc/v4 v4.26.0/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.27.0 h1:ApXKt4g9vCnEjrKs565hS2oHeEji2HduwIH9FysJa5k= -modernc.org/ccgo/v4 v4.27.0/go.mod h1:Sem8f7TFUtVXkG2fiaChQtyyfkqhJBg/zjEJBkmuAVY= +modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s= +modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.27.1 h1:emhLB4uoOmkZUnTDFcMI3AbkmU/Evjuerit9Taqe6Ss= +modernc.org/ccgo/v4 v4.27.1/go.mod h1:543Q0qQhJWekKVS5P6yL5fO6liNhla9Lbm2/B3rEKDE= modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8= modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/fsm v1.3.2 h1:f58HBydnAmLhugDKOlNniDYfKRcOH/3T4xQTO1AZXag= @@ -82,8 +83,6 @@ modernc.org/libXrender v0.9.13 h1:aTH9Ii0TepPm1MmC9aDr06UXNw5XvrIHC45y+3ULeRY= modernc.org/libXrender v0.9.13/go.mod h1:6K3VytTIn9aA8WOZQY0ZjB172pVI0VR66WLOsVW7sLo= modernc.org/libbsd v0.11.10 h1:BYRxR4L7paz3UPreS1PuKB08vULCIGcHX3GA4bBpwzQ= modernc.org/libbsd v0.11.10/go.mod h1:NdciOdGkUDnB93ld9/nxlNG8yKhTGr6BzNGzlPErqtI= -modernc.org/libc v1.65.0 h1:e183gLDnAp9VJh6gWKdTy0CThL9Pt7MfcR/0bgb7Y1Y= -modernc.org/libc v1.65.0/go.mod h1:7m9VzGq7APssBTydds2zBcxGREwvIGpuUBaKTXdm2Qs= modernc.org/libc v1.65.2 h1:drWL1QO9fKXr3kXDN8y+4lKyBr8bA3mtUBQpftq3IJw= modernc.org/libc v1.65.2/go.mod h1:VI3V2S5mNka4deJErQ0jsMXe7jgxojE2fOB/mWoHlbc= modernc.org/libexpat v0.10.12 h1:SNjo4U5z7Uu01qId6RTDH5uYT1+T94Z1JJ0s8g1FB2o= @@ -118,12 +117,8 @@ modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= -modernc.org/tcl9.0 v0.16.4 h1:noYrLlwhcs4sDwEHl5V+v4YAaqdvJazAjUrq9ed6MaI= -modernc.org/tcl9.0 v0.16.4/go.mod h1:83wNhr9By1XoSyVXE4PFnq1/TnA/DY9NXoLf38qEAZo= modernc.org/tcl9.0 v0.16.5 h1:B+nAfTErzFweaVm3W+7QuIdMdMrX1FZkfYTL3mFvF8A= modernc.org/tcl9.0 v0.16.5/go.mod h1:+Kl8LKAwB6KwmoSS43e+8CZhwjn6VyYGB/yS88eVPCA= -modernc.org/tk9.0 v0.70.1 h1:pRJpdi+UB5uQwY2DOqYxU3mhzwFm4OdC54/PazBcxJc= -modernc.org/tk9.0 v0.70.1/go.mod h1:EixZjVSmuUJws/RS/cT0rZgbZefWIB4rjMue+9GxQjI= modernc.org/tk9.0 v0.70.2-0.20250508084556-20db091eb764 h1:9h26CcGJ4o/+tW6SbHFf97s/grurL7/7qChJ96saNVU= modernc.org/tk9.0 v0.70.2-0.20250508084556-20db091eb764/go.mod h1:bE5B+tzi3tSLcfADQhoIVIG0yIsw6Pz74XuXtkWlBY4= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/main.go b/main.go index 9cc21f8..b90eeb7 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( _ "embed" "fmt" + "image" "log" "os" "path/filepath" @@ -11,7 +12,9 @@ import ( "strings" "git.yetaga.in/alazyreader/why/filetypes" + "github.com/dblezek/tga" "github.com/disintegration/imaging" + "golang.org/x/image/webp" tk "modernc.org/tk9.0" ) @@ -39,6 +42,10 @@ func must[T any](t T, err error) T { return t } +func checkErr[T any](_ T, err error) bool { + return err == nil +} + func isImage(entry os.DirEntry) bool { if entry.IsDir() { return false @@ -108,11 +115,27 @@ func newDirectory(img *tk.LabelWidget) func() { } func updateImage(file string, img *tk.LabelWidget) { - i, err := imaging.Open(file, imaging.AutoOrientation(true)) + var i image.Image + + f, err := os.Open(file) if err != nil { log.Printf("error opening image: %v", err) return } + defer f.Close() + + ext := strings.ToLower(strings.TrimPrefix(filepath.Ext(file), ".")) + if checkErr(imaging.FormatFromExtension(ext)) { + i, err = imaging.Decode(f, imaging.AutoOrientation(true)) + } else if ext == "webp" { + i, err = webp.Decode(f) + } else if ext == "tga" { + i, err = tga.Decode(f) + } + if err != nil { + log.Printf("error decoding image: %v", err) + return + } i = imaging.Fit(i, // -50 to give some space to breathe around the edges must(strconv.Atoi(tk.WinfoScreenWidth(tk.App)))-50,