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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

            }

        }

    }


以上是关于AGG第四十一课 AGG和GDI渲染字体大小对比的主要内容,如果未能解决你的问题,请参考以下文章

wxWidgets第十七课 采用AGG渲染库

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

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

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

AGG第四十八课 抗锯齿说明一

AGG第四十九课 抗锯齿的算法理论