Agg图形库学习笔记-实现任意方向圆角渐变矩形

 直接贴代码了....

 

View Code
  1 #include <stdio.h>
  2 #include "agg_basics.h"
  3 #include "agg_rendering_buffer.h"
  4 #include "agg_rasterizer_scanline_aa.h"
  5 #include "agg_scanline_u.h"
  6 #include "agg_renderer_scanline.h"
  7 #include "agg_pixfmt_rgb.h"
  8 #include "agg_gamma_lut.h"
  9 #include "agg_conv_dash.h"
 10 #include "agg_conv_stroke.h"
 11 #include "agg_span_gradient.h"
 12 #include "agg_span_interpolator_linear.h"
 13 #include "agg_span_gouraud_rgba.h"
 14 #include "agg_span_allocator.h"
 15 #include "agg_platform_support.h"
 16 #include "agg_slider_ctrl.h"
 17 #include "agg_cbox_ctrl.h"
 18 #include "agg_rounded_rect.h"
 19 
 20 enum flip_y_e { flip_y = true };
 21 
 22 
 23 typedef agg::gamma_lut<agg::int8u, agg::int8u, 8, 8>        gamma_lut_type;
 24 typedef agg::pixfmt_bgr24                                    pixfmt_type;
 25 typedef pixfmt_type::color_type                             color_type;
 26 typedef agg::renderer_base<pixfmt_type>                     renderer_base_type;
 27 typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderer_scanline_type;
 28 typedef agg::scanline_u8                                    scanline_type;
 29 typedef agg::rasterizer_scanline_aa<>                       rasterizer_type;
 30 
 31 
 32 // A simple function to form the gradient color array 
 33 // consisting of 3 colors, "begin", "middle", "end"
 34 //---------------------------------------------------
 35 template<class ColorArrayT>
 36 void fill_color_array(ColorArrayT& array, 
 37                       color_type begin, 
 38                       color_type end)
 39 {
 40     unsigned i;
 41     for(i = 0; i < 256; ++i)
 42     {
 43         array[i] = begin.gradient(end, i / 255.0);
 44     }
 45 }
 46 
 47 
 48 class the_application : public agg::platform_support
 49 {
 50     double m_x[2];
 51     double m_y[2];
 52     double m_dx;
 53     double m_dy;
 54     int    m_idx;
 55 
 56     
 57 
 58     agg::slider_ctrl<agg::rgba8> m_radius;//圆角半径
 59     agg::slider_ctrl<agg::rgba8> m_offset;//偏移量
 60 
 61     agg::slider_ctrl<agg::rgba8> gradientx;//x方向渐变程度
 62     agg::slider_ctrl<agg::rgba8> gradienty;//y方向渐变程度
 63 
 64     agg::slider_ctrl<agg::rgba8> leftr;//左边起始点红色分量
 65     agg::slider_ctrl<agg::rgba8> leftg;//左边起始点绿色分量
 66     agg::slider_ctrl<agg::rgba8> leftb;//左边起始点蓝色分量
 67 
 68     agg::slider_ctrl<agg::rgba8> rightr;//右边起始点红色分量
 69     agg::slider_ctrl<agg::rgba8> rightg;//右边起始点绿色分量
 70     agg::slider_ctrl<agg::rgba8> rightb;//右边起始点蓝色分量
 71 public:
 72     the_application(agg::pix_format_e format, bool flip_y) :
 73         agg::platform_support(format, flip_y),
 74         m_idx(-1),
 75         m_radius(10, 10, 300-10,   19,    !flip_y),
 76         m_offset(10, 10+20, 300-10, 19+20, !flip_y),
 77         gradientx(300, 10, 600-10, 19, !flip_y),
 78         gradienty(300, 10+20, 600-10, 19+20, !flip_y),
 79         leftr(10, 10+40, 300-10, 19+40, !flip_y),
 80         leftg(10, 10+60, 300-10, 19+60, !flip_y),
 81         leftb(10, 10+80, 300-10, 19+80, !flip_y),
 82         rightr(300, 10+40, 600-10, 19+40, !flip_y),
 83         rightg(300, 10+60, 600-10, 19+60, !flip_y),
 84         rightb(300, 10+80, 600-10, 19+80, !flip_y)
 85     {
 86         m_x[0] = 100;   m_y[0] = 200;
 87         m_x[1] = 500;   m_y[1] = 550;
 88         add_ctrl(m_radius);
 89         add_ctrl(m_offset);
 90 
 91         add_ctrl(gradientx);
 92         add_ctrl(gradienty);
 93 
 94         add_ctrl(leftr);
 95         add_ctrl(leftg);
 96         add_ctrl(leftb);
 97 
 98         add_ctrl(rightr);
 99         add_ctrl(rightg);
100         add_ctrl(rightb);
101 
102         {
103             gradientx.label("x=%4.3f");
104             gradientx.range(-1.0, 1.0);
105             gradientx.value(0.5);
106 
107             gradienty.label("y=%4.3f");
108             gradienty.range(-1.0, 1.0);
109             gradienty.value(0.5);
110         }
111         {
112             leftr.label("lr=%4.3f");
113             leftr.range(0.0, 1.0);
114             leftr.value(0.5);
115 
116             leftg.label("lg=%4.3f");
117             leftg.range(0.0, 1.0);
118             leftg.value(0.5);
119 
120             leftb.label("lb=%4.3f");
121             leftb.range(0.0, 1.0);
122             leftb.value(0.5);
123         }
124         {
125             rightr.label("lr=%4.3f");
126             rightr.range(0.0, 1.0);
127             rightr.value(0.5);
128 
129             rightg.label("lg=%4.3f");
130             rightg.range(0.0, 1.0);
131             rightg.value(0.5);
132 
133             rightb.label("lb=%4.3f");
134             rightb.range(0.0, 1.0);
135             rightb.value(0.5);
136         }
137         m_radius.label("radius=%4.3f");
138         m_radius.range(0.0, 50.0);
139         m_radius.value(25.0);
140 
141         m_offset.label("subpixel offset=%4.3f");
142         m_offset.range(-2.0, 3.0);
143     }
144 
145 
146     virtual ~the_application()
147     {
148     }
149 
150 
151     virtual void on_init()
152     {
153     }
154 
155 
156     virtual void on_draw()
157     {
158         pixfmt_type pixf(rbuf_window());
159         renderer_base_type ren_base(pixf);
160         renderer_scanline_type ren_sl(ren_base);
161         scanline_type sl;
162         rasterizer_type ras;
163 
164         ren_base.clear(agg::rgba(0,0,0));
165 
166         {
167 
168             agg::renderer_scanline_aa_solid<renderer_base_type>ren(ren_base);
169             ren.color(agg::rgba8(127,127,127));
170 
171             agg::ellipse e;
172             // Render two "control" circles
173             e.init(m_x[0], m_y[0], 3, 3, 16);
174             ras.add_path(e);
175             //agg::render_scanlines_aa_solid(ras, sl, ren_base, agg::rgba8(127, 127, 127));
176             agg::render_scanlines(ras, sl, ren);
177             e.init(m_x[1], m_y[1], 3, 3, 16);
178             ras.add_path(e);
179             //agg::render_scanlines_aa_solid(ras, sl, ren_base, agg::rgba8(127, 127, 127));
180             agg::render_scanlines(ras, sl, ren);
181 
182             
183         }
184         double d = m_offset.value();
185 
186         typedef agg::gradient_x gradient_func_type;
187         typedef agg::span_interpolator_linear<> interpolator_type;
188         typedef agg::span_allocator<color_type> span_allocator_type;
189         typedef agg::pod_auto_array<color_type, 256> color_array_type;
190         typedef agg::span_gradient<color_type, 
191                                    interpolator_type, 
192                                    gradient_func_type, 
193                                    color_array_type> span_gradient_type;
194 
195         typedef agg::renderer_scanline_aa<renderer_base_type, 
196                                           span_allocator_type,
197                                           span_gradient_type> renderer_gradient_type;
198 
199         gradient_func_type  gradient_func;                   // The gradient function
200         agg::trans_affine   gradient_mtx;                    // Affine transformer
201         interpolator_type   span_interpolator(gradient_mtx); // Span interpolator
202         span_allocator_type span_allocator;                  // Span Allocator
203         color_array_type    gradient_colors;                 // The gradient colors
204         span_gradient_type  span_gradient(span_interpolator, 
205                                           gradient_func, 
206                                           gradient_colors, 
207                                           0, 100);
208 
209         renderer_gradient_type ren_gradient(ren_base, span_allocator, span_gradient);
210 
211         double x1=m_x[0]+d, y1=m_y[0]+d, x2=m_x[1]+d, y2=m_y[1]+d;
212 
213         {
214             //----------------
215             fill_color_array(gradient_colors, 
216                             agg::rgba(leftr.value(),leftg.value(),leftb.value()), 
217                             agg::rgba(rightr.value(),rightg.value(),rightb.value()));
218 
219             {
220                 double gradient_d2 = 100.0;
221                 double dx = (x2 - x1)*gradientx.value();
222                 double dy = (y2 - y1)*gradienty.value();
223                 gradient_mtx.reset();
224                 gradient_mtx *= agg::trans_affine_scaling(sqrt(dx * dx + dy * dy) / gradient_d2);
225                 gradient_mtx *= agg::trans_affine_rotation(atan2(dy, dx));
226                 gradient_mtx *= agg::trans_affine_translation(x1 + 0.5, y1 + 0.5);
227                 gradient_mtx.invert();
228             }
229             agg::rounded_rect r(x1, y1, x2, y2, m_radius.value());
230             r.normalize_radius();
231             ras.add_path(r);
232             agg::render_scanlines(ras, sl, ren_gradient);
233         }
234         // Reset AA Gamma and render the controls
235         // Render the controls
236         
237         agg::render_ctrl(ras, sl, ren_base, m_radius);
238         agg::render_ctrl(ras, sl, ren_base, m_offset);
239 
240         agg::render_ctrl(ras, sl, ren_base, gradientx);
241         agg::render_ctrl(ras, sl, ren_base, gradienty);
242 
243         agg::render_ctrl(ras, sl, ren_base, leftr);
244         agg::render_ctrl(ras, sl, ren_base, leftg);
245         agg::render_ctrl(ras, sl, ren_base, leftb);
246 
247         agg::render_ctrl(ras, sl, ren_base, rightr);
248         agg::render_ctrl(ras, sl, ren_base, rightb);
249         agg::render_ctrl(ras, sl, ren_base, rightg);
250     }
251 
252 
253 
254     virtual void on_mouse_button_down(int x, int y, unsigned flags)
255     {
256         if(flags & agg::mouse_left)
257         {
258             unsigned i;
259             for (i = 0; i < 2; i++)
260             {
261                 if(sqrt( (x-m_x[i]) * (x-m_x[i]) + (y-m_y[i]) * (y-m_y[i]) ) < 5.0)
262                 {
263                     m_dx = x - m_x[i];
264                     m_dy = y - m_y[i];
265                     m_idx = i;
266                     break;
267                 }
268             }
269         }
270         //update_window();
271     }
272 
273 
274 
275 
276     virtual void on_mouse_move(int x, int y, unsigned flags)
277     {
278         if(flags & agg::mouse_left)
279         {
280             if(m_idx >= 0)
281             {
282                 m_x[m_idx] = x - m_dx;
283                 m_y[m_idx] = y - m_dy;
284                 force_redraw();
285             }
286         }
287         else
288         {
289             on_mouse_button_up(x, y, flags);
290         }
291     }
292 
293     virtual void on_mouse_button_up(int x, int y, unsigned flags)
294     {
295         m_idx = -1;
296     }
297 };
298 
299 
300 int agg_main(int argc, char* argv[])
301 {
302     the_application app(agg::pix_format_bgr24, flip_y);
303     app.caption("AGG Example. Anti-Aliasing Test");
304 
305     if(app.init(600, 600, agg::window_resize))
306     {
307         return app.run();
308     }
309     return 1;
310 }

 最终效果

 怎么上传源码呢?有谁告诉我么?

 

 欢迎与一起学习agg的朋友共同交流哈,网上资料不多

