virtual void on_draw() { if(m_gamma.value() != m_old_gamma) { m_gamma_lut.gamma(m_gamma.value()); load_img(0, "spheres"); pixfmt pixf(rbuf_img(0)); pixf.apply_gamma_dir(m_gamma_lut); m_old_gamma = m_gamma.value(); } pixfmt pixf(rbuf_window()); pixfmt_pre pixf_pre(rbuf_window()); renderer_base rb(pixf); renderer_base_pre rb_pre(pixf_pre); renderer_solid r(rb); rb.clear(agg::rgba(1, 1, 1)); if(m_trans_type.cur_item() < 2) { // For the affine parallelogram transformations we // calculate the 4-th (implicit) point of the parallelogram m_quad.xn(3) = m_quad.xn(0) + (m_quad.xn(2) - m_quad.xn(1)); m_quad.yn(3) = m_quad.yn(0) + (m_quad.yn(2) - m_quad.yn(1)); } //-------------------------- // Render the "quad" tool and controls g_rasterizer.add_path(m_quad); r.color(agg::rgba(0, 0.3, 0.5, 0.1)); agg::render_scanlines(g_rasterizer, g_scanline, r); // Prepare the polygon to rasterize. Here we need to fill // the destination (transformed) polygon. g_rasterizer.clip_box(0, 0, width(), height()); g_rasterizer.reset(); int b = 0; g_rasterizer.move_to_d(m_quad.xn(0)-b, m_quad.yn(0)-b); g_rasterizer.line_to_d(m_quad.xn(1)+b, m_quad.yn(1)-b); g_rasterizer.line_to_d(m_quad.xn(2)+b, m_quad.yn(2)+b); g_rasterizer.line_to_d(m_quad.xn(3)-b, m_quad.yn(3)+b); typedef agg::span_allocator<color_type> span_alloc_type; span_alloc_type sa; agg::image_filter_bilinear filter_kernel; agg::image_filter_lut filter(filter_kernel, true); pixfmt pixf_img(rbuf_img(0)); typedef agg::image_accessor_clone<pixfmt> source_type; source_type source(pixf_img); start_timer(); switch(m_trans_type.cur_item()) { case 0: { agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type; interpolator_type interpolator(tr); typedef image_filter_2x2_type<source_type, interpolator_type> span_gen_type; span_gen_type sg(source, interpolator, filter); agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg); break; } case 1: { agg::trans_affine tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); typedef agg::span_interpolator_linear<agg::trans_affine> interpolator_type; typedef image_resample_affine_type<source_type> span_gen_type; interpolator_type interpolator(tr); span_gen_type sg(source, interpolator, filter); sg.blur(m_blur.value()); agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg); break; } case 2: { agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); if(tr.is_valid()) { typedef agg::span_interpolator_linear_subdiv<agg::trans_perspective> interpolator_type; interpolator_type interpolator(tr); typedef image_filter_2x2_type<source_type, interpolator_type> span_gen_type; span_gen_type sg(source, interpolator, filter); agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg); } break; } case 3: { agg::trans_perspective tr(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); if(tr.is_valid()) { typedef agg::span_interpolator_trans<agg::trans_perspective> interpolator_type; interpolator_type interpolator(tr); typedef image_filter_2x2_type<source_type, interpolator_type> span_gen_type; span_gen_type sg(source, interpolator, filter); agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg); } break; } case 4: { typedef agg::span_interpolator_persp_lerp<> interpolator_type; typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type; interpolator_type interpolator(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); subdiv_adaptor_type subdiv_adaptor(interpolator); if(interpolator.is_valid()) { typedef image_resample_type<source_type, subdiv_adaptor_type> span_gen_type; span_gen_type sg(source, subdiv_adaptor, filter); sg.blur(m_blur.value()); agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg); } break; } case 5: { typedef agg::span_interpolator_persp_exact<> interpolator_type; typedef agg::span_subdiv_adaptor<interpolator_type> subdiv_adaptor_type; interpolator_type interpolator(m_quad.polygon(), g_x1, g_y1, g_x2, g_y2); subdiv_adaptor_type subdiv_adaptor(interpolator); if(interpolator.is_valid()) { typedef image_resample_type<source_type, subdiv_adaptor_type> span_gen_type; span_gen_type sg(source, subdiv_adaptor, filter); sg.blur(m_blur.value()); agg::render_scanlines_aa(g_rasterizer, g_scanline, rb_pre, sa, sg); } break; } } double tm = elapsed_time(); pixf.apply_gamma_inv(m_gamma_lut); char buf[64]; agg::gsv_text t; t.size(10.0); agg::conv_stroke<agg::gsv_text> pt(t); pt.width(1.5); sprintf(buf, "%3.2f ms", tm); t.start_point(10.0, 70.0); t.text(buf); g_rasterizer.add_path(pt); r.color(agg::rgba(0,0,0)); agg::render_scanlines(g_rasterizer, g_scanline, r); //-------------------------- agg::render_ctrl(g_rasterizer, g_scanline, rb, m_trans_type); agg::render_ctrl(g_rasterizer, g_scanline, rb, m_gamma); agg::render_ctrl(g_rasterizer, g_scanline, rb, m_blur); }
//------------------------------------------------------------------------ virtual void on_draw() { typedef agg::renderer_base<pixfmt> renderer_base; typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid; pixfmt pixf(rbuf_window()); pixfmt pixf_img(rbuf_img(0)); renderer_base rb(pixf); renderer_solid rs(rb); rb.clear(agg::rgba(1.0, 1.0, 1.0)); agg::trans_affine image_mtx; agg::trans_affine polygon_mtx; polygon_mtx *= agg::trans_affine_translation(-m_polygon_cx, -m_polygon_cy); polygon_mtx *= agg::trans_affine_rotation(m_polygon_angle.value() * agg::pi / 180.0); polygon_mtx *= agg::trans_affine_scaling(m_polygon_scale.value()); polygon_mtx *= agg::trans_affine_translation(m_polygon_cx, m_polygon_cy); switch (m_example.cur_item()) { default: case 0: // --------------(Example 0, Identity matrix) break; case 1: // --------------(Example 1) image_mtx *= agg::trans_affine_translation(-m_image_center_x, -m_image_center_y); image_mtx *= agg::trans_affine_rotation(m_polygon_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_scaling(m_polygon_scale.value()); image_mtx *= agg::trans_affine_translation(m_polygon_cx, m_polygon_cy); image_mtx.invert(); break; case 2: // --------------(Example 2) image_mtx *= agg::trans_affine_translation(-m_image_center_x, -m_image_center_y); image_mtx *= agg::trans_affine_rotation(m_image_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_scaling(m_image_scale.value()); image_mtx *= agg::trans_affine_translation(m_image_cx, m_image_cy); image_mtx.invert(); break; case 3: // --------------(Example 3) image_mtx *= agg::trans_affine_translation(-m_image_center_x, -m_image_center_y); image_mtx *= agg::trans_affine_rotation(m_image_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_scaling(m_image_scale.value()); image_mtx *= agg::trans_affine_translation(m_polygon_cx, m_polygon_cy); image_mtx.invert(); break; case 4: // --------------(Example 4) image_mtx *= agg::trans_affine_translation(-m_image_cx, -m_image_cy); image_mtx *= agg::trans_affine_rotation(m_polygon_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_scaling(m_polygon_scale.value()); image_mtx *= agg::trans_affine_translation(m_polygon_cx, m_polygon_cy); image_mtx.invert(); break; case 5: // --------------(Example 5) image_mtx *= agg::trans_affine_translation(-m_image_center_x, -m_image_center_y); image_mtx *= agg::trans_affine_rotation(m_image_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_rotation(m_polygon_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_scaling(m_image_scale.value()); image_mtx *= agg::trans_affine_scaling(m_polygon_scale.value()); image_mtx *= agg::trans_affine_translation(m_image_cx, m_image_cy); image_mtx.invert(); break; case 6: // --------------(Example 6) image_mtx *= agg::trans_affine_translation(-m_image_cx, -m_image_cy); image_mtx *= agg::trans_affine_rotation(m_image_angle.value() * agg::pi / 180.0); image_mtx *= agg::trans_affine_scaling(m_image_scale.value()); image_mtx *= agg::trans_affine_translation(m_image_cx, m_image_cy); image_mtx.invert(); break; } typedef agg::span_interpolator_linear<> interpolator_type; interpolator_type interpolator(image_mtx); agg::span_allocator<color_type> sa; // "hardcoded" bilinear filter //------------------------------------------ typedef agg::span_image_filter_rgba_bilinear_clip<pixfmt, interpolator_type> span_gen_type; span_gen_type sg(pixf_img, agg::rgba(1, 1, 1), interpolator); //------------------------------------------ agg::rasterizer_scanline_aa<> ras; agg::scanline_u8 sl; agg::path_storage ps; create_star(ps); agg::conv_transform<agg::path_storage> tr(ps, polygon_mtx); ras.add_path(tr); agg::render_scanlines_aa(ras, sl, rb, sa, sg); agg::ellipse e1(m_image_cx, m_image_cy, 5, 5, 20); agg::ellipse e2(m_image_cx, m_image_cy, 2, 2, 20); agg::conv_stroke<agg::ellipse> c1(e1); rs.color(agg::rgba(0.7, 0.8, 0)); ras.add_path(e1); agg::render_scanlines(ras, sl, rs); rs.color(agg::rgba(0, 0, 0)); ras.add_path(c1); agg::render_scanlines(ras, sl, rs); ras.add_path(e2); agg::render_scanlines(ras, sl, rs); agg::render_ctrl(ras, sl, rb, m_polygon_angle); agg::render_ctrl(ras, sl, rb, m_polygon_scale); agg::render_ctrl(ras, sl, rb, m_image_angle); agg::render_ctrl(ras, sl, rb, m_image_scale); agg::render_ctrl(ras, sl, rb, m_rotate_polygon); agg::render_ctrl(ras, sl, rb, m_rotate_image); agg::render_ctrl(ras, sl, rb, m_example); }