| 181 | } |
| 182 | |
| 183 | imageObj *getTile(imageObj *img, symbolObj *symbol, symbolStyleObj *s, int width, int height, |
| 184 | int seamlessmode) { |
| 185 | tileCacheObj *tile; |
| 186 | rendererVTableObj *renderer = img->format->vtable; |
| 187 | if(width==-1 || height == -1) { |
| 188 | width=height=MS_MAX(symbol->sizex,symbol->sizey); |
| 189 | } |
| 190 | tile = searchTileCache(img,symbol,s,width,height); |
| 191 | if(tile==NULL) { |
| 192 | imageObj *tileimg; |
| 193 | double p_x,p_y; |
| 194 | tileimg = msImageCreate(width,height,img->format,NULL,NULL,img->resolution, img->resolution, NULL); |
| 195 | if(!seamlessmode) { |
| 196 | p_x = width/2.0; |
| 197 | p_y = height/2.0; |
| 198 | switch(symbol->type) { |
| 199 | case (MS_SYMBOL_TRUETYPE): |
| 200 | renderer->renderTruetypeSymbol(tileimg, p_x, p_y, symbol, s); |
| 201 | break; |
| 202 | case (MS_SYMBOL_PIXMAP): |
| 203 | if(msPreloadImageSymbol(renderer,symbol) != MS_SUCCESS) { |
| 204 | return NULL; //failed to load image, renderer should have set the error message |
| 205 | } |
| 206 | renderer->renderPixmapSymbol(tileimg, p_x, p_y, symbol, s); |
| 207 | break; |
| 208 | case (MS_SYMBOL_ELLIPSE): |
| 209 | renderer->renderEllipseSymbol(tileimg, p_x, p_y,symbol, s); |
| 210 | break; |
| 211 | case (MS_SYMBOL_VECTOR): |
| 212 | renderer->renderVectorSymbol(tileimg, p_x, p_y, symbol, s); |
| 213 | break; |
| 214 | default: |
| 215 | break; |
| 216 | } |
| 217 | } else { |
| 218 | /* |
| 219 | * in seamless mode, we render the the symbol 9 times on a 3x3 grid to account for |
| 220 | * antialiasing blending from one tile to the next. We finally keep the center tile |
| 221 | */ |
| 222 | imageObj *tile3img = msImageCreate(width*3,height*3,img->format,NULL,NULL, |
| 223 | img->resolution, img->resolution, NULL); |
| 224 | int i,j; |
| 225 | rasterBufferObj tmpraster; |
| 226 | for(i=1;i<=3;i++) { |
| 227 | p_x = (i+0.5)*width; |
| 228 | for(j=1;j<=3;j++) { |
| 229 | p_y = (j+0.5) * height; |
| 230 | switch(symbol->type) { |
| 231 | case (MS_SYMBOL_TRUETYPE): |
| 232 | renderer->renderTruetypeSymbol(tile3img, p_x, p_y, symbol, s); |
| 233 | break; |
| 234 | case (MS_SYMBOL_PIXMAP): |
| 235 | if(msPreloadImageSymbol(renderer,symbol) != MS_SUCCESS) { |
| 236 | return NULL; //failed to load image, renderer should have set the error message |
| 237 | } |
| 238 | renderer->renderPixmapSymbol(tile3img, p_x, p_y, symbol, s); |
| 239 | break; |
| 240 | case (MS_SYMBOL_ELLIPSE): |
no test coverage detected