void perform_rendering(Scanline &sl, Ras &ras, Ren &ren, Clp &clp) { if(m_operation.cur_item() > 0) { ras.reset(); switch(m_operation.cur_item()) { case 1: clp.operation(agg::clipper_or); break; case 2: clp.operation(agg::clipper_and); break; case 3: clp.operation(agg::clipper_xor); break; case 4: clp.operation(agg::clipper_a_minus_b); break; case 5: clp.operation(agg::clipper_b_minus_a); break; } agg::conv_poly_counter<Clp> counter(clp); start_timer(); counter.rewind(0); double t1 = elapsed_time(); ras.reset(); double x; double y; unsigned cmd; start_timer(); while(!agg::is_stop(cmd = counter.vertex(&x, &y))) { ras.add_vertex(x, y, cmd); } ren.color(agg::rgba(0.5, 0.0, 0, 0.5)); agg::render_scanlines(ras, sl, ren); double t2 = elapsed_time(); char buf[100]; sprintf_s(buf, "Contours: %d Points: %d", counter.m_contours, counter.m_points); agg::gsv_text txt; agg::conv_stroke<agg::gsv_text> txt_stroke(txt); txt_stroke.width(1.5); txt_stroke.line_cap(agg::round_cap); txt.size(10.0); txt.start_point(250, 5); txt.text(buf); ras.add_path(txt_stroke); ren.color(agg::rgba(0.0, 0.0, 0.0)); agg::render_scanlines(ras, sl, ren); sprintf_s(buf, "Clipper=%.3fms Render=%.3fms", t1, t2); txt.start_point(250, 20); txt.text(buf); ras.add_path(txt_stroke); ren.color(agg::rgba(0.0, 0.0, 0.0)); agg::render_scanlines(ras, sl, ren); } }
void draw_text(double x, double y, const char* str) { pixfmt_type pf(rbuf_window()); agg::renderer_base<pixfmt_type> rb(pf); agg::renderer_scanline_aa_solid<agg::renderer_base<pixfmt_type> > ren(rb); agg::gsv_text txt; agg::conv_stroke<agg::gsv_text> txt_stroke(txt); txt_stroke.width(1.5); txt_stroke.line_cap(agg::round_cap); txt.size(10.0); txt.start_point(x, y); txt.text(str); m_ras.add_path(txt_stroke); ren.color(agg::rgba(0.0, 0.0, 0.0)); agg::render_scanlines(m_ras, m_sl, ren); }
void render_scanline_boolean(Rasterizer& ras1, Rasterizer& ras2) { if(m_operation.cur_item() > 0) { agg::sbool_op_e op; switch(m_operation.cur_item()) { case 1: op = agg::sbool_or; break; case 2: op = agg::sbool_and; break; case 3: op = agg::sbool_xor; break; case 4: op = agg::sbool_xor_saddle;break; case 5: op = agg::sbool_a_minus_b; break; case 6: op = agg::sbool_b_minus_a; break; } typedef agg::renderer_base<pixfmt> renderer_base; pixfmt pixf(rbuf_window()); renderer_base rb(pixf); double t1 = 0.0; double t2 = 0.0; unsigned num_spans = 0; switch(m_scanline_type.cur_item()) { case 0: { typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid; typedef agg::scanline_p8 scanline_type; renderer_solid ren(rb); scanline_type sl; scanline_type sl1; scanline_type sl2; // The intermediate storage is used only to test the perfoprmance, // the short variant can be as follows: // ------------------------ // ren.color(agg::rgba(0.5, 0.0, 0, 0.5)); // agg::sbool_combine_shapes_aa(op, ras1, ras2, sl1, sl2, sl, ren); agg::scanline_storage_aa8 storage; agg::scanline_storage_aa8 storage1; agg::scanline_storage_aa8 storage2; agg::render_scanlines(ras1, sl, storage1); agg::render_scanlines(ras2, sl, storage2); start_timer(); for(int i = 0; i < 10; i++) { agg::sbool_combine_shapes_aa(op, storage1, storage2, sl1, sl2, sl, storage); } t1 = elapsed_time() / 10.0; start_timer(); ren.color(agg::rgba(0.5, 0.0, 0, 0.5)); agg::render_scanlines(storage, sl, ren); t2 = elapsed_time(); num_spans = count_spans(storage, sl); } break; case 1: { typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid; typedef agg::scanline_u8 scanline_type; renderer_solid ren(rb); scanline_type sl; scanline_type sl1; scanline_type sl2; agg::scanline_storage_aa8 storage; agg::scanline_storage_aa8 storage1; agg::scanline_storage_aa8 storage2; agg::render_scanlines(ras1, sl, storage1); agg::render_scanlines(ras2, sl, storage2); start_timer(); for(int i = 0; i < 10; i++) { agg::sbool_combine_shapes_aa(op, storage1, storage2, sl1, sl2, sl, storage); } t1 = elapsed_time() / 10.0; start_timer(); ren.color(agg::rgba(0.5, 0.0, 0, 0.5)); agg::render_scanlines(storage, sl, ren); t2 = elapsed_time(); num_spans = count_spans(storage, sl); } break; case 2: { typedef agg::renderer_scanline_bin_solid<renderer_base> renderer_solid; typedef agg::scanline_bin scanline_type; renderer_solid ren(rb); scanline_type sl; scanline_type sl1; scanline_type sl2; agg::scanline_storage_bin storage; agg::scanline_storage_bin storage1; agg::scanline_storage_bin storage2; agg::render_scanlines(ras1, sl, storage1); agg::render_scanlines(ras2, sl, storage2); start_timer(); for(int i = 0; i < 10; i++) { agg::sbool_combine_shapes_bin(op, storage1, storage2, sl1, sl2, sl, storage); } t1 = elapsed_time() / 10.0; start_timer(); ren.color(agg::rgba(0.5, 0.0, 0, 0.5)); agg::render_scanlines(storage, sl, ren); t2 = elapsed_time(); num_spans = count_spans(storage, sl); } break; } char buf[100]; sprintf(buf, "Combine=%.3fms\n\nRender=%.3fms\n\nnum_spans=%d", t1, t2, num_spans); agg::renderer_scanline_aa_solid<renderer_base> ren(rb); agg::scanline_p8 sl; agg::gsv_text txt; agg::conv_stroke<agg::gsv_text> txt_stroke(txt); txt_stroke.width(1.0); txt_stroke.line_cap(agg::round_cap); txt.size(8.0); txt.start_point(420, 40); txt.text(buf); ras1.add_path(txt_stroke); ren.color(agg::rgba(0.0, 0.0, 0.0)); agg::render_scanlines(ras1, sl, ren); } }