Piggyback serves its rasters only as WebP. The pyramid builder now decodes it like any other source format -- golang.org/x/image was already in the tree -- and copies a complete WebP level through byte-for-byte, the same fidelity every other source level gets. Nothing in Go encodes WebP, so the levels folded down from one take JPEG, and the data routes learn the one content type they were missing so the browser, which has decoded WebP natively for years, is allowed to see the tiles at all.
- commit
- abe71f06e0892ddbe6a049182b2766cdf550292e
- parent
- 35a3cd723e024ba85af672a141d1da64ac678cf7
- author
- Dami <dami.etoile@gmail.com>
| M | go.mod | 3 | ++- |
| M | go.sum | 5 | +++++ |
| M | routes.go | 1 | + |
| M | tools/ | 18 | ++++++++++++++---- |
@@ -38,9 +38,10 @@ require (
3838 github.com/wailsapp/go-webview2 v1.0.22 // indirect3939 github.com/wailsapp/mimetype v1.4.1 // indirect4040 golang.org/x/crypto v0.51.0 // indirect41+ golang.org/x/image v0.44.0 // indirect4142 golang.org/x/net v0.54.0 // indirect4243 golang.org/x/sys v0.46.0 // indirect43- golang.org/x/text v0.37.0 // indirect44+ golang.org/x/text v0.40.0 // indirect4445 lukechampine.com/blake3 v1.4.1 // indirect4546 modernc.org/libc v1.74.1 // indirect4647 modernc.org/mathutil v1.7.1 // indirect@@ -77,6 +77,8 @@ github.com/wailsapp/wails/v2 v2.13.0 h1:S7OgXWpj72V91unF8iDWJKbcS9ZpwCT3R0QVru4v
7777 github.com/wailsapp/wails/v2 v2.13.0/go.mod h1:nVr/wSIEZ7xxKPkzK65mjpKpaOPQI2k4pvLwGR/i4kc=7878 golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=7979 golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=80+golang.org/x/image v0.44.0 h1:+tDekMZED9+LrtB3G5xzRggpVh9CARjZqROla3R3R+I=81+golang.org/x/image v0.44.0/go.mod h1:V8K3KE9KKKE+pLpQDOeN18w9oacNSvy1tDOirTu4xtY=8082 golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ=8183 golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=8284 golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=@@ -84,6 +86,7 @@ golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
8486 golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=8587 golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=8688 golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=89+golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=8790 golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=8891 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=8992 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=@@ -96,6 +99,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
9699 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=97100 golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=98101 golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=102+golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs=103+golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY=99104 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=100105 golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=101106 golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=@@ -19,6 +19,7 @@ var dataTypes = map[string]string{
1919 ".bin": "application/octet-stream",2020 ".jpg": "image/jpeg",2121 ".png": "image/png",22+ ".webp": "image/webp",2223 ".svg": "image/svg+xml",2324 }2425 @@ -22,6 +22,10 @@ import (
2222 "strconv"2323 "strings"2424 25+ // WebP sources decode through image.Decode like any other; Go encodes26+ // none, so levels derived from them are written as JPEG or PNG.27+ _ "golang.org/x/image/webp"28+2529 "github.com/FelineStateMachine/atlas/internal/ignmap"2630 )2731 @@ -634,6 +638,11 @@ func buildPyramid(root string, plan tilePlan) (variantManifest, error) {
634638 if !plan.Interpolate || derivedFormat == "png" {635639 derivedFormat = "png"636640 }641+ // A WebP source level copies through as it came, but nothing here642+ // encodes WebP, so the levels folded down from it take JPEG.643+ if derivedFormat == "webp" {644+ derivedFormat = "jpg"645+ }637646 mask, err := deriveLevel(root, plan.AssetPath, localZoom, formats[localZoom+1], derivedFormat, !plan.Interpolate, background)638647 if err != nil {639648 return variantManifest{}, err@@ -1085,13 +1094,14 @@ func readJSON(path string, destination any) error {
10851094 10861095 func normalizeFormat(value string) string {10871096 value = strings.ToLower(strings.TrimPrefix(value, "."))1088- if value == "jpeg" {1097+ switch value {1098+ case "jpeg":10891099 return "jpg"1090- }1091- if value != "png" {1100+ case "png", "webp":1101+ return value1102+ default:10921103 return "jpg"10931104 }1094- return value10951105 }10961106 10971107 // isPixelArt marks maps drawn on a pixel grid. They are folded down with