转载于:https://www.cnblogs.com/zhouchanwen/archive/2012/08/01/2619172.html

AGG 2D图形库:纯CPU抗锯齿渲染管线与嵌入式实战 在嵌入式与资源受限环境中,纯CPU实现高质量2D矢量渲染是常见需求。其核心原理基于扫描线光栅化与亚像素覆盖率计算,通过精确的几何覆盖率而非后期模糊实现抗锯齿,从而在无GPU条件下获得平滑边缘与准确半透明混合。这种技术方案在仪表盘、实时波形显示等场景中具有显著价值,尤其适合对渲染质量与依赖轻量性要求严苛的场合。AGG作为该领域的经典C++模板库,以无外部依赖和极高抗锯齿质量著称,其渲染管线设计对理解现代2D图形架构仍有重要参考意义。 阅读详情

相关推荐

高性能开源2D图形库agg-2.5完整解析与实战

Anti-Grain Geometry(AGG)是一个开源的、高性能的C++二维图形渲染库,专注于高质量矢量图形的抗锯齿绘制。它不依赖于特定的显示设备或操作系统,具备高度可移植性,广泛应用于嵌入式系统、工业控制界面及自定义UI框架中。对于短生命周期对象(如vertex_cmd),AGG提供连接自定义内存池,实现O(1)分配:char* pool;配合RAII智能指针,可实现高效且安全的对象生命周期管理。

