| 457 | } |
| 458 | |
| 459 | int agg2RenderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj * style) { |
| 460 | AGG2Renderer *r = AGG_RENDERER(img); |
| 461 | pixel_format pf; |
| 462 | rendering_buffer b; |
| 463 | rasterBufferObj *pixmap = symbol->pixmap_buffer; |
| 464 | assert(pixmap->type == MS_BUFFER_BYTE_RGBA); |
| 465 | if(!symbol->renderer_cache) { |
| 466 | band_type *data = (band_type*)msSmallMalloc(pixmap->width*pixmap->height*4*sizeof(band_type)); |
| 467 | for(unsigned int row=0; row<pixmap->height;row++) { |
| 468 | unsigned char *a = pixmap->data.rgba.a + row * pixmap->data.rgba.row_step; |
| 469 | unsigned char *r = pixmap->data.rgba.r + row * pixmap->data.rgba.row_step; |
| 470 | unsigned char *g = pixmap->data.rgba.g + row * pixmap->data.rgba.row_step; |
| 471 | unsigned char *b = pixmap->data.rgba.b + row * pixmap->data.rgba.row_step; |
| 472 | band_type* pixptr = data + row * pixmap->width * 4; |
| 473 | for(unsigned int col=0;col<pixmap->width;col++) { |
| 474 | pixptr[band_order::A] = *a; |
| 475 | pixptr[band_order::G] = *g; |
| 476 | pixptr[band_order::B] = *b; |
| 477 | pixptr[band_order::R] = *r; |
| 478 | pixptr+=4; |
| 479 | a += pixmap->data.rgba.pixel_step; |
| 480 | r += pixmap->data.rgba.pixel_step; |
| 481 | g += pixmap->data.rgba.pixel_step; |
| 482 | b += pixmap->data.rgba.pixel_step; |
| 483 | } |
| 484 | } |
| 485 | //memcpy(data,pixmap->data.rgba.pixels,pixmap->width*pixmap->height*4); |
| 486 | rendering_buffer *b = new rendering_buffer(data, pixmap->width, pixmap->height, (int)pixmap->width*4); |
| 487 | symbol->renderer_cache = (void*)b; |
| 488 | pf.attach(*b); |
| 489 | pf.premultiply(); |
| 490 | } else { |
| 491 | rendering_buffer *b = (rendering_buffer*)symbol->renderer_cache; |
| 492 | pf.attach(*b); |
| 493 | } |
| 494 | |
| 495 | r->m_rasterizer_aa.reset(); |
| 496 | r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); |
| 497 | if( (style->rotation != 0 && style->rotation != MS_PI*2.)|| style->scale != 1) { |
| 498 | mapserver::trans_affine image_mtx; |
| 499 | image_mtx *= mapserver::trans_affine_translation(-(pf.width()/2.),-(pf.height()/2.)); |
| 500 | /*agg angles are antitrigonometric*/ |
| 501 | image_mtx *= mapserver::trans_affine_rotation(-style->rotation); |
| 502 | image_mtx *= mapserver::trans_affine_scaling(style->scale); |
| 503 | |
| 504 | |
| 505 | |
| 506 | image_mtx *= mapserver::trans_affine_translation(x,y); |
| 507 | image_mtx.invert(); |
| 508 | typedef mapserver::span_interpolator_linear<> interpolator_type; |
| 509 | interpolator_type interpolator(image_mtx); |
| 510 | mapserver::span_allocator<color_type> sa; |
| 511 | |
| 512 | // "hardcoded" bilinear filter |
| 513 | //------------------------------------------ |
| 514 | typedef mapserver::span_image_filter_rgba_bilinear_clip<pixel_format, interpolator_type> span_gen_type; |
| 515 | span_gen_type sg(pf, mapserver::rgba(0,0,0,0), interpolator); |
| 516 | mapserver::path_storage pixmap_bbox; |
nothing calls this directly
no test coverage detected