void TileSourceImpl::load(FileSource& fileSource) { if (urlOrTileset.is<Tileset>()) { tileset = urlOrTileset.get<Tileset>(); loaded = true; return; } if (req) { return; } const std::string& url = urlOrTileset.get<std::string>(); req = fileSource.request(Resource::source(url), [this, url](Response res) { if (res.error) { observer->onSourceError(base, std::make_exception_ptr(std::runtime_error(res.error->message))); } else if (res.notModified) { return; } else if (res.noContent) { observer->onSourceError(base, std::make_exception_ptr(std::runtime_error("unexpectedly empty TileJSON"))); } else { Tileset newTileset; // Create a new copy of the Tileset object that holds the base values we've parsed // from the stylesheet. Then merge in the values parsed from the TileJSON we retrieved // via the URL. try { newTileset = parseTileJSON(*res.data, url, type, tileSize); } catch (...) { observer->onSourceError(base, std::current_exception()); return; } // Check whether previous information specifies different tile if (tileset.tiles != newTileset.tiles) { // Tile URLs changed: force tiles to be reloaded. invalidateTiles(); // Tile size changed: We need to recalculate the tiles we need to load because we // might have to load tiles for a different zoom level // This is done automatically when we trigger the onSourceLoaded observer below. // Min/Max zoom changed: We need to recalculate what tiles to load, if we have tiles // loaded that are outside the new zoom range // This is done automatically when we trigger the onSourceLoaded observer below. // Attribution changed: We need to notify the embedding application that this // changed. See https://github.com/mapbox/mapbox-gl-native/issues/2723 // This is not yet implemented. // Center/bounds changed: We're not using these values currently } tileset = newTileset; loaded = true; observer->onSourceLoaded(base); } }); }
virtual bool prepareUpdate() { oldValue = NULL; newDesc = NULL; if (dynamic_cast<Resource*>(program.get())->changed()) { invalidateTiles(); } return true; }
void TiledLayerChromium::prepareToUpdate(const IntRect& contentRect) { ASSERT(m_tiler); m_skipsDraw = false; if (contentRect.isEmpty()) { m_updateRect = IntRect(); return; } // Invalidate old tiles that were previously used but aren't in use this // frame so that they can get reused for new tiles. invalidateTiles(contentRect); m_tiler->growLayerToContain(contentRect); if (!m_tiler->numTiles()) { m_updateRect = IntRect(); return; } // Create tiles as needed, expanding a dirty rect to contain all // the dirty regions currently being drawn. IntRect dirtyLayerRect; int left, top, right, bottom; m_tiler->contentRectToTileIndices(contentRect, left, top, right, bottom); for (int j = top; j <= bottom; ++j) { for (int i = left; i <= right; ++i) { UpdatableTile* tile = tileAt(i, j); if (!tile) tile = createTile(i, j); if (!tile->texture()->isValid(m_tiler->tileSize(), m_textureFormat)) tile->m_dirtyLayerRect = m_tiler->tileLayerRect(tile); if (!tile->texture()->reserve(m_tiler->tileSize(), m_textureFormat)) { m_skipsDraw = true; cleanupResources(); return; } dirtyLayerRect.unite(tile->m_dirtyLayerRect); } } // Due to borders, when the paint rect is extended to tile boundaries, it // may end up overlapping more tiles than the original content rect. Record // that original rect so we don't upload more tiles than necessary. m_updateRect = contentRect; m_paintRect = m_tiler->layerRectToContentRect(dirtyLayerRect); if (dirtyLayerRect.isEmpty()) return; textureUpdater()->prepareToUpdate(m_paintRect, m_tiler->tileSize(), m_tiler->hasBorderTexels()); }
void GeoJSONSource::Impl::load(FileSource& fileSource) { if (!urlOrGeoJSON.is<std::string>()) { loaded = true; return; } if (req) { return; } const std::string& url = urlOrGeoJSON.get<std::string>(); req = fileSource.request(Resource::source(url), [this](Response res) { if (res.error) { observer->onSourceError( base, std::make_exception_ptr(std::runtime_error(res.error->message))); } else if (res.notModified) { return; } else if (res.noContent) { observer->onSourceError( base, std::make_exception_ptr(std::runtime_error("unexpectedly empty GeoJSON"))); } else { rapidjson::GenericDocument<rapidjson::UTF8<>, rapidjson::CrtAllocator> d; d.Parse<0>(res.data->c_str()); if (d.HasParseError()) { std::stringstream message; message << d.GetErrorOffset() << " - " << rapidjson::GetParseError_En(d.GetParseError()); observer->onSourceError(base, std::make_exception_ptr(std::runtime_error(message.str()))); return; } invalidateTiles(); conversion::Result<GeoJSON> geoJSON = conversion::convertGeoJSON<JSValue>(d); if (!geoJSON) { Log::Error(Event::ParseStyle, "Failed to parse GeoJSON data: %s", geoJSON.error().message.c_str()); // Create an empty GeoJSON VT object to make sure we're not infinitely waiting for // tiles to load. setGeoJSON(GeoJSON{ FeatureCollection{} }); } else { setGeoJSON(*geoJSON); } loaded = true; observer->onSourceLoaded(base); } }); }
virtual bool prepareUpdate() { bool changed = false; if (dynamic_cast<Resource*>(layerProgram.get())->changed()) { changed = true; } if (changed) { invalidateTiles(); } oldValue = NULL; newDesc = NULL; return true; }
void HydroFlowProducer::graphChanged() { invalidateTiles(); CurveDataFactory::graphChanged(); }
void HydroFlowProducer::setPotentialDelta(float delta) { this->potentialDelta = delta; invalidateTiles(); }
void HydroFlowProducer::setSlipParameter(float slip) { this->slipParameter = slip; invalidateTiles(); }