weixin_42513209的博客 1410

开源2D图形库AGG简介

AGG(Anti-Grain Geometry),强大的2D几何图形库。

pingis58的博客 1284

深入探索AGG开源2D图形绘制引擎

AGG(Anti-Grain Geometry)是一个高性能的开源二维图形绘制引擎,它在图形处理领域因其高效的渲染能力及跨平台兼容性而闻名。AGG特别适合于需要高清晰度图形输出的应用程序,如打印输出、矢量图形编辑器和各种图形用户界面。

weixin_30356433的博客 1294

(转)用AGG实现高质量图形输出(一)

AGG是一个开源、高效的跨平台2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 使用前AGG的准备工作 下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5 解压,后面以[AGG]表示AGG的解压目录. 把[AGG]\include加入到includ...

weixin_30955617的博客 675

2d图形开发库agg

2d图形开发库AGG,跨平台渲染库,C源代码

Anti-Grain Geometry

Anti-Grain Geometry ( AGG ) 是一个用C++编写的2D 渲染图形库。它具有抗锯齿和亚像素分辨率。它本身不是一个图形库,而是一个构建图形库的框架。 该库独立于操作系统并呈现为抽象内存对象。它带有与X Window 系统、Microsoft Windows、Mac OS X、AmigaOS、BeOS、SDL接口的示例。这些示例还包括一个SVG查看器。 AGG 的设计仅在非常高的级别而不是广泛使用 C++ 模板,以实现将自定义类插入渲染管道的灵活性,而不需要严格的类层次结构,并允许编译器内联许多方法调用高性能。对于一个如此复杂的库,它非常轻量级:它没有依赖于标准 C++ 库,并且在基本算法的实现中避免了C++ STL 。然而,隐式接口没有很好的文档记录,这会使学习过程非常麻烦。

