This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository mapserver.
commit 85b8750cd55f57f72e5f1c725178c1220bb4f74b Author: Bas Couwenberg <[email protected]> Date: Wed Jun 21 20:53:49 2017 +0200 New upstream version 7.0.6 --- CMakeLists.txt | 2 +- maplabel.c | 1 + mapmssql2008.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- mapogr.cpp | 19 ++++++++++++- mapquery.c | 4 ++- maprendering.c | 35 ++++++++++++++++++++++- mapresample.c | 7 ++++- maputil.c | 2 ++ 8 files changed, 149 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25bc2d1..d8373ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 7) set (MapServer_VERSION_MINOR 0) -set (MapServer_VERSION_REVISION 5) +set (MapServer_VERSION_REVISION 6) set (MapServer_VERSION_SUFFIX "") set(TARGET_VERSION_MAJOR ${MapServer_VERSION_MAJOR}) diff --git a/maplabel.c b/maplabel.c index dffab3c..76be835 100644 --- a/maplabel.c +++ b/maplabel.c @@ -217,6 +217,7 @@ void msCopyTextPath(textPathObj *dst, textPathObj *src) { if(src->bounds.poly) { dst->bounds.poly = msSmallMalloc(sizeof(lineObj)); dst->bounds.poly->numpoints = src->bounds.poly->numpoints; + dst->bounds.poly->point = msSmallMalloc(src->bounds.poly->numpoints * sizeof(pointObj)); for(i=0; i<src->bounds.poly->numpoints; i++) { dst->bounds.poly->point[i] = src->bounds.poly->point[i]; } diff --git a/mapmssql2008.c b/mapmssql2008.c index 9be58ba..7e95d21 100644 --- a/mapmssql2008.c +++ b/mapmssql2008.c @@ -2463,7 +2463,11 @@ int process_node(layerObj* layer, expressionObj *filter) case MS_TOKEN_BINDING_DOUBLE: case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: - strtmpl = "%s"; + if(layerinfo->current_node->next->token == MS_TOKEN_COMPARISON_IRE) + strtmpl = "LOWER(%s)"; + else + strtmpl = "%s"; + stresc = msMSSQL2008LayerEscapePropertyName(layer, layerinfo->current_node->tokenval.bindval.item); snippet = (char *) msSmallMalloc(strlen(strtmpl) + strlen(stresc)); sprintf(snippet, strtmpl, stresc); @@ -2486,9 +2490,85 @@ int process_node(layerObj* layer, expressionObj *filter) case MS_TOKEN_COMPARISON_IN: filter->native_string = msStringConcatenate(filter->native_string, " IN "); break; - case MS_TOKEN_COMPARISON_LIKE: - filter->native_string = msStringConcatenate(filter->native_string, " LIKE "); - break; + case MS_TOKEN_COMPARISON_RE: + case MS_TOKEN_COMPARISON_IRE: + case MS_TOKEN_COMPARISON_LIKE: { + /* process regexp */ + size_t i = 0, j = 0; + char c; + char c_next; + int bCaseInsensitive = (layerinfo->current_node->token == MS_TOKEN_COMPARISON_IRE); + int nEscapeLen = 0; + if (bCaseInsensitive) + filter->native_string = msStringConcatenate(filter->native_string, " LIKE LOWER("); + else + filter->native_string = msStringConcatenate(filter->native_string, " LIKE "); + + layerinfo->current_node = layerinfo->current_node->next; + if (layerinfo->current_node->token != MS_TOKEN_LITERAL_STRING) return 0; + + strtmpl = msStrdup(layerinfo->current_node->tokenval.strval); + if (strtmpl[0] == '/') { + stresc = strtmpl + 1; + strtmpl[strlen(strtmpl) - 1] = '\0'; + } + else if (strtmpl[0] == '^') + stresc = strtmpl + 1; + else + stresc = strtmpl; + + while (*stresc) { + c = stresc[i]; + if (c == '%' || c == '_' || c == '[' || c == ']' || c == '^') { + nEscapeLen++; + } + stresc++; + } + snippet = (char *)msSmallMalloc(strlen(strtmpl) + nEscapeLen + 3); + snippet[j++] = '\''; + while (i < strlen(strtmpl)) { + c = strtmpl[i]; + c_next = strtmpl[i+1]; + + if (i == 0 && c == '^') { + i++; + continue; + } + + if (c == '\\') { + i++; + c = c_next; + } + + if (c == '%' || c == '_' || c == '[' || c == ']' || c == '^') { + snippet[j++] = '\\'; + } + + if (c == '.' && c_next == '*') { + i++; + c = '%'; + } + else if (c == '.') + c = '_'; + + + snippet[j++] = c; + i++; + } + snippet[j++] = '\''; + snippet[j] = '\0'; + + filter->native_string = msStringConcatenate(filter->native_string, snippet); + msFree(strtmpl); + msFree(snippet); + + if (bCaseInsensitive) + filter->native_string = msStringConcatenate(filter->native_string, ")"); + + if (nEscapeLen > 0) + filter->native_string = msStringConcatenate(filter->native_string, " ESCAPE '\\'"); + } + break; case MS_TOKEN_COMPARISON_EQ: filter->native_string = msStringConcatenate(filter->native_string, " = "); break; diff --git a/mapogr.cpp b/mapogr.cpp index 5460c33..9bf0af6 100644 --- a/mapogr.cpp +++ b/mapogr.cpp @@ -2585,7 +2585,12 @@ static int msOGRFileWhichShapes(layerObj *layer, rectObj rect, msOGRFileInfo *ps CPLErrorReset(); if( OGR_L_SetAttributeFilter( psInfo->hLayer, pszOGRFilter ) != OGRERR_NONE ) { + msSetError(MS_OGRERR, "SetAttributeFilter() failed on layer %s. Check logs.", "msOGRFileWhichShapes()", layer->name?layer->name:"(null)"); msDebug("SetAttributeFilter(%s) failed on layer %s.\n%s\n", pszOGRFilter, layer->name?layer->name:"(null)", CPLGetLastErrorMsg() ); + RELEASE_OGR_LOCK; + msFree(pszOGRFilter); + msFree(select); + return MS_FAILURE; } msFree(pszOGRFilter); } else @@ -3263,6 +3268,7 @@ static msExprNode* BuildExprTree(tokenListNodeObjPtr node, { if( node->next && node->next->token == '(' ) { + int node_token = node->token; msExprNode* subExpr = BuildExprTree(node->next->next, &node, nParenthesisLevel + 1); if( subExpr == NULL ) @@ -3270,7 +3276,7 @@ static msExprNode* BuildExprTree(tokenListNodeObjPtr node, goto fail; } msExprNode* newNode = new msExprNode; - newNode->m_nToken = node->token; + newNode->m_nToken = node_token; if( subExpr->m_nToken == 0 ) { newNode->m_aoChildren = subExpr->m_aoChildren; @@ -3388,6 +3394,8 @@ fail: /********************************************************************** * msOGRExtractTopSpatialFilter() + * + * Recognize expressions like "Intersects([shape], wkt) == TRUE [AND ....]" **********************************************************************/ static int msOGRExtractTopSpatialFilter( msOGRFileInfo *info, const msExprNode* expr, @@ -3396,6 +3404,15 @@ static int msOGRExtractTopSpatialFilter( msOGRFileInfo *info, if( expr == NULL ) return MS_FALSE; + if( expr->m_nToken == MS_TOKEN_COMPARISON_EQ && + expr->m_aoChildren.size() == 2 && + expr->m_aoChildren[1]->m_nToken == MS_TOKEN_LITERAL_BOOLEAN && + expr->m_aoChildren[1]->m_dfVal == 1.0 ) + { + return msOGRExtractTopSpatialFilter(info, expr->m_aoChildren[0], + pSpatialFilterNode); + } + if( expr->m_nToken == MS_TOKEN_COMPARISON_INTERSECTS && expr->m_aoChildren.size() == 2 && expr->m_aoChildren[1]->m_nToken == MS_TOKEN_LITERAL_SHAPE ) diff --git a/mapquery.c b/mapquery.c index df0b2ee..a076691 100644 --- a/mapquery.c +++ b/mapquery.c @@ -881,6 +881,7 @@ int msQueryByRect(mapObj *map) char status; shapeObj shape, searchshape; rectObj searchrect, searchrectInMapProj; + const rectObj invalid_rect = MS_INIT_INVALID_RECT; double layer_tolerance = 0, tolerance = 0; int paging; @@ -982,7 +983,8 @@ int msQueryByRect(mapObj *map) #ifdef USE_PROJ lp->project = msProjectionsDiffer(&(lp->projection), &(map->projection)); - if(lp->project) + if(lp->project && + memcmp( &searchrect, &invalid_rect, sizeof(searchrect) ) != 0 ) msProjectRect(&(map->projection), &(lp->projection), &searchrect); /* project the searchrect to source coords */ #endif diff --git a/maprendering.c b/maprendering.c index 7ee3692..b32716c 100644 --- a/maprendering.c +++ b/maprendering.c @@ -996,6 +996,7 @@ int msDrawTextSymbol(mapObj *map, imageObj *image, pointObj labelPnt, textSymbol colorObj *c = NULL, *oc = NULL; int ow; assert(ts->textpath); + if(!renderer->renderGlyphs) return MS_FAILURE; if(!ts->textpath->absolute) { int g; @@ -1019,12 +1020,44 @@ int msDrawTextSymbol(mapObj *map, imageObj *image, pointObj labelPnt, textSymbol } } } + + if(MS_VALID_COLOR(ts->label->shadowcolor)) { + textSymbolObj *ts_shadow; + int g; + double ox, oy; + double cosa,sina; + if(ts->rotation != 0) { + cosa = cos(ts->rotation); + sina = sin(ts->rotation); + ox = ts->scalefactor * (cosa * ts->label->shadowsizex + + sina * ts->label->shadowsizey); + oy = ts->scalefactor * (-sina * ts->label->shadowsizex + + cosa * ts->label->shadowsizey); + } + else { + ox = ts->scalefactor * ts->label->shadowsizex; + oy = ts->scalefactor * ts->label->shadowsizey; + } + + ts_shadow = msSmallMalloc(sizeof(textSymbolObj)); + initTextSymbol(ts_shadow); + msCopyTextSymbol(ts_shadow,ts); + + for(g=0;g<ts_shadow->textpath->numglyphs;g++) { + ts_shadow->textpath->glyphs[g].pnt.x += ox; + ts_shadow->textpath->glyphs[g].pnt.y += oy; + } + + renderer->renderGlyphs(image,ts_shadow->textpath,&ts->label->shadowcolor,NULL,0); + freeTextSymbol(ts_shadow); + msFree(ts_shadow); + } + if(MS_VALID_COLOR(ts->label->color)) c = &ts->label->color; if(MS_VALID_COLOR(ts->label->outlinecolor)) oc = &ts->label->outlinecolor; ow = MS_NINT((double)ts->label->outlinewidth * ((double)ts->textpath->glyph_size / (double)ts->label->size)); - if(!renderer->renderGlyphs) return MS_FAILURE; return renderer->renderGlyphs(image,ts->textpath,c,oc,ow); } diff --git a/mapresample.c b/mapresample.c index b0fa1c1..1179ab4 100644 --- a/mapresample.c +++ b/mapresample.c @@ -1547,7 +1547,12 @@ int msResampleGDALToMap( mapObj *map, layerObj *layer, imageObj *image, /* matches the sSrcExtent, even if that generates non-square pixels (#1715) */ /* The rotated case should ideally be dealt with, but not for now... */ if( adfSrcGeoTransform[2] == 0 && adfSrcGeoTransform[4] == 0 && - adfSrcGeoTransform[5] < 0 ) + adfSrcGeoTransform[5] < 0 && + /* But do that only if the pixels were square before, otherwise */ + /* this is going to mess with source rasters whose pixels aren't at */ + /* all square (#5445) */ + fabs(fabs(adfSrcGeoTransform[1]) - fabs(adfSrcGeoTransform[5])) < + 0.01 * fabs(adfSrcGeoTransform[1]) ) { adfSrcGeoTransform[1] = (sSrcExtent.maxx - sSrcExtent.minx) * dfNominalCellSize / nLoadImgXSize; diff --git a/maputil.c b/maputil.c index 4c720d0..d6f23d2 100644 --- a/maputil.c +++ b/maputil.c @@ -1759,6 +1759,8 @@ shapeObj *msOffsetCurve(shapeObj *p, double offset) if that is the case.*/ if(ret) return ret; + /* clear error raised by geos in this case */ + msResetErrorList(); #endif /* ** For offset corner point calculation 1/sin() is used -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mapserver.git _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

