AGG学习之九----自带gsv_text对象raster方式绘制字符

本文介绍了如何利用AGG库自带的gsv_text对象在raster模式下绘制字符,强调了绘制字符的起始坐标与实际位置的关系,以及计算差值的重要性。同时,提到了gsv_text对象自动处理换行和行间距的特点,但仅支持西文字符,不支持中文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用AGG绘制字符方式有很多种:

  1. 使用AGG自带的 gsv_text 对象;
  2. 使用 WinAPI 字体引擎;
  3. 使用 FreeType 字体引擎;
  4. 使用字体缓存管理器。

首先,我们使用自带的gsv_text对象,在rastser方式下绘制字符。样例代码如下:

#include <agg_pixfmt_rgba.h>
#include <agg_rasterizer_scanline_aa.h>
#include <agg_scanline_p.h>
#include <agg_gsv_text.h>

#include <agg_rendering_buffer.h>
#include <agg_basics.h>
#include <platform/agg_platform_support.h>

class the_application : public agg::platform_support
{
public:
	the_application(agg::pix_format_e format, bool flip_y):
	  agg::platform_support(format,flip_y)
	  {}
	  virtual ~the_application()
	  {
	  }
	  virtual void on_init(){}
	  virtual void on_draw()
	  {
		agg::rasterizer_scanline_aa<> ras;
		agg::scanline_p8 sl; 

		agg::rendering_buffer rbuf = this->rbuf_window();
		agg::pixfmt_rgba32 pixf(rbuf);
		agg::renderer_base<agg::pixfmt_rgba32> renb(pixf);


		// 屏幕清空为白色
		renb.clear(agg::rgba(1, 1, 1, 0));


		// gsv_text类
		agg::gsv_text txt;
		agg::conv_stroke<agg::gsv_text> cstxt(txt);


		txt.flip(false);	// 设置是否反转
		txt.size(30);		// 高、宽
		txt.line_space(10);	// 行间距
		txt.space(5);		// 字符间距


		// 设置位置和文字
		txt.start_point(100,100);
		txt.text("program\nC++");

		cstxt.width(3);					// 线宽
		cstxt.line_cap(agg::butt_cap);	// 线端样式


		// 输出红色绿色文字
		ras.add_path(cstxt);
		agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba(0,1,0));

		// 红色十字定位,中心坐标为(100,100)
		renb.copy_hline( 90, 100, 110, agg::rgba(1, 0, 0, 0) );
		renb.copy_vline( 100, 90, 110, agg::rgba(1, 0, 0, 0) );
	  }
};

int agg_main(int argc, char* argv[])
{
	the_application app(agg::pix_format_rgba32, true);
	app.caption("My AGG Demo");
	if(app.init(320, 200, agg::window_resize ))
	{
		app.run();
	}
	return 1;
}

显示效果:


注意:

  1. 红色十字中心点坐标为(100,100),是绘制字符传入的起始坐标。
  2. 绘制效果图显示,传入的绘制起始坐标点并非是字符实际绘制的外框左上角点或左下角点。
  3. 所以,如果需要在指定位置绘制字符,则需要预先精确计算绘制实际位置、传入绘制坐标之间的差值。
  4. gsv_text对象,自动处理了换行。
  5. gsv_text对象,虽然可以设定行间距,带行间距并未减除字符边线的宽度,需要开发者注意计算。
  6. gsv_text仅能处理西文字符,无法处理中文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值