在C++Builder里使用AGG库

AGG 库是一个跨平台的2D图形库,全称是“Anti-Grain Geometry”。从名字上就能看出它的特色就是有很好的抗锯齿效果,当然GDI+也有抗锯齿功能,不过GDI+不能跨平台不是?而且有人测试说AGG 比GDI+快10倍以上,虽然有吹牛之嫌,不过比GDI+快是没错的了。 C++Builder用的是VCL库,VCL里的绘图类TCanvas最终调用的是GDI API,所以画的曲线有明显的锯

C++Builder加油站 3405

agg-2.5 AGG是一个开源、高效的跨平台2D图形库

AGG是一个开源、高效的跨平台2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 1.下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5 2.解压,后面以[AGG]表示AGG的解压目录. 3.把[AGG]\include加入到include搜索目录中 4.把[AGG]\src里所有cpp加入到项目中(或者用makefile一起编译) 5.另外,AGG还有一些其它组件,用到时也要把它们(都是些.h和.cpp文件)加入项目: •如果要用AGG的控件和窗体,要加入[AGG]\src\ctrl\*.cpp和[AGG]\src\platform\\*.cpp,头文件在[AGG]\include\ctrl和[AGG]\include\platform里 •如果要用到TrueType字体显示,要加入[AGG]\font_win32_tt目录下的源码和头文件。利用freetype库,则是[AGG]\font_freetype目录。 •如果要用到Generic Polygon Clipper库(一个区域剪裁计算库),加入[AGG]\gpc目录下的源码和头文件。

