return bytes from renderer
This commit is contained in:
parent
ed352fed60
commit
607c4fe06d
@ -36,33 +36,39 @@ func Job(ctx *app.App) {
|
|||||||
|
|
||||||
lastcoords = *newlastcoords
|
lastcoords = *newlastcoords
|
||||||
|
|
||||||
//Invalidate zoom 12-1
|
//Render zoom 12
|
||||||
for _, mb := range mblist {
|
for _, mb := range mblist {
|
||||||
|
//zoom 13
|
||||||
tc := coords.GetTileCoordsFromMapBlock(mb.Pos, ctx.Config.Layers)
|
tc := coords.GetTileCoordsFromMapBlock(mb.Pos, ctx.Config.Layers)
|
||||||
|
|
||||||
if tc == nil {
|
//zoom 12
|
||||||
panic("tile not in any layer")
|
tc = tc.GetZoomedOutTile()
|
||||||
|
|
||||||
|
fields = logrus.Fields{
|
||||||
|
"X": tc.X,
|
||||||
|
"Y": tc.Y,
|
||||||
|
"Zoom": tc.Zoom,
|
||||||
|
"LayerId": tc.LayerId,
|
||||||
}
|
}
|
||||||
|
logrus.WithFields(fields).Debug("Dispatching tile rendering (z12)")
|
||||||
|
|
||||||
for tc.Zoom > 1 {
|
ctx.Objectdb.RemoveTile(tc)
|
||||||
tc = tc.GetZoomedOutTile()
|
_, err = ctx.Tilerenderer.Render(tc, 2)
|
||||||
|
if err != nil {
|
||||||
fields = logrus.Fields{
|
panic(err)
|
||||||
"X": tc.X,
|
|
||||||
"Y": tc.Y,
|
|
||||||
"Zoom": tc.Zoom,
|
|
||||||
"LayerId": tc.LayerId,
|
|
||||||
}
|
|
||||||
logrus.WithFields(fields).Trace("Removing tile")
|
|
||||||
|
|
||||||
ctx.Objectdb.RemoveTile(tc)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Render zoom 12-1
|
//Render zoom 11-1
|
||||||
for _, mb := range mblist {
|
for _, mb := range mblist {
|
||||||
|
//13
|
||||||
tc := coords.GetTileCoordsFromMapBlock(mb.Pos, ctx.Config.Layers)
|
tc := coords.GetTileCoordsFromMapBlock(mb.Pos, ctx.Config.Layers)
|
||||||
|
|
||||||
|
//12
|
||||||
|
tc = tc.GetZoomedOutTile()
|
||||||
|
|
||||||
for tc.Zoom > 1 {
|
for tc.Zoom > 1 {
|
||||||
|
//11-1
|
||||||
tc = tc.GetZoomedOutTile()
|
tc = tc.GetZoomedOutTile()
|
||||||
|
|
||||||
fields = logrus.Fields{
|
fields = logrus.Fields{
|
||||||
@ -71,9 +77,10 @@ func Job(ctx *app.App) {
|
|||||||
"Zoom": tc.Zoom,
|
"Zoom": tc.Zoom,
|
||||||
"LayerId": tc.LayerId,
|
"LayerId": tc.LayerId,
|
||||||
}
|
}
|
||||||
logrus.WithFields(fields).Debug("Dispatching tile rendering")
|
logrus.WithFields(fields).Debug("Dispatching tile rendering (z11-1)")
|
||||||
|
|
||||||
_, err = ctx.Tilerenderer.Render(tc)
|
ctx.Objectdb.RemoveTile(tc)
|
||||||
|
_, err = ctx.Tilerenderer.Render(tc, 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ const (
|
|||||||
IMG_SIZE = 256
|
IMG_SIZE = 256
|
||||||
)
|
)
|
||||||
|
|
||||||
func (tr *TileRenderer) Render(tc *coords.TileCoords) ([]byte, error) {
|
func (tr *TileRenderer) Render(tc *coords.TileCoords, recursionDepth int) ([]byte, error) {
|
||||||
|
|
||||||
//Check cache
|
//Check cache
|
||||||
tile, err := tr.tdb.GetTile(tc)
|
tile, err := tr.tdb.GetTile(tc)
|
||||||
@ -50,8 +50,14 @@ func (tr *TileRenderer) Render(tc *coords.TileCoords) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if tile == nil {
|
if tile == nil {
|
||||||
|
|
||||||
|
if recursionDepth == 0 {
|
||||||
|
log.WithFields(logrus.Fields{"x": tc.X, "y": tc.Y, "zoom": tc.Zoom}).Debug("Skip image")
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
//No tile in db
|
//No tile in db
|
||||||
img, err := tr.RenderImage(tc, false)
|
img, data, err := tr.RenderImage(tc, recursionDepth)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -62,27 +68,24 @@ func (tr *TileRenderer) Render(tc *coords.TileCoords) ([]byte, error) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
return data, nil
|
||||||
png.Encode(buf, img)
|
|
||||||
|
|
||||||
return buf.Bytes(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return tile.Data, nil
|
return tile.Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, cachedOnly bool) (*image.NRGBA, error) {
|
func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, recursionDepth int) (*image.NRGBA, []byte, error) {
|
||||||
|
|
||||||
cachedtile, err := tr.tdb.GetTile(tc)
|
cachedtile, err := tr.tdb.GetTile(tc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if cachedtile != nil {
|
if cachedtile != nil {
|
||||||
reader := bytes.NewReader(cachedtile.Data)
|
reader := bytes.NewReader(cachedtile.Data)
|
||||||
cachedimg, err := png.Decode(reader)
|
cachedimg, err := png.Decode(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
rect := image.Rectangle{
|
rect := image.Rectangle{
|
||||||
@ -93,12 +96,13 @@ func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, cachedOnly bool) (*im
|
|||||||
img := image.NewNRGBA(rect)
|
img := image.NewNRGBA(rect)
|
||||||
draw.Draw(img, rect, cachedimg, image.ZP, draw.Src)
|
draw.Draw(img, rect, cachedimg, image.ZP, draw.Src)
|
||||||
|
|
||||||
return img, nil
|
log.WithFields(logrus.Fields{"x": tc.X, "y": tc.Y, "zoom": tc.Zoom}).Debug("Cached image")
|
||||||
|
return img, cachedtile.Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if cachedOnly {
|
if recursionDepth == 0 {
|
||||||
log.WithFields(logrus.Fields{"x": tc.X, "y": tc.Y, "zoom": tc.Zoom}).Debug("Skip image")
|
log.WithFields(logrus.Fields{"x": tc.X, "y": tc.Y, "zoom": tc.Zoom}).Debug("Skip image")
|
||||||
return nil, nil
|
return nil, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.WithFields(logrus.Fields{"x": tc.X, "y": tc.Y, "zoom": tc.Zoom}).Debug("RenderImage")
|
log.WithFields(logrus.Fields{"x": tc.X, "y": tc.Y, "zoom": tc.Zoom}).Debug("RenderImage")
|
||||||
@ -112,11 +116,11 @@ func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, cachedOnly bool) (*im
|
|||||||
}
|
}
|
||||||
|
|
||||||
if layer == nil {
|
if layer == nil {
|
||||||
return nil, errors.New("No layer found")
|
return nil, nil, errors.New("No layer found")
|
||||||
}
|
}
|
||||||
|
|
||||||
if tc.Zoom > 13 || tc.Zoom < 1 {
|
if tc.Zoom > 13 || tc.Zoom < 1 {
|
||||||
return nil, errors.New("Invalid zoom")
|
return nil, nil, errors.New("Invalid zoom")
|
||||||
}
|
}
|
||||||
|
|
||||||
if tc.Zoom == 13 {
|
if tc.Zoom == 13 {
|
||||||
@ -125,14 +129,25 @@ func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, cachedOnly bool) (*im
|
|||||||
mbr.Pos1.Y = layer.From
|
mbr.Pos1.Y = layer.From
|
||||||
mbr.Pos2.Y = layer.To
|
mbr.Pos2.Y = layer.To
|
||||||
|
|
||||||
return tr.mapblockrenderer.Render(mbr.Pos1, mbr.Pos2)
|
img, err := tr.mapblockrenderer.Render(mbr.Pos1, mbr.Pos2)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if img == nil {
|
||||||
|
return nil, nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
png.Encode(buf, img)
|
||||||
|
|
||||||
|
return img, buf.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//zoom 1-12
|
//zoom 1-12
|
||||||
quads := tc.GetZoomedQuadrantsFromTile()
|
quads := tc.GetZoomedQuadrantsFromTile()
|
||||||
|
|
||||||
recursiveCachedOnly := tc.Zoom < 12
|
|
||||||
|
|
||||||
fields := logrus.Fields{
|
fields := logrus.Fields{
|
||||||
"UpperLeft": quads.UpperLeft,
|
"UpperLeft": quads.UpperLeft,
|
||||||
"UpperRight": quads.UpperRight,
|
"UpperRight": quads.UpperRight,
|
||||||
@ -141,24 +156,28 @@ func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, cachedOnly bool) (*im
|
|||||||
}
|
}
|
||||||
log.WithFields(fields).Debug("Quad image stats")
|
log.WithFields(fields).Debug("Quad image stats")
|
||||||
|
|
||||||
upperLeft, err := tr.RenderImage(quads.UpperLeft, recursiveCachedOnly)
|
upperLeft, _, err := tr.RenderImage(quads.UpperLeft, recursionDepth-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
|
//return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
upperRight, err := tr.RenderImage(quads.UpperRight, recursiveCachedOnly)
|
upperRight, _, err := tr.RenderImage(quads.UpperRight, recursionDepth-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
|
//return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
lowerLeft, err := tr.RenderImage(quads.LowerLeft, recursiveCachedOnly)
|
lowerLeft, _, err := tr.RenderImage(quads.LowerLeft, recursionDepth-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
|
//return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
lowerRight, err := tr.RenderImage(quads.LowerRight, recursiveCachedOnly)
|
lowerRight, _, err := tr.RenderImage(quads.LowerRight, recursionDepth-1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
|
//return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
img := image.NewNRGBA(
|
img := image.NewNRGBA(
|
||||||
@ -198,5 +217,5 @@ func (tr *TileRenderer) RenderImage(tc *coords.TileCoords, cachedOnly bool) (*im
|
|||||||
tile := mapobjectdb.Tile{Pos: tc, Data: buf.Bytes(), Mtime: time.Now().Unix()}
|
tile := mapobjectdb.Tile{Pos: tc, Data: buf.Bytes(), Mtime: time.Now().Unix()}
|
||||||
tr.tdb.SetTile(&tile)
|
tr.tdb.SetTile(&tile)
|
||||||
|
|
||||||
return img, nil
|
return img, buf.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
@ -69,9 +69,7 @@ func TestTileRender(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
coord := coords.NewTileCoords(0, 0, 12, 0)
|
coord := coords.NewTileCoords(0, 0, 12, 0)
|
||||||
|
data, err := tr.Render(coord, 2)
|
||||||
data, err := tr.Render(coord)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -82,4 +80,20 @@ func TestTileRender(t *testing.T) {
|
|||||||
|
|
||||||
f, _ := os.Create("../output/0_0_12.png")
|
f, _ := os.Create("../output/0_0_12.png")
|
||||||
bytes.NewReader(data).WriteTo(f)
|
bytes.NewReader(data).WriteTo(f)
|
||||||
|
|
||||||
|
coord1 := coord.GetZoomedOutTile()
|
||||||
|
|
||||||
|
data, err = tr.Render(coord1, 3)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data == nil {
|
||||||
|
panic("no data")
|
||||||
|
}
|
||||||
|
|
||||||
|
f, _ = os.Create("../output/0_0_13.png")
|
||||||
|
bytes.NewReader(data).WriteTo(f)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ func Job(ctx *app.App) {
|
|||||||
}
|
}
|
||||||
logrus.WithFields(fields).Debug("Dispatching tile rendering (update)")
|
logrus.WithFields(fields).Debug("Dispatching tile rendering (update)")
|
||||||
|
|
||||||
_, err = ctx.Tilerenderer.Render(tc)
|
_, err = ctx.Tilerenderer.Render(tc, 2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user