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; } } } }
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; } }
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_); }