AGG第四十一课 AGG和GDI渲染字体大小对比

如下是GDI渲染字体的代码:

CClientDC dc(this);

CPen pen(PS_SOLID,3,RGB(0,255,255));

CPen* pOldPen;

pOldPen=dc.SelectObject (&pen);

dc.SelectObject (&pOldPen);

CFont font;

CFont* pOLdFont = NULL;

font.CreatePointFont(10,_T("System"),&dc);

pOLdFont = dc.SelectObject(&font);

dc.SetBkMode(TRANSPARENT);

dc.TextOut(1074 - 100, 800 - 293, _T("A"));

dc.SelectObject(pOLdFont);

font.DeleteObject();

font.CreatePointFont(100,_T("System"),&dc);

pOLdFont = dc.SelectObject(&font);

dc.SetBkMode(TRANSPARENT);

dc.TextOut(1074 - 90, 800 - 280, _T("A"));

dc.SelectObject(pOLdFont);

font.DeleteObject();

结论:发现字体的高度最小为100,设置其他的最小值,字体没有发生改变。

如下是AGG渲染字体大小的代码:

void RenderTestByGsv()

{

agg::rendering_buffer &rbuf = rbuf_window();

agg::pixfmt_bgr24 pixf(rbuf);

typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

renderer_base_type renb(pixf);

typedef agg::renderer_scanline_aa_solid<renderer_base_type> renderder_scanline_type;

renderder_scanline_type rensl(renb);

agg::rasterizer_scanline_aa<> ras;

agg::scanline_u8 sl;

ras.reset();

agg::gsv_text text;

text.text("123ABC");

text.size(10, 8);

text.flip(true);

text.start_point(150,150);

agg::trans_affine mtx;

mtx.reset();

agg::gsv_text_outline<agg::trans_affine> text_p(text, mtx);

text_p.width(1.0);

rensl.color(agg::rgba(0.0, 0.0, 0.0));

ras.add_path(text_p, 0);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

}

邮件原文:

This is going to come off as a smart-ass reply, and I don‘t intend it to be.

If agg doesn‘t work well with small fonts, why not just use GDI in those

cases?  Its easy to have a single buffer that can be operated on by both agg

and gdi.

if (font_height < 10)

{

renderWithGdi()

}

else

{

renderWithAgg()

}

Since I am bothering everybody today, I am wondering about rendering small

true type fonts.

When the font height gets below 10 or so, Windows draws the font with

vectors.  This keeps the characters readable as the font gets smaller.

With AGG I‘m using outlines, and that tends to "smoosh" the characters

together.

I‘ve set the contour width to 0.01, and even 0.0, but when the fonts get

small, the characters Become unreadable.  More so, when displaying Kanji.

What I‘d like to do is to figure out a way to force the glyphs to be drawn

as vector‘s (like GDI).

I want to keep using glyph_ren_outline, as I can rotate and scale the

results nicely.

Any Ideas?

Here is a simple version of code that I use (I removed extra stuff):

//

//  feng is create before as font_engine_win32_tt_int32 // typedef

agg::conv_contour<agg::conv_curve<font_manager_type::path_adaptor_type> >

contour_type; typedef agg::conv_curve<font_manager_type::path_adaptor_type>

curve_type;

typedef agg::font_cache_manager<font_engine_type>

font_manager_type;

font_manager_type       fman(feng);

curve_type               curves(fman.path_adaptor());

contour_type                        contour(curves);

//

// Draw Text Routine

//

agg::rasterizer_scanline_aa<>       ras;

agg::scanline_u8                    sl;

agg::glyph_rendering                gren = agg::glyph_ren_outline;

agg::path_storage                   path;

agg::conv_stroke<agg::path_storage> conv(path);

agg::trans_affine mtx;

mtx *= agg::trans_affine_translation(-x, -y); mtx *=

agg::trans_affine_rotation(-1.0 * rotation ); mtx *=

agg::trans_affine_translation(x, y);

feng.char_set( SHIFTJIS_CHARSET );

if(m_feng.create_font( "MS GOTHIC", gren ))

{

feng.weight( 100 ); // FW_LIGHT == 300

contour.width( 0.01 );

font_trans_type ftrans( contour, mtx );

const char              *pp = pString;

const agg::glyph_cache  *glyph;

while(*pp)

{

if(isJIS(pp))   // Check for Multibtye Japanese String

{

WCHAR   ws[2];

MultiByteToWideChar( 932, 0, pp, 2, ws, sizeof(ws));

glyph = pT->m_fman.glyph(ws[0]);

++pp; // Multi byte

}

else

{

glyph = pT->m_fman.glyph(*pp);

}

pp++;

if(glyph)

{

ras.reset();

ras.add_path(ftrans);

fman.add_kerning(&x, &y);

agg::render_scanlines(ras, sl, ren_aa);

x += glyph->advance_x;

y += glyph->advance_y;

}

}

}

