(updaterState *UpdaterState, title string, transparent bool)
| 100 | } |
| 101 | |
| 102 | func (g *MapGenerator) GenerateMap(updaterState *UpdaterState, title string, transparent bool) error { |
| 103 | stateAlerts := map[int]bool{} |
| 104 | for _, state := range updaterState.States { |
| 105 | stateAlerts[state.ID] = state.Alert |
| 106 | } |
| 107 | |
| 108 | mapStr := bytes.NewBuffer(nil) |
| 109 | if err := g.mapTemplate.Execute(mapStr, map[string]interface{}{"alerts": stateAlerts}); err != nil { |
| 110 | return fmt.Errorf("mapgenerator: execute map template: %w", err) |
| 111 | } |
| 112 | |
| 113 | svg, _ := oksvg.ReadIconStream(mapStr) |
| 114 | svg.SetTarget(0, 0, MapWidth, MapHeight) |
| 115 | rect := image.Rect(0, 0, MapWidth, MapHeight) |
| 116 | rgba := image.NewRGBA(rect) |
| 117 | |
| 118 | if !transparent { |
| 119 | draw.Draw(rgba, rect, image.White, image.Point{}, draw.Src) |
| 120 | } |
| 121 | |
| 122 | svg.Draw(rasterx.NewDasher(MapWidth, MapHeight, rasterx.NewScannerGV(MapWidth, MapHeight, rgba, rgba.Bounds())), 1) |
| 123 | |
| 124 | if len(title) > 0 { |
| 125 | g.fontContext.SetClip(rgba.Bounds()) |
| 126 | g.fontContext.SetDst(rgba) |
| 127 | |
| 128 | if _, err := g.fontContext.DrawString(title, freetype.Pt(50, 500)); err != nil { |
| 129 | return fmt.Errorf("mapgenerator: draw text: %w", err) |
| 130 | } |
| 131 | } |
| 132 | |
| 133 | out := bytes.NewBuffer(nil) |
| 134 | if err := png.Encode(out, rgba); err != nil { |
| 135 | return fmt.Errorf("mapgenerator: encode png map: %w", err) |
| 136 | } |
| 137 | |
| 138 | g.MapData.ContentType = "image/png" |
| 139 | g.MapData.Bytes = out.Bytes() |
| 140 | |
| 141 | log.Infof("mapgenerator: generate map complete, size = %d B", len(g.MapData.Bytes)) |
| 142 | |
| 143 | return nil |
| 144 | } |
no outgoing calls
no test coverage detected