Skip to content

Commit 4b93fec

Browse files
committed
rework visible extent rule to allow multiple extents per zoom level
1 parent 62a2e07 commit 4b93fec

File tree

3 files changed

+73
-43
lines changed

3 files changed

+73
-43
lines changed

include/mapcache.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,13 +1084,13 @@ struct mapcache_rule {
10841084
*/
10851085
int readonly;
10861086
/**
1087-
* visible extent
1087+
* visible extents, array of mapcache_extent
10881088
*/
1089-
mapcache_extent *visible_extent;
1089+
apr_array_header_t *visible_extents;
10901090
/**
1091-
* visible limits
1091+
* visible limits, array of mapcache_extent_i
10921092
*/
1093-
mapcache_extent_i *visible_limits;
1093+
apr_array_header_t *visible_limits;
10941094
};
10951095

10961096
/**\class mapcache_ruleset

lib/configuration_xml.c

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

lib/ruleset.c

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ mapcache_rule* mapcache_ruleset_rule_create(apr_pool_t *pool)
4646
{
4747
mapcache_rule* rule = (mapcache_rule*)apr_pcalloc(pool, sizeof(mapcache_rule));
4848
rule->zoom_level = -1;
49-
rule->visible_extent = NULL;
50-
rule->visible_limits = NULL;
49+
rule->visible_extents = apr_array_make(pool,0,sizeof(mapcache_extent*));
50+
rule->visible_limits = apr_array_make(pool,0,sizeof(mapcache_extent_i*));
5151
rule->hidden_color = 0xffffff; //default = white
5252
rule->readonly = 0;
5353
return rule;
@@ -64,14 +64,24 @@ mapcache_rule* mapcache_ruleset_rule_clone(apr_pool_t *pool, mapcache_rule *rule
6464
clone->hidden_color = rule->hidden_color;
6565
clone->readonly = rule->readonly;
6666

67-
if(rule->visible_extent) {
68-
clone->visible_extent = (mapcache_extent*)apr_pcalloc(pool, sizeof(mapcache_extent));
69-
*clone->visible_extent = *rule->visible_extent;
67+
if(rule->visible_extents) {
68+
int i;
69+
for(i = 0; i < rule->visible_extents->nelts; i++) {
70+
mapcache_extent *extent_clone = (mapcache_extent*)apr_pcalloc(pool, sizeof(mapcache_extent));
71+
mapcache_extent *extent = APR_ARRAY_IDX(rule->visible_extents, i, mapcache_extent*);
72+
*extent_clone = *extent;
73+
APR_ARRAY_PUSH(clone->visible_extents, mapcache_extent*) = extent_clone;
74+
}
7075
}
7176

7277
if(rule->visible_limits) {
73-
clone->visible_limits = (mapcache_extent_i*)apr_pcalloc(pool, sizeof(mapcache_extent_i));
74-
*clone->visible_limits = *rule->visible_limits;
78+
int i;
79+
for(i = 0; i < rule->visible_limits->nelts; i++) {
80+
mapcache_extent_i *extent_clone = (mapcache_extent_i*)apr_pcalloc(pool, sizeof(mapcache_extent_i));
81+
mapcache_extent_i *extent = APR_ARRAY_IDX(rule->visible_limits, i, mapcache_extent_i*);
82+
*extent_clone = *extent;
83+
APR_ARRAY_PUSH(clone->visible_limits, mapcache_extent_i*) = extent_clone;
84+
}
7585
}
7686

7787
return clone;
@@ -113,19 +123,25 @@ mapcache_rule* mapcache_ruleset_rule_get(apr_array_header_t *rules, int idx)
113123
}
114124

115125
/*
116-
* check if tile is within visible extent
126+
* check if tile is within visible extents
117127
*/
118128
int mapcache_ruleset_is_visible_tile(mapcache_rule* rule, mapcache_tile *tile) {
119-
if(!rule || !rule->visible_limits) {
129+
int i;
130+
131+
if(!rule || !rule->visible_limits || apr_is_empty_array(rule->visible_limits)) {
120132
return MAPCACHE_TRUE;
121133
}
122134

123-
if(tile->x < rule->visible_limits->minx || tile->y < rule->visible_limits->miny ||
124-
tile->x > rule->visible_limits->maxx || tile->y > rule->visible_limits->maxy) {
125-
return MAPCACHE_FALSE;
135+
for(i = 0; i < rule->visible_limits->nelts; i++) {
136+
mapcache_extent_i *extent = APR_ARRAY_IDX(rule->visible_limits, i, mapcache_extent_i*);
137+
138+
if(tile->x >= extent->minx && tile->y >= extent->miny &&
139+
tile->x <= extent->maxx && tile->y <= extent->maxy) {
140+
return MAPCACHE_TRUE;
141+
}
126142
}
127143

128-
return MAPCACHE_TRUE;
144+
return MAPCACHE_FALSE;
129145
}
130146

131147
/*

0 commit comments

Comments
 (0)