时间: 2024-10-13 20:59:27

AGG第四十一课 AGG和GDI渲染字体大小对比的相关文章

AGG第二十二课 conv_contour函数auto_detect_orientation的字体应用

1 提供如下的代码结构渲染字体 agg::conv_transform<...> conv (path,matrix); agg::conv_curve<...> curve (conv); agg::conv_contour<...> contour(curve); curve.approximaltion_scale (scale); contour.auto_detect_orientation (true); contour.width (bold); 当bol

AGG第三十四课 stroke_aa和outline_aa渲染线段效率对比

1 渲染代码 void TestStrokeAAPerformance() { agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type; renderer_base_type renb(pixf); typedef agg::renderer_scanline_aa

AGG第二十一课 agg::conv_contour 扩展轮廓线

1前言 轮廓线就是图形的边界,任何封闭的顶点源跳过agg::conv_stroke阶段,将会描绘实心的图形,填充的颜色和边界保持一致.如果不封闭的顶点源一旦跳过agg::conv_stroke就什么也不绘制.agg::conv_stroke就是用来描绘图形边界的. 和agg::trans_affine对比可知,agg::conv_contour是扩展图形的轮廓线,通俗一点就是拓展图形的边界,对图形的边界进行放缩(但是和agg::trans_affine仿射变换不同,这是中心位置不变的缩放). 2

AGG第十八课 agg::trans_affine仿射变换

1 affine仿射变换概念 在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射(来自拉丁语,affinis,"和...相关")由一个线性变换接上一个平移组成. 2  agg::trans_affine成员函数说明 2.1 缩放 inline const trans_affine&trans_affine::scale(double x, double y) 参数一对x横坐标的缩放系数,参数二对y纵坐标的缩放系数 这里有一个问题:就是图形的缩放之后,并不是在原有的位置上,

AGG 第十九课 agg::bezier_arc

void DrawCurveOfBezierArc() { agg::rendering_buffer &rbuf = rbuf_window(); agg::pixfmt_bgr24 pixf(rbuf); typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type; renderer_base_type renb(pixf); typedef agg::renderer_scanline_aa_solid<

Windows下使用GetGlyphOutline在OpenGL中渲染字体

欢迎转载,请标明出处:http://blog.csdn.net/tianyu2202/ 无图无JB,先上图.使用OpenGL绘制字体,支持多种字体,支持TrueType轮廓字体,支持自选字体纹理大小和输出大小,支持在三维空间内绘制. 关于OpenGL中字体的显示网上其实有很多的教程,不过经常用到的方式有比较简单的Bitmap方式.比较复杂的FreeType方式.而本文介绍的方式虽然只能在Windows下实现,却有着和FreeType一样的显示效果,最重要的是非常简单,仅仅200多行代码即可实现.

基于SDF渲染字体

18号字体 18号字体放大15倍 基于sdf渲染字体放大15倍 相比常规的渲染方式,基于SDF渲染文字可无限放大并保持清晰,几乎没有开销就可实现描边,发光,抗锯齿等效果.且它只需要很小的纹理缓存SDF信息即可. 所谓SDF(Signed-distance-field),就是将每个像素存储的颜色值换成距离文字轮廓最短距离,当像素在文字内,则用正数距离,在文字外则用负数距离,文字轮廓距离则是零,因此只要判断像素如果是正数,就输出颜色,否则丢弃颜色即可. 该技术由Valve开发半条命2时提出,当时主要

AGG第二十课 agg::ellipse 方法approximation_scale()

献给:任何一种方案都是一种折中的选择,任何一种替代方案都可能会实现同样的效果.而这完全取决于你是如何思考定位的.请教是学,自学是学,只不过可以站在巨人的肩膀上,你可以看的更加清楚或许走的更远. 摘自:http://franko.github.io/agg-intro/vertex-source.html In the previous section we have seen agg::path_storage object. While this object is very flexible

如何解决GDI+渲染图片慢的问题?

项目是做一个画图程序,最近加入了一个图片闪烁的效果,用timer定时每100ms画一遍,每遍通过colormatrix设置不同的alpha值实现(colormatrix几乎不会增加负荷,渲染速度仅增加1ms消耗).效果是没问题,但是效率有问题了.当画一个3000*3000的jpeg图片的时候,debug模式下测试平均需要8ms(graphics的所有参数都设置为速度优先),此时还比较流畅.但是当图片缩小后再画出来就达到35ms左右(通过Gdi.ScaleTransform()进行缩放的),效率明