AGG第四十一课AGG和GDI渲染字体大小对比-创新互联

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

创新互联长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为肇州企业提供专业的做网站、网站制作,肇州网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

 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 renderer_base_type;

  renderer_base_type renb(pixf);

  typedef agg::renderer_scanline_aa_solid 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 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 >

contour_type; typedef agg::conv_curve

curve_type;

typedef agg::font_cache_manager

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 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;

      }

    }

  }

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:AGG第四十一课AGG和GDI渲染字体大小对比-创新互联
转载注明:http://scyanting.com/article/cedhes.html