| 530 | } |
| 531 | |
| 532 | void SaveTrackData(Writer & writer, TrackData const & trackData) |
| 533 | { |
| 534 | writer << "<trk>\n"; |
| 535 | auto name = GetDefaultLanguage(trackData.m_name); |
| 536 | if (name) |
| 537 | { |
| 538 | writer << kIndent2 << "<name>"; |
| 539 | SaveStringWithCDATA(writer, *name); |
| 540 | writer << "</name>\n"; |
| 541 | } |
| 542 | if (auto const description = GetDefaultLanguage(trackData.m_description)) |
| 543 | { |
| 544 | writer << kIndent2 << "<desc>"; |
| 545 | SaveStringWithCDATA(writer, *description); |
| 546 | writer << "</desc>\n"; |
| 547 | } |
| 548 | if (auto const color = TrackColor(trackData); color != kDefaultTrackColor) |
| 549 | { |
| 550 | writer << kIndent2 << "<extensions>\n"; |
| 551 | writer << kIndent4 << "<gpxx:TrackExtension><gpxx:DisplayColor>"; |
| 552 | writer << kml::MapGarminColor(color); |
| 553 | writer << "</gpxx:DisplayColor></gpxx:TrackExtension>\n"; |
| 554 | writer << kIndent4 << "<gpx_style:line><gpx_style:color>"; |
| 555 | SaveColorToRGB(writer, color); |
| 556 | writer << "</gpx_style:color></gpx_style:line>\n"; |
| 557 | writer << kIndent4 << "<xsi:gpx><color>#"; |
| 558 | SaveColorToARGB(writer, color); |
| 559 | writer << "</color></xsi:gpx>\n"; |
| 560 | writer << kIndent2 << "</extensions>\n"; |
| 561 | } |
| 562 | bool const trackHasAltitude = TrackHasAltitudes(trackData); |
| 563 | auto const & geom = trackData.m_geometry; |
| 564 | for (size_t lineIndex = 0; lineIndex < geom.m_lines.size(); ++lineIndex) |
| 565 | { |
| 566 | auto const & line = geom.m_lines[lineIndex]; |
| 567 | auto const & timestampsForLine = geom.m_timestamps[lineIndex]; |
| 568 | auto const lineHasTimestamps = geom.HasTimestampsFor(lineIndex); |
| 569 | |
| 570 | if (lineHasTimestamps) |
| 571 | CHECK_EQUAL(line.size(), timestampsForLine.size(), ()); |
| 572 | |
| 573 | writer << kIndent2 << "<trkseg>\n"; |
| 574 | |
| 575 | for (size_t pointIndex = 0; pointIndex < line.size(); ++pointIndex) |
| 576 | { |
| 577 | auto const & point = line[pointIndex]; |
| 578 | auto const [lat, lon] = mercator::ToLatLon(point); |
| 579 | |
| 580 | writer << kIndent4 << "<trkpt lat=\"" << CoordToString(lat) << "\" lon=\"" << CoordToString(lon) << "\">\n"; |
| 581 | |
| 582 | if (trackHasAltitude) |
| 583 | writer << kIndent6 << "<ele>" << CoordToString(point.GetAltitude()) << "</ele>\n"; |
| 584 | |
| 585 | if (lineHasTimestamps) |
| 586 | writer << kIndent6 << "<time>" << base::SecondsSinceEpochToString(timestampsForLine[pointIndex]) << "</time>\n"; |
| 587 | |
| 588 | writer << kIndent4 << "</trkpt>\n"; |
| 589 | } |
no test coverage detected