AGG 字体缓存管理器

方式三、使用字体缓存管理器

每次都重新读字模是很费时的,比如前面的例子,"C++" 里的两个'+' 就读两次字模,效率可以想象。

一个好的办法是把已读出来的字模缓存起来,下次再遇到这个字时就不用从字体引擎里读取了,AGG提供的font_cache_manager类就是 负责这项工作的。

头文件
  1. #include "agg_font_cache_manager.h"    
类型
  1. template<class FontEngine> class font_cache_manager;

模板参数FontEngine指定管理器所用的字体引擎。另外构造参数也是FontEngine。

成员方法
const glyph_cache* glyph(unsigned glyph_code);获得字模并缓存,glyph_cache类的定义是:
struct glyph_cache
{
 unsigned glyph_index;
 int8u* data;
 unsigned data_size;
 glyph_data_type data_type;
 rect_i bounds;
 double advance_x;
 double advance_y;
};
path_adaptor_type&   path_adaptor();字体引擎的path_adaptor_type实例
gray8_adaptor_type& gray8_adaptor();
gray8_scanline_type& gray8_scanline();
字体引擎的gray8_adaptor_type实例以及对应的Scanline
mono_adaptor_type&   mono_adaptor();
mono_scanline_type& mono_scanline();
字体引擎的mono_adaptor_type实例以及对应的Scanline
void init_embedded_adaptors(const glyph_cache* gl,
                            double x, double y,
                            double scale=1.0);
初始化上面的adaptor成员实例(与字体引擎的ren_type设置相关)
bool add_kerning(double* x, double* y);调整坐标
示例代码1-作为Rasterizer渲染:
显示效果

agg::font_engine_win32_tt_int16 font(dc);
agg::font_cache_manager<
agg::font_engine_win32_tt_int16
> font_manager(font);
font.height(72.0);
font.width(0);
font.italic(true);
font.flip_y(true);
font.hinting(true);

font.transform(agg::trans_affine_rotation(agg::deg2rad(4.0)));
font.create_font("宋体",agg::glyph_ren_agg_gray8);

double x=10, y=72; //起始位置
wchar_t *text = L"C++编程网";
// 画所有字符
for(;*text;text++)
{
 //取字模
 const agg::glyph_cache* glyph = font_manager.glyph(*text);
 if(glyph)
 {
  // 初始化gray8_adaptor实例
  font_manager.init_embedded_adaptors(glyph, x, y);

  agg::render_scanlines_aa_solid(font_manager.gray8_adaptor(),
   font_manager.gray8_scanline(),
   renb, agg::rgba8(0, 0, 0));

  // 前进
  x += glyph->advance_x;
  y += glyph->advance_y;
 }
}

示例代码2-作为顶点源渲染:
typedef agg::font_engine_win32_tt_int16 fe_type;
fe_type font(GetDC(0));
typedef agg::font_cache_manager<fe_type> fcman_type;
fcman_type font_manager(font);
font.height(72.0);
font.width(0);
font.italic(true);
font.flip_y(true);
font.hinting(true);
font.transform(agg::trans_affine_rotation(agg::deg2rad(4.0)));
font.create_font("宋体",agg::glyph_ren_outline);
double x=10, y=72; //起始位置
wchar_t *text = L"C++编程网";
// 画所有字符
for(;*text;text++)
{
 const agg::glyph_cache* glyph = font_manager.glyph(*text);
 if(glyph)
 {
  // 准备*_adaptor
  font_manager.init_embedded_adaptors(glyph, x, y);
  // 先用conv_curve
  typedef agg::conv_curve<
   fcman_type::path_adaptor_type
  > cc_pa_type;
  cc_pa_type ccpath(font_manager.path_adaptor());
  // 画轮廓
  typedef agg::conv_stroke<cc_pa_type> cs_cc_pa_type;
  cs_cc_pa_type csccpath(ccpath);
  agg::rasterizer_scanline_aa<> ras;
  agg::scanline_u8 sl;
  ras.add_path(csccpath);
  agg::render_scanlines_aa_solid(ras, sl, renb, agg::rgba8(0, 0, 0));
  // 前进
  x += glyph->advance_x;
  y += glyph->advance_y;
 }
}
显示效果

本 PPT 介绍了制药厂房中供配电系统的总体概念与设计要点,内容包括: 洁净厂房的特点及其对供配电系统的特殊要求; 供配电设计的一般原则与依据的国家/行业标准; 从上级电网到工厂变电所、终端配电的总体结构与模块化设计思路; 供配电范围:动力配电、照明、通讯、接地、防雷与消防等; 动力配电中电压等级、接地系统形式(如 TN-S)、负荷等级与可靠性、UPS 配置等; 照明的电源方式、光源选择、安装方式、应急与备用照明要求; 通讯系统、监控系统在生产管理与消防中的作用; 接地与等电位连接、防雷等级与防雷措施; 消防设施及其专用供电(消防泵、排烟风机、消防控制室、应急照明等); 常见高压柜、动力柜、照明箱等配电设备案例及部分设计图纸示意; 公司已完成的典型项目案例。 1. 工程背景与总体框架 所属领域:制药厂房工程的公用工程系统,其中本 PPT 聚焦于供配电系统。 放在整个公用工程中的位置:与给排水、纯化水/注射用水、气体与热力、暖通空调、自动化控制等系统并列。 2. Part 01 供配电概述 2.1 洁净厂房的特点 空间密闭,结构复杂、走向曲折; 单相设备、仪器种类多,工艺设备昂贵、精密; 装修材料与工艺材料种类多,对尘埃、静电等更敏感。 这些特点决定了:供配电系统要安全可靠、减少积尘、便于清洁和维护。 2.2 供配电总则 供配电设计应满足: 可靠、经济、适用; 保障人身与财产安全; 便于安装与维护; 采用技术先进的设备与方案。 2.3 设计依据与规范 引用了大量俄语标准(ГОСТ、СНиП、SanPiN 等)以及国家、行业和地方规范,作为设计的法规基础文件,包括: 电气设备、接线、接地、电气安全; 建筑物电气装置、照明标准; 卫生与安全相关规范等。 3. Part 02 供配电总览 从电源系统整体结构进行总览: 上级:地方电网; 工厂变电所(10kV 配电装置、变压
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值