【亲测免费】 探索未来的图形渲染:Anti-Grain Geometry 图形库

探索未来的图形渲染:Anti-Grain Geometry 图形库 在这个数字时代,高质量的2D图形处理是各种应用的核心,从游戏开发到科学研究,无处不在。让我们一起深入了解Anti-Grain Geometry(AGG)——一个由Maxim Shemanarev编写的C++开源图形库。 项目介绍 AGG是一个无依赖于任何特定图形API或技术的库,它专注于在内存中从矢量数据生成像素图像。这个项目以高...

gitblog_00022的博客 831

AGG图形库资料

保存&分享AGG图形库相关资料,文档+2.5源码

AGG是一个开源、高效的跨平台2D图形库 这是它的离线文档

AGG是一个开源、高效的跨平台2D图形库 这是它的离线文档

介绍和推荐AGG

介绍和推荐AGG    最近在研发跨平台的GIS engine,GDI部分当然不能只用WINDOWS的GDI PLUS,一个跨平台的 2D Engine 的选择就非常重要。网上查了N久,感觉AGG非常全面,效果也很好,而且也是跨平台的。非常适合我的问题领域。   一、AGG是什么      AGG,全名:Anti-Grain Geometry,是一个开源的、

lionzl的专栏 1883

AGG 官方用户手册

1,AGG官方用户手册 2,英文原版 3,精心编辑完整索引 4,mnorst出品,必属佳作

开源2D图形库AGG研究(一)

      AGG(Anti-Grain Geometry),强大的2D几何图形库。因为GDI+的一些缺陷(不能跨平台,某些应用场合精度差),我一直在寻求可以替换gdi+绘图组件的方案,最终我选择了AGG。网上关于2D图形库的组件非常多,类似的还有GOOGLE PICASSO,CAIRO(firefox底层采用的渲染器),QT,OpenGL等等。从易用性的角度来说AGG比较困难,因为官方只给出了C++源代码,没有组件库和封装好的包,其他语言要想直接用是不可能了。从网上关于使用效果的评论来说,AGG是最高效,

阿翔 1万+

agg 开源的、高效的2D图形库

AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,包含在Windows、Wince、Linux台平。 agg的特点 1、支持ALPHA、GAMMA等变色处理,以及用户自定义的变色处理; 2、支持任意2D图形变换; 3、支持SVG和PostScript描述,适于网上图形生成; 4、支持高质量的图形处理,支持反走样插值等高级功能; 5、支持任意方式的惭变色处理; 6、支持所有颜色格式; 7、支持对位图的多种处理; 8、支持直线的多种处理,类似于GDI+; 9、支持GPC,即通用多边形裁剪方法; 10、支持多种字体输出,包括汉字的处理;

PCB工艺-SI9000-模型选择

本文介绍了PCB设计中常用的阻抗计算模型,主要包括外层、内层和嵌入式三类共12种计算模型,涵盖单端/差分、共面等不同场景。针对阻抗计算中的关键参数,文章提供了经验值参考:表层走线厚度0.035mm(1.4mil),内层0.0152mm(0.6mil);并列出常见PP材料的介电常数(3.8-4.5)和成品厚度(3-7.5mil)。作者建议90%的设计问题可通过上述模型解决,层叠参数建议咨询PCB厂家获取。

weixin_50120208的博客 1383

AGG第五课 RGB颜色定义

混合器的存在是为了适应不同平台、不同需求下的不同像素格式。混合器有三种:agg::rgba,agg::rgba8和agg::rgba16,都是用来指定颜色的,rgba每个通道储存为double,rgba8为unsigned char,rgba16为int或long int;混合器起到的作用就像Win32API里的RGB和COLORREF宏。针对agg::rgba特别说...

weixin_33912445的博客 229

Proteus 8.15仿真STM32F103C8,ADC采样总为0?别急着换芯片,先检查这3个配置

本文详细解析了在Proteus 8.15中仿真STM32F103C8时ADC采样值为0的常见原因及解决方法。从供电网络配置、时钟设置到ADC参数调整,提供了系统性的排查指南,帮助开发者快速定位问题,避免不必要的硬件更换。重点关注供电网络、时钟分频和ADC配置等关键环节。

weixin_30425949的博客 366

AGG 插值器(Interpolator)

插值器Interpolator插值器的作用是连接目标位置和源位置,比如要填充一个8*8的图形,对应的填充源是一个4*4的图像,一种简单的线性插值器就要根据目标的位置线性计算得到源对应的位置,如目标点(4,4)、(4,5)、(5,4)、(5,5)这几个位置点对应到源的(2,2)点上。头文件#include #include #include

bitasd的专栏 1099

STM32F4驱动海康工业相机实战:从PWM信号到精准触发拍照(附完整代码)

本文详细介绍了如何使用STM32F4开发板驱动海康工业相机,实现PWM信号精准触发拍照的完整方案。从硬件连接到PWM信号生成,再到相机触发配置与延迟补偿,提供了实战经验和完整代码,帮助开发者解决工业相机硬件触发中的关键问题。

weixin_33716941的博客 694

汽车BMS技术分享及其HIL测试方案

在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的市场接受度。而电池管理系统(Battery Management System, BMS)是动力电池安全运行与性能释放的核心技术支撑。

Speedgoat的博客 2684

Agg图形库来渲染PDF路径对象

今天要做一件事,就是在MFC的Picture Control 上用Agg图形库来渲染一个PDF文件中的路径对象。PDF共有5种图形对象,常用的有路径对象、文本对象、外部对象(XObject),其中路径对象(path object)是最复杂的,它描述了矢量图形,利用矢量图形库将内容渲染在窗口的Picture Control控件上,很有挑战性,实际上这就是一个最简单的矢量图像栅格化的过程。 曾经在媒体上看到过一句话,“PDF是我所见过的最复杂的文件格式”,本人表示认同。用代...

pascadores的专栏 541

UE5接入在线直播视频源,如hls(m3u8)格式

UE5接入在线直播视频源

专注GIS开发 9499
上一篇: js,cookies做悬浮购物车
下一篇: [随便写写]Android基础教程
weixin_30746117
博客等级 码龄11年 103粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值