Esempio n. 1
0
 void add_path(T & path)
 {
     marker_placement_e placement_method = sym_.get_marker_placement();
     box2d<double> bbox_(0,0, src_.width(),src_.height());
     if (placement_method != MARKER_LINE_PLACEMENT)
     {
         double x = 0;
         double y = 0;
         if (placement_method == MARKER_INTERIOR_PLACEMENT)
         {
             if (!label::interior_position(path, x, y))
                 return;
         }
         else
         {
             if (!label::centroid(path, x, y))
                 return;
         }
         agg::trans_affine matrix = marker_trans_;
         matrix.translate(x,y);
         box2d<double> transformed_bbox = bbox_ * matrix;
         if (sym_.get_allow_overlap() ||
             detector_.has_placement(transformed_bbox))
         {
             render_raster_marker(matrix);
             if (!sym_.get_ignore_placement())
             {
                 detector_.insert(transformed_bbox);
             }
             if (!placed_)
             {
                 pixmap_.add_feature(feature_);
                 placed_ = true;
             }
         }
     }
     else
     {
         markers_placement<T, label_collision_detector4> placement(path, bbox_, marker_trans_, detector_,
                                                                   sym_.get_spacing() * scale_factor_,
                                                                   sym_.get_max_error(),
                                                                   sym_.get_allow_overlap());
         double x, y, angle;
         while (placement.get_point(x, y, angle))
         {
             agg::trans_affine matrix = marker_trans_;
             matrix.rotate(angle);
             matrix.translate(x, y);
             render_raster_marker(matrix);
             if (!placed_)
             {
                 pixmap_.add_feature(feature_);
                 placed_ = true;
             }
         }
     }
 }
Esempio n. 2
0
 void add_path(T & path)
 {
     agg::scanline_bin sl_;
     marker_placement_enum placement_method = get<marker_placement_enum>(sym_, keys::markers_placement_type, feature_, vars_, MARKER_POINT_PLACEMENT);
     bool ignore_placement = get<bool>(sym_, keys::ignore_placement, feature_, vars_, false);
     bool allow_overlap = get<bool>(sym_, keys::allow_overlap, feature_, vars_, false);
     box2d<double> bbox(0,0, src_.width(), src_.height());
     double spacing = get<double>(sym_, keys::spacing, feature_, vars_, 100.0);
     double max_error = get<double>(sym_, keys::max_error, feature_, vars_, 0.2);
     markers_placement_params params { bbox, marker_trans_, spacing * scale_factor_, max_error, allow_overlap };
     markers_placement_finder<T, label_collision_detector4> placement_finder(
         placement_method, path, detector_, params);
     double x, y, angle = .0;
     while (placement_finder.get_point(x, y, angle, ignore_placement))
     {
         agg::trans_affine matrix = marker_trans_;
         matrix.rotate(angle);
         matrix.translate(x, y);
         render_raster_marker(matrix);
         if (!placed_)
         {
             pixmap_.add_feature(feature_);
             placed_ = true;
         }
     }
 }
 virtual void render_marker(image_rgba8 const& src,
                            markers_dispatch_params const& params,
                            agg::trans_affine const& marker_tr)
 {
     // In the long term this should be a visitor pattern based on the type of
     // render src provided that converts the destination pixel type required.
     render_raster_marker(renb_, ras_, src, marker_tr, params.opacity,
                          params.scale_factor, params.snap_to_pixels);
 }
 void render_marker(agg::trans_affine const& marker_tr, double opacity)
 {
     render_raster_marker(RendererType(renb_), ras_, this->src_, this->feature_, marker_tr, opacity);
     if (!placed_)
     {
         pixmap_.add_feature(this->feature_);
         placed_ = true;
     }
 }
 void render_marker(agg::trans_affine const& marker_tr, double opacity)
 {
     // In the long term this should be a visitor pattern based on the type of render this->src_ provided that converts
     // the destination pixel type required.
     render_raster_marker(RendererType(renb_), ras_, this->src_, this->feature_, marker_tr, opacity);
     if (!placed_)
     {
         pixmap_.add_feature(this->feature_);
         placed_ = true;
     }
 }
Esempio n. 6
0
 virtual void operator()(raster_marker_render_thunk const& thunk)
 {
     using buf_type = grid_rendering_buffer;
     using pixfmt_type = typename grid_renderer_base_type::pixfmt_type;
     using renderer_type = agg::renderer_scanline_bin_solid<grid_renderer_base_type>;
     buf_type render_buf(pixmap_.raw_data(), common_.width_, common_.height_, common_.width_);
     ras_.reset();
     pixfmt_type pixf(render_buf);
     grid_renderer_base_type renb(pixf);
     renderer_type ren(renb);
     agg::trans_affine offset_tr = thunk.tr_;
     offset_tr.translate(offset_.x, offset_.y);
     render_raster_marker(ren, ras_, thunk.src_, feature_, offset_tr, thunk.opacity_);
     pixmap_.add_feature(feature_);
 }
    virtual void operator()(raster_marker_render_thunk const& thunk)
    {
        using blender_type = agg::comp_op_adaptor_rgba_pre<agg::rgba8, agg::order_rgba>; // comp blender
        using buf_type = agg::rendering_buffer;
        using pixfmt_comp_type = agg::pixfmt_custom_blend_rgba<blender_type, buf_type>;
        using renderer_base = agg::renderer_base<pixfmt_comp_type>;

        ras_ptr_->reset();
        buf_type render_buffer(buf_->bytes(), buf_->width(), buf_->height(), buf_->row_size());
        pixfmt_comp_type pixf(render_buffer);
        pixf.comp_op(static_cast<agg::comp_op_e>(thunk.comp_op_));
        renderer_base renb(pixf);

        agg::trans_affine offset_tr = thunk.tr_;
        offset_tr.translate(offset_.x, offset_.y);
        render_raster_marker(renb, *ras_ptr_, thunk.src_, offset_tr, thunk.opacity_, common_.scale_factor_, thunk.snap_to_pixels_);
    }