In continuous mode, we need to check if there are any pending animations or
transitions so we can properly tell the client application that another render
pass is required.
This will make the code a lot more clear and it will
also move how parsing is initiated to the GlyphPBF
class, to be initiated after the request, like we do
for other resources.
Now the requests are bound to the Map Thread loop and
we can cancel it quickly when shutting down or changing
style.
Previously requests were made by the workers and we would
have to wait them to finish because workers are destroyed
before the GlyphStore. This was giving the impression that
the application was frozen (in fact it was, momentarily).
This is needed because of a race that can occur now that we
requests Glyphs from the Map Thread:
The glyph might arrive at the moment a tile is being parsed
and they won't be notified again of any new data, remaining
forever at the partial state.
The WorkQueue allow other threads to submit tasks to be executed in
the thread that the WorkQueue lives on.
The WorkQueue will cancel all the pending tasks when it gets
destructed, to make sure the tasks won't get called with
invalid references.
Relevant changes:
- Added 'defaultFadeDuration' and 'defaultTransitionDelay' to MapData;
- Painter & StyleParser now receives a reference to MapData;
- As previously seen on the code: 300ms is the default fade duration
and 0ms is the default transition duration;
- We no longer pass the current time point to Style, since it now uses
MapData.animationTime, which gets updated in MapContext::update().
- Updated StyleParser check to use a mock MapData;
- Let style classes cascade use the same time point as the one used to
recalculate style.
- Cleaned up MapContext::update to return early whenever possible.
- Cleaned up MapContext::loadStyleJSON to avoid redundant calls to style
classes cascade.
The Style object might have been created but the Source is not
yet available because the JSON file was not set. Can happen
specially when the style is loaded from the network.
Parsing errors will be reported to Observers. In practice this will
bubble all the way to the Map object.
This will make possible to identify possible corrupted data instead
of rendering without sprites like we do in case of semantic errors.
Added a filter to remove anchors with the same text that are too close to each other.
Updates to spacing and offset of anchor placement along lines:
Takes into account icon size for calculating label length.
Recalculates spacing for long labels.
Adjusts offsets to first anchors if line is continued from outside the tile boundary.
this makes sure that adding custom sprite imagery will add them to the new Style object rather than
the old one in case a user adds new custom sprites immediately after changing a stylesheet
when passing a std::string instead of an Image, the parameter gets implicitly and automatically converted (== parsed) to a temporary Image object. Since parsing an Image shouldn't be a frequent operation
this is required so that devices that aren't using 1x or 2x (like the iPhone 6 Plus with a pixelRatio of 3x) still show icons, albeit bilinearly scaled to the correct size in the SpriteAtlas