@@ -181,7 +181,7 @@ void parseRuleset(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config)
181181 for (cur_node = ezxml_child (node ,"rule" ), i = 0 ; cur_node ; cur_node = cur_node -> next , i ++ ) {
182182 int * zoom , nzoom , j ;
183183 char * zoom_attr = (char * )ezxml_attr (cur_node , "zoom_level" );
184- ezxml_t visible_extent = ezxml_child (cur_node , "visible_extent " );
184+ ezxml_t visibility = ezxml_child (cur_node , "visibility " );
185185 ezxml_t readonly = ezxml_child (cur_node , "readonly" );
186186 mapcache_rule * rule = mapcache_ruleset_rule_create (ctx -> pool );
187187
@@ -203,33 +203,41 @@ void parseRuleset(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config)
203203 return ;
204204 }
205205
206- /* parse visible_extent */
207- if (visible_extent && visible_extent -> txt && * visible_extent -> txt ) {
208- double * values ;
209- int nvalues ;
210- char * hidden_color = (char * )ezxml_attr (visible_extent , "hidden_color" );
211- char * value = apr_pstrdup (ctx -> pool ,visible_extent -> txt );
212- mapcache_extent extent = {0 ,0 ,0 ,0 };
213-
214- if (MAPCACHE_SUCCESS != mapcache_util_extract_double_list (ctx , value , NULL , & values , & nvalues ) ||
215- nvalues != 4 ) {
216- ctx -> set_error (ctx , 400 , "failed to parse visible_extent array %s in ruleset %s, rule %d. "
217- "(expecting 4 space separated numbers, got %d (%f %f %f %f)"
218- "eg <visible_extent>-180 -90 180 90</visible_extent>)" ,
219- value ,ruleset -> name ,i + 1 ,nvalues ,values [0 ],values [1 ],values [2 ],values [3 ]);
220- return ;
221- }
222- extent .minx = values [0 ];
223- extent .miny = values [1 ];
224- extent .maxx = values [2 ];
225- extent .maxy = values [3 ];
226- rule -> visible_extent = (mapcache_extent * )apr_pcalloc (ctx -> pool , sizeof (mapcache_extent ));
227- * rule -> visible_extent = extent ;
206+ /* parse visibility, <visibility> */
207+ if (visibility ) {
208+ char * hidden_color = (char * )ezxml_attr (visibility , "hidden_color" );
209+ ezxml_t extent_node ;
228210
229211 if (hidden_color && * hidden_color ) {
230212 /* parse color, base 16 */
231213 rule -> hidden_color = (unsigned int )strtol (hidden_color , NULL , 16 );
232214 }
215+
216+ /* parse extents, <extent> */
217+ for (extent_node = ezxml_child (visibility ,"extent" ); extent_node ; extent_node = extent_node -> next ) {
218+ double * values ;
219+ int nvalues ;
220+ char * value = apr_pstrdup (ctx -> pool ,extent_node -> txt );
221+ mapcache_extent extent = {0 ,0 ,0 ,0 };
222+ mapcache_extent * pextent ;
223+
224+ if (MAPCACHE_SUCCESS != mapcache_util_extract_double_list (ctx , value , NULL , & values , & nvalues ) ||
225+ nvalues != 4 ) {
226+ ctx -> set_error (ctx , 400 , "failed to parse extent array %s in ruleset %s, rule %d. "
227+ "(expecting 4 space separated numbers, got %d (%f %f %f %f)"
228+ "eg <extent>-180 -90 180 90</extent>)" ,
229+ value ,ruleset -> name ,i + 1 ,nvalues ,values [0 ],values [1 ],values [2 ],values [3 ]);
230+ return ;
231+ }
232+
233+ extent .minx = values [0 ];
234+ extent .miny = values [1 ];
235+ extent .maxx = values [2 ];
236+ extent .maxy = values [3 ];
237+ pextent = (mapcache_extent * )apr_pcalloc (ctx -> pool , sizeof (mapcache_extent ));
238+ * pextent = extent ;
239+ APR_ARRAY_PUSH (rule -> visible_extents , mapcache_extent * ) = pextent ;
240+ }
233241 }
234242
235243 /* add this rule for given zoom_levels */
@@ -803,9 +811,15 @@ void parseTileset(mapcache_context *ctx, ezxml_t node, mapcache_cfg *config)
803811
804812 if (rule ) {
805813 mapcache_rule * rule_clone = mapcache_ruleset_rule_clone (ctx -> pool , rule );
806- if (rule -> visible_extent ) {
807- rule_clone -> visible_limits = apr_pcalloc (ctx -> pool , sizeof (mapcache_extent_i ));
808- mapcache_grid_compute_limits_at_level (grid ,rule_clone -> visible_extent ,rule_clone -> visible_limits ,tolerance ,i );
814+
815+ if (rule -> visible_extents ) {
816+ int j ;
817+ for (j = 0 ; j < rule -> visible_extents -> nelts ; j ++ ) {
818+ mapcache_extent * visible_extent = APR_ARRAY_IDX (rule -> visible_extents , j , mapcache_extent * );
819+ mapcache_extent_i * visible_limit = apr_pcalloc (ctx -> pool , sizeof (mapcache_extent_i ));
820+ mapcache_grid_compute_limits_at_level (grid ,visible_extent ,visible_limit ,tolerance ,i );
821+ APR_ARRAY_PUSH (rule_clone -> visible_limits , mapcache_extent_i * ) = visible_limit ;
822+ }
809823 }
810824 APR_ARRAY_PUSH (gridlink -> rules , mapcache_rule * ) = rule_clone ;
811825 } else {
0 commit comments