MCPcopy Create free account
hub / github.com/MapServer/MapServer / agg2RenderPixmapSymbol

Function agg2RenderPixmapSymbol

mapagg.cpp:459–533  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

457}
458
459int 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;

Callers

nothing calls this directly

Calls 15

msSmallMallocFunction · 0.85
rgbaClass · 0.85
MS_NINTFunction · 0.85
render_scanlines_aaFunction · 0.85
invertMethod · 0.80
attachMethod · 0.45
premultiplyMethod · 0.45
resetMethod · 0.45
filling_ruleMethod · 0.45

Tested by

no test coverage detected