Advertisement
kalabukdima

AGG sandbox

Apr 1st, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. #include "draw.h"
  2. #include <agg2/agg_rendering_buffer.h>
  3. #include <agg2/agg_pixfmt_rgb.h>
  4. #include <agg2/agg_pixfmt_amask_adaptor.h>
  5. #include <agg2/agg_alpha_mask_u8.h>
  6. #include <agg2/agg_renderer_base.h>
  7. #include <agg2/agg_renderer_primitives.h>
  8. #include <agg2/agg_renderer_markers.h>
  9. #include <agg2/agg_scanline_u.h>
  10. #include <agg2/agg_renderer_scanline.h>
  11. #include <agg2/agg_rasterizer_scanline_aa.h>
  12. #include <agg2/agg_path_storage.h>
  13. #include <agg2/agg_conv_stroke.h>
  14. #include <agg2/agg_ellipse.h>
  15.  
  16. std::vector<uint8_t> getImage(int width, int height) {
  17.     std::vector<uint8_t> buf(width * height * 3, 255);
  18.     agg::rendering_buffer rbuf(buf.data(), width, height, width * 3);
  19.     agg::pixfmt_rgb24 pixf(rbuf);
  20.  
  21.     agg::rasterizer_scanline_aa<> rast;
  22.     agg::scanline_u8 scanline;
  23.  
  24.     std::vector<uint8_t> amask_buf(width * height);
  25.     agg::rendering_buffer amask_rbuf(amask_buf.data(), width, height, width);
  26.     agg::amask_no_clip_gray8 amask(amask_rbuf);
  27.     // agg::renderer_base<decltype(amask)> amask_ren(amask);
  28.  
  29.     // agg::ellipse ellipse(400, 400, 170, 130, 70);
  30.     // rast.add_path(ellipse);
  31.     // agg::render_scanlines_aa_solid(rast, scanline, amask_ren, 255);
  32.     // rast.reset();
  33.  
  34.     // alpha gradient
  35.     for (int i = 0; i < height; ++i) {
  36.         std::fill(amask_rbuf.row_ptr(i),
  37.                   amask_rbuf.row_ptr(i) + width,
  38.                   255 * i / height);
  39.     }
  40.  
  41.     // rainbow
  42.     std::vector<agg::rgba8> span;
  43.     span.reserve(width);
  44.     for (int i = 0; i < width; ++i) {
  45.         span.emplace_back(agg::rgba::from_wavelength(380. + 400. * i / width,
  46.                                                      0.9));
  47.     }
  48.  
  49.     std::fill(amask_rbuf.row_ptr(0),
  50.               amask_rbuf.row_ptr(0) + width, 255);
  51.  
  52.     using adaptor = agg::pixfmt_amask_adaptor<agg::pixfmt_rgb24,
  53.             agg::amask_no_clip_gray8>;
  54.     adaptor pixf_amask(pixf, amask);
  55.     for (int i = 0; i < height; ++i) {
  56.         // pixf_amask.blend_color_hspan(0, i, width, span.data(), nullptr, 255);
  57.         pixf_amask.copy_color_hspan(0, i, width, span.data());
  58.     }
  59.  
  60.  
  61.     agg::renderer_base<agg::pixfmt_rgb24> renderer(pixf);
  62.     // renderer.clip_box(100, 120, 200, 300);
  63.     // renderer.copy_bar(140, 120, 700, 500, agg::rgba8(255, 128, 0));
  64.  
  65.     agg::renderer_primitives<decltype(renderer)> ren_primitives(renderer);
  66.     ren_primitives.fill_color(agg::rgba8(0, 128, 0));
  67.     ren_primitives.line_color(agg::rgba8(0, 0, 0));
  68.     ren_primitives.line(ren_primitives.coord(100),
  69.                         ren_primitives.coord(120),
  70.                         ren_primitives.coord(200),
  71.                         ren_primitives.coord(200), true);
  72.  
  73.     agg::renderer_markers<decltype(renderer)> ren_markers(renderer);
  74.     ren_markers.line_color(agg::rgba8(0, 0, 0));
  75.     ren_markers.fill_color(agg::rgba8(0, 128, 0));
  76.     ren_markers.semiellipse_up(150, 150, 20);
  77.     ren_markers.circle(150, 150, 1);
  78.  
  79.  
  80.     rast.gamma(agg::gamma_none());
  81.     rast.reset();
  82.     rast.move_to_d(100, 250);
  83.     rast.line_to_d(200, 900);
  84.     rast.line_to_d(150, 250);
  85.     agg::render_scanlines_aa_solid(rast, scanline, renderer,
  86.                                    agg::rgba8(0, 0, 0, 255));
  87.  
  88.     agg::path_storage ps;
  89.     ps.remove_all();
  90.     ps.move_to(300, 128);
  91.     ps.line_to(350, 256);
  92.     ps.line_to(450, 200);
  93.     ps.arc_rel(40, 30, 0.5, false, true, 150, 100);
  94.  
  95.     agg::conv_stroke<agg::path_storage> pg(ps);
  96.     pg.line_join(agg::line_join_e::round_join);
  97.     pg.width(0.08);
  98.  
  99.     rast.reset();
  100.     rast.add_path(pg);
  101.     agg::render_scanlines_aa_solid(rast, scanline, renderer,
  102.                                    agg::rgba8(0, 0, 0, 255));
  103.  
  104.     ps.remove_all();
  105.     ps.move_to(500, 500);
  106.     ps.line_to(400, 450.2);
  107.     ps.line_to(400, 450);
  108.     ps.line_to(502, 497.5);
  109.     rast.add_path(ps);
  110.     agg::render_scanlines_aa_solid(rast, scanline, renderer,
  111.                                    agg::rgba8(0, 0, 0));
  112.  
  113.     // agg::ellipse ellipse(400, 400, 170, 130, 70);
  114.     // rast.add_path(ellipse);
  115.     // agg::render_scanlines_aa_solid(rast, scanline, renderer,
  116.     //                                agg::rgba8(0, 0, 0, 255));
  117.  
  118.     ren_markers.line_color(agg::rgba(0, 255, 0));
  119.     ren_markers.pixel(300, 128, 0);
  120.     ren_markers.pixel(350, 256, 0);
  121.  
  122.     return buf;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement