@@ -209,7 +209,8 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
209209 mapcache_extent * bbox , int width , int height ,
210210 int * ntiles ,
211211 mapcache_tile * * * tiles ,
212- mapcache_grid_link * * effectively_used_grid_link )
212+ mapcache_grid_link * * effectively_used_grid_link ,
213+ apr_array_header_t * dimensions )
213214{
214215 double resolution ;
215216 int level ;
@@ -220,6 +221,19 @@ void mapcache_tileset_get_map_tiles(mapcache_context *ctx, mapcache_tileset *til
220221 resolution = mapcache_grid_get_resolution (bbox , width , height );
221222 * effectively_used_grid_link = mapcache_grid_get_closest_wms_level (ctx ,grid_link ,resolution ,& level );
222223
224+ // Get dimensions values
225+ if (dimensions )
226+ {
227+ int j ;
228+ for (j = 0 ; j < dimensions -> nelts ; j ++ )
229+ {
230+ mapcache_requested_dimension * rdim = APR_ARRAY_IDX (dimensions ,j ,mapcache_requested_dimension * );
231+ rdim -> cached_entries_for_value =
232+ mapcache_dimension_get_entries_for_value (ctx ,rdim -> dimension ,rdim -> requested_value ,
233+ tileset ,bbox ,(* effectively_used_grid_link )-> grid );
234+ }
235+ }
236+
223237 /* we don't want to assemble tiles that have already been reassembled from a lower level */
224238 if ((* effectively_used_grid_link )-> outofzoom_strategy == MAPCACHE_OUTOFZOOM_REASSEMBLE && level > (* effectively_used_grid_link )-> max_cached_zoom ) {
225239 level = (* effectively_used_grid_link )-> max_cached_zoom ;
@@ -567,6 +581,7 @@ mapcache_tile* mapcache_tileset_tile_create(apr_pool_t *pool, mapcache_tileset *
567581 mapcache_requested_dimension * rdim = apr_pcalloc (pool ,sizeof (mapcache_requested_dimension ));
568582 rdim -> requested_value = dimension -> default_value ;
569583 rdim -> cached_value = NULL ;
584+ rdim -> cached_entries_for_value = NULL ;
570585 rdim -> dimension = dimension ;
571586 APR_ARRAY_PUSH (tile -> dimensions ,mapcache_requested_dimension * ) = rdim ;
572587 }
@@ -617,6 +632,7 @@ mapcache_map* mapcache_tileset_map_create(apr_pool_t *pool, mapcache_tileset *ti
617632 mapcache_requested_dimension * rdim = apr_pcalloc (pool ,sizeof (mapcache_requested_dimension ));
618633 rdim -> requested_value = dimension -> default_value ;
619634 rdim -> cached_value = NULL ;
635+ rdim -> cached_entries_for_value = NULL ;
620636 rdim -> dimension = dimension ;
621637 APR_ARRAY_PUSH (map -> dimensions ,mapcache_requested_dimension * ) = rdim ;
622638 }
@@ -641,6 +657,7 @@ mapcache_feature_info* mapcache_tileset_feature_info_create(apr_pool_t *pool, ma
641657 mapcache_requested_dimension * rdim = apr_pcalloc (pool ,sizeof (mapcache_requested_dimension ));
642658 rdim -> requested_value = dimension -> default_value ;
643659 rdim -> cached_value = NULL ;
660+ rdim -> cached_entries_for_value = NULL ;
644661 rdim -> dimension = dimension ;
645662 APR_ARRAY_PUSH (fi -> map .dimensions ,mapcache_requested_dimension * ) = rdim ;
646663 }
@@ -819,8 +836,13 @@ void mapcache_tileset_tile_set_get_with_subdimensions(mapcache_context *ctx, map
819836
820837 for (i = 0 ;i < tile -> dimensions -> nelts ; i ++ ) {
821838 mapcache_requested_dimension * rdim = APR_ARRAY_IDX (tile -> dimensions ,i ,mapcache_requested_dimension * );
822- apr_array_header_t * single_subdimension = mapcache_dimension_get_entries_for_value (ctx ,rdim -> dimension ,rdim -> requested_value ,
823- tile -> tileset , & extent , tile -> grid_link -> grid );
839+ apr_array_header_t * single_subdimension ;
840+ if (rdim -> cached_entries_for_value ) {
841+ single_subdimension = rdim -> cached_entries_for_value ;
842+ } else {
843+ single_subdimension = mapcache_dimension_get_entries_for_value (ctx ,rdim -> dimension ,rdim -> requested_value ,
844+ tile -> tileset , & extent , tile -> grid_link -> grid );
845+ }
824846 if (GC_HAS_ERROR (ctx )) /* invalid dimension given */
825847 goto cleanup ;
826848#ifdef DEBUG
0 commit comments