mtwebmapper: Updating the pyramid tiles finally works but the amount of copying from the original can be minimized.

This commit is contained in:
Sascha L. Teichmann 2014-09-22 00:25:24 +02:00
parent c428756beb
commit 8b6470fc9c

View File

@ -53,7 +53,7 @@ func (c xz) parent() xzm {
zp, zr := c.Z>>1, uint16(c.Z&1) zp, zr := c.Z>>1, uint16(c.Z&1)
return xzm{ return xzm{
P: xz{X: xp, Z: zp}, P: xz{X: xp, Z: zp},
Mask: 1 << (xr<<1 | zr)} Mask: 1 << (zr<<1 | xr)}
} }
func (c xzm) numChanges() (n int) { func (c xzm) numChanges() (n int) {
@ -175,11 +175,18 @@ func updatePyramidTiles(level int, baseDir string, jobs chan xzm, done *sync.Wai
} }
} }
/*
(0,0) (128, 0)
(0, 128) (128, 128)
*/
var dps = [4]image.Point{ var dps = [4]image.Point{
image.Pt(0, 128), image.Pt(0, 128),
image.Pt(0, 0),
image.Pt(128, 128), image.Pt(128, 128),
image.Pt(128, 0)} image.Pt(0, 0),
image.Pt(128, 0),
}
var ofs = [4][2]int{ var ofs = [4][2]int{
{0, 0}, {0, 0},
@ -187,6 +194,7 @@ var ofs = [4][2]int{
{0, 1}, {0, 1},
{1, 1}} {1, 1}}
/*
func clip8(x int) int { func clip8(x int) int {
switch { switch {
case x < 0: case x < 0:
@ -202,6 +210,9 @@ func clipRect(r image.Rectangle) image.Rectangle {
Min: image.Point{X: clip8(r.Min.X), Y: clip8(r.Min.Y)}, Min: image.Point{X: clip8(r.Min.X), Y: clip8(r.Min.Y)},
Max: image.Point{X: clip8(r.Max.X), Y: clip8(r.Max.Y)}} Max: image.Point{X: clip8(r.Max.X), Y: clip8(r.Max.Y)}}
} }
*/
//var windowSize = image.Pt(128, 128)
func updatePyramidTile(scratch *image.RGBA, level int, baseDir string, j xzm) error { func updatePyramidTile(scratch *image.RGBA, level int, baseDir string, j xzm) error {
@ -212,10 +223,14 @@ func updatePyramidTile(scratch *image.RGBA, level int, baseDir string, j xzm) er
if j.numChanges() < 4 { if j.numChanges() < 4 {
orig = common.LoadPNG(origPath) orig = common.LoadPNG(origPath)
sr := orig.Bounds()
r := sr.Sub(sr.Min)
draw.Draw(scratch, r, orig, sr.Min, draw.Src)
} }
for i := uint16(0); i < 4; i++ { for i := uint16(0); i < 4; i++ {
if j.Mask&(1<<i) != 0 { if j.Mask&(1<<i) != 0 {
//log.Printf("level %d: modified %d", level, i)
o := ofs[i] o := ofs[i]
bx, bz := int(2*j.P.X), int(2*j.P.Z) bx, bz := int(2*j.P.X), int(2*j.P.Z)
path := filepath.Join( path := filepath.Join(
@ -226,9 +241,12 @@ func updatePyramidTile(scratch *image.RGBA, level int, baseDir string, j xzm) er
r := sr.Sub(sr.Min).Add(dps[i]) r := sr.Sub(sr.Min).Add(dps[i])
draw.Draw(scratch, r, img, sr.Min, draw.Src) draw.Draw(scratch, r, img, sr.Min, draw.Src)
} else { } else {
sr := clipRect(orig.Bounds()) /*
r := sr.Sub(sr.Min).Add(dps[i]) log.Printf("level %d: copied %d", level, i)
draw.Draw(scratch, r, orig, sr.Min, draw.Src) dp := dps[i].Add(scratch.Bounds().Min)
r := image.Rectangle{dp, dp.Add(windowSize)}
draw.Draw(scratch, r, orig, orig.Bounds().Min.Add(dps[i]), draw.Src)
*/
} }
} }